您现在的位置是:首页 > 文章详情

Android 插件开发--类加载器

日期:2018-06-26点击:316
1). Android中类加载器

Android 中常用的类加载器有DexClassLoader和PathClassLoader,其中PathClassLoader是Android应用中的默认加载器。

  • DexClassLoader可以加载任何路径下的apk/dex/jar/zip
  • PathClassLoader只能加载/data/app中的apk,也就是已经安装在手机中的apk。
2). DexClassLoader

构造方法:

 public DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent) ; 

其中:

  • 继承自BaseDexClassLoader
  • dexPath: 加载apk/dex/jar/zip的路径
  • optimizedDirectory: 是dex的输出路径
  • librarySearchPath: 加载时候需要用到的lib库,一般不用
  • parent: DexClassLoader指定的父加载器
3). PathClassLoader

构造方法:

public PathClassLoader(String dexPath, ClassLoader parent); public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent); 

其中

  • 继承自BaseDexClassLoader
  • dexPath: 加载dex路径
  • librarySearchPath: 加载时候需要用到的lib库
  • parent: PathClassLoader指定的父加载器
  • dex释放路径: /data/dalvik-cache
4). 查看各种类加载器
 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); printMoreClassLoader(); } private static final String TAG = "MainActivity"; /** * 打印各种类加载器 */ private void printMoreClassLoader() { Log.d(TAG, "Context类的类加载器:" + Context.class.getClassLoader()); Log.d(TAG, "ListView类的类加载器:" + ListView.class.getClassLoader()); Log.d(TAG, "应用程序默认的类加载器:" + getClassLoader()); Log.d(TAG, "系统类加载器:" + ClassLoader.getSystemClassLoader()); Log.d(TAG, "系统类加载器和Context类的类加载器是否相等:" + (Context.class.getClassLoader() ==ClassLoader.getSystemClassLoader())); Log.d(TAG, "系统类加载器和应用程序默认加载器是否相等:" + (getClassLoader() == ClassLoader.getSystemClassLoader())); Log.d(TAG, "================================================"); Log.d(TAG, "打印应用程序默认加载器的委派机制:"); ClassLoader classLoader = getClassLoader(); while (null != classLoader) { Log.d(TAG, "类加载器: " + classLoader); classLoader = classLoader.getParent(); } Log.d(TAG, "================================================"); Log.d(TAG, "打印系统加载器的委派机制:"); classLoader = ClassLoader.getSystemClassLoader(); while (null != classLoader) { Log.d(TAG, "类加载器:" + classLoader); classLoader = classLoader.getParent(); } } 

打印结果:

Context类的类加载器:java.lang.BootClassLoader@8b6e11e ListView类的类加载器:java.lang.BootClassLoader@8b6e11e 应用程序默认的类加载器:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mazaiting.dynamicjar-2/base.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.mazaiting.dynamicjar-2/lib/arm64, /system/lib64, /vendor/lib64]]] 系统类加载器:dalvik.system.PathClassLoader[DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /vendor/lib64, /system/lib64, /vendor/lib64]]] 系统类加载器和Context类的类加载器是否相等:false 系统类加载器和应用程序默认加载器是否相等:false ================================================ 打印应用程序默认加载器的委派机制: 类加载器: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mazaiting.dynamicjar-2/base.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.mazaiting.dynamicjar-2/lib/arm64, /system/lib64, /vendor/lib64]]] 类加载器: java.lang.BootClassLoader@8b6e11e ================================================ 打印系统加载器的委派机制: 类加载器:dalvik.system.PathClassLoader[DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /vendor/lib64, /system/lib64, /vendor/lib64]]] 类加载器:java.lang.BootClassLoader@8b6e11e 
原文链接:https://yq.aliyun.com/articles/663291
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章