Google 在 Android 文档里的《What is Android》章节中,明确提出:
The Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
《深入 Java 虚拟机》一书的读者应该清楚,广义的 Java 概念其实包含了 Java Programming Language、Java API、Java Runtime Environment 等。相较之下,Android 的 Java 的概念就非常狭隘了,上面的表述只是说 Android 使用 Java 编程语言,遵从其语法而已。同理,Dalvik virtual machine 和通常的 JVM 也就有着诸多差异,由于对 Java Virtual Machine Specification 了解不多,这里不进行具体的比较。
虽然 JVM 载入的是 .class 文件,而 Dalvik 是 .dex 文件,两者格式虽有不同,但是从 Virtual Machine 的角度来看,二者都是 类(class) 的载体,都免不了被 ClassLoader 载入,构成一个个的类(class)。前文分析了 class loading 的机理,那么在本文就来探索下 Android 下的 class loading。
在类(class)及其方法(method)被载入到内存以后,就会获得一个惟一的标示符。这个惟一的标示符实质上是 java.lang.Class 的一个实例(instance),假定类的名称为 MyObject,那么可以通过 MyObject.class 来访问这个标示符,–注意这里不是指 .class 文件。而对于已经创建的对象,则可以通过 object.getClass()来获取标示符。
反过来考虑,每一个 java.lang.Class 对象总会有一个类装载器(java.lang.ClassLoader),通过 getClassLoader() 即可获取。依据这个原理,接下来来追踪 Android 中一个普通的 Activity 的类装载器。
public class AndroidClassLoaderActivity extends Activity {
private static final String TAG = "AndroidClassLoaderActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ClassLoader loader = AndroidClassLoaderActivity.this.getClassLoader();
Log.d(TAG, loader.getClass().getName());
}
}
由 Logcat 的输出可以知道,这个 classloader 即是 dalvik.system.PathClassLoader。首先查看这个类的注释:
Provides a simple ClassLoader implementation that operates on a list of files and directories in the local file system, but does not attempt to load classes from the network. Android uses this class for its system class loader and for its application class loader(s).
注释后半部表明了它的身份:system class loader and application class loader。到这里,问题的入口貌似已经呈现了。
分享到:
相关推荐
首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code ...
1: pathClassloader: Android 用来加载系统文件 和 应用的主文件 2: DexClassloader: Android 用来加载 jar/apk/dex 文件 3: URLClassloader: 可以加载java的jar包,但是Dalvik 虚拟机不支持这种加载方式
java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang.System...
08-13 18:29:22.924: E/AndroidRuntime(1875): Caused by: Java.lang.ClassNotFoundException:XXXXX in loader dalvik.system.PathClassLoader[/data/app/XXXX.apk] 我想大家经常因为疏忽出现...
AndroidRuntime: java.lang.UnsatisfiedLinkError: Couldn’t load airtalkee from loader dalvik.system.PathClassLoader[DexPathList[[zip file “/system/app/POCM3A.apk”, zip file “/data/data/com.cmccpo
本文源码为:android11_r1 系统源码:android.app.LoadedApk#makeApplication getClassLoader内部流程过于复杂,感兴趣的自己去跟一下,简单点概括:根据ApplicationInfo中的信息,最终生成并返回PathClassloader ...
报:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xxx.xxxxx.xxx/base.apk"],nativeLibraryDirectories=[/data/app/xxx.xxxxx.xxx/lib/arm64, /vendor/lib64, ...
看完这段视频之后,按照步骤执行总报出异常:Caused by: java.lang.ClassNotFoundException: com.map.Google_MapViewActivity in loader dalvik.system.PathClassLoader[/data/app/com.map-2.apk],经核查资料,确定...
java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang....
用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。
我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认的类加载器,PathClassLoader其实实现的就是简单的从文件系统中加载类...
关于动态加载apk,理论上可以用到的有DexClassLoader,PathClassLoader和URLClassLoader; plugin 原理是通过 Android API 中的 pm 包下 和 res 包下 类 import android.content.pm.PackageInfo; import android....
有时,在使用本机库时,您会遇到这样的堆栈跟踪:java.lang.UnsatisfiedLinkError:无法从加载程序dalvik.system.PathClassLoader加载stlport_shared:findLibrary在java.lang.Runtime.loadLibrary(Runtime.java: ...
Android studio so库找不到问题解决办法 问题: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[ zip file /data/app/com.bb.aaaa.nfcandimg-1/base.apk, zip file /data/app/...
java类加载修改源码欢迎任何拉取请求。...使用了相同的原理(pathClassLoader、dexElement)。 皮肤 其他 一个像浏览器一样运行的插件系统,但它不是加载网页,而是加载在 Android 系统上本地运行的插件。 A
NULL 博文链接:https://jameskaron.iteye.com/blog/2291495
Android中类加载器有BootClassLoader,URLClassLoader, PathClassLoader,DexClassLoader,BaseDexClassLoader,等都最终继承自java.lang.ClassLoader 最近在优化西瓜视频客户端冷启动速度时,发现在关闭插件 ...
loadLibrary msc error:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/...在buidl.gradle(module:app)下的android{ defaultConfig {
Android进阶学习知识逻辑 在整理过程中发现,所有的博客,网课,视频等都或多或少照搬已经出版的经典书籍,那不如从看书开始,自己总结自己记忆,避免阅读别人总结后的观点形成知识偏差。如果你有幸看到,希望你也能...