Android组件化小叙

转载地址:http://blog.csdn.net/hwpjiayou/article/details/50594489

一:为什么要组件化

1. 大多数朋友开始接触这个问题是因为 App 爆棚了,方法数超过了一个 Dex 最大方法数 65535 的上限。
2. 数据包越来越大。
3. 功能业务增加删减不灵活。
4. 动态改变资源文件。eg  主题
5. 模块耦合度大。
6. 升级不灵活,每次都需要验证。
7. 内存占用率高。
8. 流浪消耗大。
9. 并行开发效率低。

二:如何解决

  1. 传统的方式是发包执行更新操作。每次发包的周期时间因素重。
  2. H5代替。
  3. 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);
    }
    }

  4. 删减无用代码。

  5. 购买付费的proguard。
  6. 重构
  7. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值