Android动态加载一
2016-02-29 17:09
357 查看
android上使用动态加载的方案已经有不少开源的框架出来了,这种方式虽然不是官方倡导的方式,但是使用动态加载能解决很多问题,所以也备受开发者的青睐,虽然不是所有软件都需要使用动态加载,但是当你的软件复杂度达到一定量级,动态加载可能是一种比较优雅的解决问题的方式,下面就粗浅说说我理解的动态加载。
效果类似于eclipse的各种插件,可以自由更新和修改,是不是听起来挺爽的。
使用到的类:
DexClassLoader :可以加载文件系统上的jar、dex、apk
PathClassLoader :可以加载/data/app目录下的apk,这也意味着,它只能加载已经安装的apk;
关键类:
1.ProxyActivity:宿主中的代理类,用来放动态加载类的容器;
2.BaseActivity:动态加载类的基类,用于实现和ProxyActivity代理类的一些特殊方法的;
加载的核心代码:
demo下载
主工程编译速度提升(因为代码量减少);
启动速度提升;
减小主包大小,按需下载;
避免dex瓶颈(65535方法数上限);
动态更新应用;
需要解决的问题:
资源的访问;
类的加载;
生命周期的管理;
数据库支持;
so文件支持;
大部分问题都已经有解决方式了,我理解的比较粗浅,下面介绍几个牛X的开源框架;
2.DLAPK Github地址 博客地址
3.android-pluginmgr GitHub地址 博客地址
其他介绍的文章:
1.携程Android App插件化和动态加载实践
2.再议携程Android动态加载框架DynamicAPK
3.QQ空间团队安卓App热补丁动态修复技术介绍
欢迎拍砖,如果你觉得对已有帮助,请不要吝啬的你
原理:
动态加载,其实就是用一个已经安装好的apk作为宿主,然后动态配置另外一些比较独立的功能模块,利用宿主,不需要再安装新的功能模块的apk,而能加载到现在宿主中展示的方案;效果类似于eclipse的各种插件,可以自由更新和修改,是不是听起来挺爽的。
使用到的类:
DexClassLoader :可以加载文件系统上的jar、dex、apk
PathClassLoader :可以加载/data/app目录下的apk,这也意味着,它只能加载已经安装的apk;
关键类:
1.ProxyActivity:宿主中的代理类,用来放动态加载类的容器;
2.BaseActivity:动态加载类的基类,用于实现和ProxyActivity代理类的一些特殊方法的;
加载的核心代码:
/** * 利用ClassLoader,DexClassLoader和反射将apk中的界面启动 * @param mDexPath apk 动态加载的apk本地路径 * @param className 要打开的动态加载类的类名 */ protected void launchTargetActivity(String mDexPath,String className) { //加载动态目标的dex File dexOutputDir = this.getDir("dex", 0); final String dexOutputPath = dexOutputDir.getAbsolutePath(); ClassLoader localClassLoader = ClassLoader.getSystemClassLoader(); DexClassLoader dexClassLoader = new DexClassLoader(mDexPath, dexOutputPath, null, localClassLoader); try { //利用dexClassLoader获取到动态类 Class<?> localClass = dexClassLoader.loadClass(className); Constructor<?> localConstructor = localClass.getConstructor(new Class[] {}); Object instance = localConstructor.newInstance(new Object[] {}); //利用反射机制获取到设置代理Activity的方法 Method setProxy = localClass.getMethod("setProxy",new Class[] { Activity.class }); setProxy.setAccessible(true); setProxy.invoke(instance, new Object[] { this }); //利用反射机制调用onCreate方法 Method onCreate = localClass.getDeclaredMethod("onCreate",new Class[] { Bundle.class }); onCreate.setAccessible(true); onCreate.invoke(instance, new Object[] { null }); } catch (Exception e) { e.printStackTrace(); } }
demo下载
动态加载优点和问题:
优点:主工程编译速度提升(因为代码量减少);
启动速度提升;
减小主包大小,按需下载;
避免dex瓶颈(65535方法数上限);
动态更新应用;
需要解决的问题:
资源的访问;
类的加载;
生命周期的管理;
数据库支持;
so文件支持;
大部分问题都已经有解决方式了,我理解的比较粗浅,下面介绍几个牛X的开源框架;
开源框架:
1.DynamicAPK(携程)Github地址2.DLAPK Github地址 博客地址
3.android-pluginmgr GitHub地址 博客地址
其他介绍的文章:
1.携程Android App插件化和动态加载实践
2.再议携程Android动态加载框架DynamicAPK
3.QQ空间团队安卓App热补丁动态修复技术介绍
欢迎拍砖,如果你觉得对已有帮助,请不要吝啬的你
相关文章推荐
- Android 自定义View (二) 进阶
- android 存储目录
- Android抽象布局——include、merge 、ViewStub
- Android开发常用命令行
- Android studio(1.4.1) NDK开发
- Android应用中实现选择本地文件与目录的实例分享
- Android事件传递机制
- Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码
- android动态换肤系列3——从apk文件中获取Resources对象(上)
- Android Studio学习总结
- 关于androidannotations(注解)的理解和使用(文档篇)
- android BaseAdapter 自定义适配器 BaseAdapter基类抽取 一
- 你百度不到的android坑 imageview.setimageDrawable和setbackgroundDrawable
- Android中View的滑动冲突——Android开发艺术探索笔记
- fresco 导致的无法加载 so 问题(Android studio)
- Android系统对话框
- Android系统对话框
- android studio .9图片的制作
- Android:实用的Text工具方法
- android 所有焦点问题汇总【Focus】