Android插件化开发 第二篇 [动态加载apk优化]
来源:互联网 发布:cacti添加linux主机 编辑:程序博客网 时间:2024/06/08 18:00
引言
上篇文章我们有提到过ClassLoader类加载器,通过学习了解到系统提供的类加载器有 PathClassLoader和 DexClassLoader两种。它们的不同之处是:
- PathClassLoader只能加载系统/data/data/包名目录下的apk;
- DexClassLoader可以加载jar/apk/dex,可以从SD卡中加载的apk;
当Android应用开启的时候会创建一个PathClassLoader用来加载自己apk中的类,上篇文章中我们使用的installBundleDexs方法也就是将插件化apk的类加载到App的PathClassLoader中。文章末尾提到过两个问题:
- Dex加载与系统版本密切相关,可能导致新版本系统无法加载。
- 到当插件化apk体积的增大,方法数的增多势必导致加载漫长。网上的一种观点认为当同一个ClassLoader中的方法数增多,会导致findClass时间变长,从而影响到查找速度。
本篇通过使用DexClassLoader来优化这两个问题。
Demo创建
修改AssetsDexLoader.java中的加载方法为:
private static List<DexClassLoader> bundleDexClassLoaderList = new ArrayList<DexClassLoader>();private static void installBundleDexs(ClassLoader loader, File dexDir, List<File> files) { if (!files.isEmpty()) { for (File f : files) { DexClassLoader bundleDexClassLoader = new DexClassLoader( f.getAbsolutePath(), dexDir.getAbsolutePath(), null, loader); bundleDexClassLoaderList.add(bundleDexClassLoader); } }}
新增Class获取方法:
public static Class<?> loadClass(String className) throws ClassNotFoundException { try { Class<?> clazz = Class.forName(className); if (clazz != null) { System.out.println("debug: class find in main classLoader"); return clazz; } } catch (Exception e) { e.printStackTrace(); } for (DexClassLoader bundleDexClassLoader : bundleDexClassLoaderList) { try { Class<?> clazz = bundleDexClassLoader.loadClass(className); if (clazz != null) { System.out.println("debug: class find in bundle classLoader"); return clazz; } } catch (Exception e) { e.printStackTrace(); } } throw new ClassCastException(className + " not found exception");}
[Demo可参考这里]
讲解
用插件化apk直接创建系统的DexClassLoader,反射调用的时候先检查PathClassLoader中是否存在,如果不存在就在DexClassLoader list中查找。
总结
使用DexClassLoader代替PathClassLoader除了可以解决Dex加载与系统版本密切问题之外,还可以将第三方apk复制到外置SD卡上减少应用安装后的体积。至于网上流传的观点拆分ClassLoader能提高findClass效率并不知道是否真实。不过总的来说用DexClassLoader代替PathClassLoader确实更为妥当。
所以轻量级插件化开发更适合使用DexClassLoader来实现。
下一篇我们会学习插件化开发如何共享使用资源。
文/H3c(简书作者)
原文链接:http://www.jianshu.com/p/900f763e99fa
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/900f763e99fa
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0 0
- Android插件化开发 第二篇 [动态加载apk优化]
- Android插件化开发 第二篇 [动态加载apk优化]
- Android优化之插件开发(动态加载Apk)
- Android插件化开发 第一篇 [动态加载apk]
- Android插件化开发 第一篇 [动态加载apk]
- Android动态加载插件APK
- 使用Apk动态加载框架(dynamic-load-apk)进行插件开发之环境搭建篇
- 插件化的基石 -- apk动态加载
- 插件化-apk动态加载
- 插件化开发—动态加载技术加载已安装和未安装的apk
- 插件化开发—动态加载技术加载已安装和未安装的apk
- 插件化开发—动态加载技术加载已安装和未安装的apk
- 插件化开发—动态加载技术加载已安装和未安装的apk
- 插件化开发—动态加载技术加载已安装和未安装的apk
- android动态加载apk
- android动态加载apk
- Android 动态加载 APK
- 插件化开发-动态加载
- 剑指offer——面试题3:二维数组中的查找
- 植物大战僵尸外挂源码【C语言制作】
- Android第一例
- Java排序--插入排序
- 用2个栈实现队列
- Android插件化开发 第二篇 [动态加载apk优化]
- spring-boot研究三:springboot+mybatis+mysql多数据源配置
- 【NOIP2016提高A组模拟8.14】总结
- 安装findbugs
- LeetCode 69. Sqrt(x)
- 关于Android GC的一些理解
- js正则验证0~1之间数字的方法。可以为小数,0和1
- learn word2vector from scratch -- part 2
- iOS从入门开发系列01 (UI基础控件)