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。到这里,问题的入口貌似已经呈现了。
分享到:
相关推荐
3. **双亲委托模型**:Android的类加载器遵循Java的双亲委托模型,即先尝试从父类加载器中加载类,只有当父类加载器无法找到对应类时,才会尝试从当前类加载器加载。这确保了类的唯一性,防止了不同加载器加载相同类...
在Android开发中,动态加载Class是一项重要的技术,它允许应用程序在运行时加载未知或更新的类,从而提高软件的灵活性和可扩展性。这在处理插件化、热修复或者模块化开发时尤为常见。本篇文章将深入探讨如何在...
1: pathClassloader: Android 用来加载系统文件 和 应用的主文件 2: DexClassloader: Android 用来加载 jar/apk/dex 文件 3: URLClassloader: 可以加载java的jar包,但是Dalvik 虚拟机不支持这种加载方式
本篇将详细解释如何在Android中实现动态加载类,主要涉及两种ClassLoader:DexClassLoader和PathClassLoader。 首先,理解Android与Java平台在加载类上的差异至关重要。由于Android的Dalvik虚拟机(Dalvik Virtual ...
在Android平台上,插件化开发是一种先进的技术,它允许开发者将应用的部分功能模块化,以插件的形式动态加载,从而实现灵活的更新和扩展。"Android 插件Demo"是对此技术的一个实例演示,其中的关键在于`android:...
这个测试demo是为了帮助开发者深入理解Android中两种主要的类加载器:DexClassLoader和PathClassLoader的工作原理以及它们之间的区别。 1. **类加载器基础** 类加载器在Java和Android中都遵循"双亲委派模型"。这个...
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] 我想大家经常因为疏忽出现...
- **定义**:Android是一种基于Linux内核的操作系统,主要用于移动设备,如智能手机和平板电脑。 #### 四、Android DVM与进程的关系 **知识点5:DVM与进程的关系** - **定义**:DVM(Dalvik Virtual Machine)是指...
- **多Dex支持**:Android原生支持多个.dex文件,但也有数量限制,超过后需要处理MultiDex问题。 - **兼容性处理**:对于Android的不同版本,可能需要不同的加载策略,比如针对早期版本的Dalvik和后期的ART。 - **类...
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
在Android系统中,主要有三种类加载器:BaseDexClassLoader、PathClassLoader和 DexClassLoader。BaseDexClassLoader是基础类加载器,PathClassLoader用于加载APK内部的类,而DexClassLoader则可以加载外部的dex文件...
报: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, ...
2. 加载.dex到 DexClassLoader:Android提供了DexClassLoader类,可以用来加载外部的.dex文件。创建一个DexClassLoader实例,传入.dex文件路径,以及父类加载器(通常是PathClassLoader)。 3. 实例化类并调用方法:...
BootstrapClassLoader加载系统的预置类,PathClassLoader处理APK中的.class文件或.dex文件,DexClassLoader则用于加载外部的dex文件,如库或者插件。 **4. ART(Android Runtime)与Dalvik的区别** 随着Android版本...
1. **动态加载机制**:Android系统通过`DexClassLoader`来加载`.dex`文件,插件化就是利用这一点,将功能模块打包成单独的APK(称为插件),在运行时通过自定义的类加载器加载到主应用中。 2. **进程通信**:插件与...
在Android应用程序中,热更新是指在不需要重新编译和安装应用程序的情况下,能够动态地更新应用程序的功能和bug修复。Robust是一种热更新解决方案,它可以实现Android应用程序的热更新。下面是对Robust热更新产品化...
在Android系统中,Dalvik虚拟机(或者对于新版本的Android,ART)是负责执行.dex(Dalvik Executable)文件的。这些.dex文件包含了应用程序的所有类和方法,通常在安装应用时被转换并存储在设备的文件系统中。然而,...
在实际操作中,我们可能需要创建自定义的ClassLoader子类,如DexClassLoader,它继承自PathClassLoader,并重写findClass()方法,以实现对.dex文件的加载。然后,通过ClassLoader的loadClass()方法,我们可以动态地...
在Android环境中,主要使用的`ClassLoader`有`PathClassLoader`和`DexClassLoader`。 1. **`PathClassLoader`**: - 继承自`BaseDexClassLoader`。 - 主要用于应用程序本身的类加载。 2. **`DexClassLoader`**: ...