`
liujianguangaaa
  • 浏览: 231060 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Class loading in Android : Begin with PathClassLoader

阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics