您的位置:首页 > 移动开发 > Android开发

Android动态加载一

2016-02-29 17:09 357 查看
android上使用动态加载的方案已经有不少开源的框架出来了,这种方式虽然不是官方倡导的方式,但是使用动态加载能解决很多问题,所以也备受开发者的青睐,虽然不是所有软件都需要使用动态加载,但是当你的软件复杂度达到一定量级,动态加载可能是一种比较优雅的解决问题的方式,下面就粗浅说说我理解的动态加载。

原理:

动态加载,其实就是用一个已经安装好的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热补丁动态修复技术介绍

欢迎拍砖,如果你觉得对已有帮助,请不要吝啬的你
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: