为了完成类的加载, Android平台目前提供了两类ClassLoader, 分别为 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader, 主要区别在于后者不需要指定用于保存优化结果的缓存目录, 但由于在Dalvik虚拟机下dexopt是强制执行的, 故而只支持加载系统类或已安装的app, 因为可从
dalvik-cache缓存目录中直接读取到相应的优化文件, ART下dex2oat支持回退, 故而也可加载未安装的文件, 从而没有了Dalvik下的限制; 前者 DexClassLoader 则需要额外指定一个可写的
私有缓存目录, 支持加载任意本地 .dex文件以及包含 .dex 的 .apk、.jar、.zip文件。
此外, Android平台的ClassLoader同样具有双亲委派特性, 在加载类前, 会先检查父加载器是否已经加载过同一个类, 利用这些特性我们可以轻易实现 .dex 的动态分包加载。
#pragma once
#include <jni.h>
#ifndef __selectany
# define __selectany __attribute__((weak))
#endif // __selectany
//-------------------------------------------------------------------------
class DexClassLoader
{
// dalvik/system/DexClassLoader
static jclass clsDexClassLoader_;
static jmethodID loadClass_;
static jmethodID constructor_;
// android/content/Context
static jmethodID getClassLoader_;
// java/lang/ClassLoader
static jcl