Class loading in Android : Begin with PathClassLoader

本文深入探讨了Android平台上的类加载机制,详细介绍了Dalvik虚拟机与Java虚拟机之间的区别,以及Android系统如何使用Dalvik系统类加载器(PathClassLoader)加载类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。到这里,问题的入口貌似已经呈现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值