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

Android组件化小叙

2016-01-27 15:09 375 查看
转载地址:/article/11570869.html

一:为什么要组件化

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: