转载地址:http://blog.csdn.net/hwpjiayou/article/details/50594489
一:为什么要组件化
1. 大多数朋友开始接触这个问题是因为 App 爆棚了,方法数超过了一个 Dex 最大方法数 65535 的上限。
2. 数据包越来越大。
3. 功能业务增加删减不灵活。
4. 动态改变资源文件。eg 主题
5. 模块耦合度大。
6. 升级不灵活,每次都需要验证。
7. 内存占用率高。
8. 流浪消耗大。
9. 并行开发效率低。
二:如何解决
- 传统的方式是发包执行更新操作。每次发包的周期时间因素重。
- H5代替。
google multidex。(解决dex数过大问题ApI21)
android-support-multidex.jar 使用说明: 3.1. 从sdk\extras\android\support\multidex\library\libs 目录将android-support-multidex.jar导入工程中 3.2. 如果你的工程中已经含有Application类,那么让它继承android.support.multidex.MultiDexApplication类, 3.3.如果你的Application已经继承了其他类并且不想做改动,那么还有另外一种使用方式,覆写attachBaseContext()方法: 3.4 eg
public class MyApplication extends FooApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
删减无用代码。
- 购买付费的proguard。
- 重构
- components loader
三:插件开发
项目地址:https://github.com/houkx/android-pluginmgr/blob/master/README.md
1:如何使用:
2:如何构建:
3:目前支持
a normal apk is regard as plug-in
start activity from plug-in
start other activiy from plug activity
plug activity with theme
plug with custom Application
plug with .so
support android2.x
4:技术说明:
4.1 反射方式执行java代码,通常执行操作。
4.2 利用 Java ClassLoader 的原理。Java ClassLoader基础
4.3 android jvm读取为dex 文件,
java ---- class ---- dex
故在执行方式中需将java文件转换为dex文件 ,android提供了 DexClassLoader,PathClassLoader,URLClassLoader
使用方法: DexClassLoader pluginClassLoader = new DexClassLoader(dexPath, optimizedDirectory, libraryPath, parentClassLoader);
dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader,区别在于 PathClassLoader 不能直接从 zip 包中得到 dex,因此只支持直接操作 dex 文件或者已经安装过的 apk(因为安装过的 apk 在 cache 中存在缓 存的 dex 文件)。而 DexClassLoader 可以加载外部的 apk、jar 或 dex文件,并且会在指定的 outpath 路径存放其 dex 文件。
URLClassLoader:可以加载java中的jar,但是由于dalvik不能直接识别jar,所以此方法在android中无法使用,尽管还有这个类
4.4 目前可以解决的loader方式有:
R文件,android基础组件,value,xml,注册问题,生命周期管理问题。数据访问,jar包,so库载入。
4.5 存在问题有:
1:权限问题声明需在宿主对象中及如果在应用的apk中使用了主apk不支持的权限不能正常使用。
2:广播动态注册ok,再manifest中注册无效。
3:so类库的加载需要声明在住apk中。
4:
4.6 执行方式:
开发 > android组件化 > image2016-1-28 10:59:6.png
四:开源项目
1. 360 DroidPlug 组件化公司 http://www.apkplug.com/
2. https://github.com/singwhatiwanna/dynamic-load-apk
3. DL方式做法:
activity的工作主要是由ContextImpl来完成的, activity中是一个叫做mBase的成员变量。注意到Context中有如下两个抽象方法,实际上context就是通过它们来获取资源的,这两个抽象方法的真正实现在ContextImpl中。也即是说,只要我们自己实现这两个方法,就可以解决资源问题了。
``` python
public abstract AssetManager getAssets();
public abstract Resources getResource();
五:相关:
http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html