Android插件化开发

  客户端开发给人的印象每每是小巧,快速奔跑。但随着产品的发展,目前产生了大量的 门户型客户端。功能模块持续集成,开发人员迅速增加。不一样的开发小组开发不一样的功能模块,甚至还有其余客户端集成进入。能作到功能模块开发和发布的独立,能像Html5同样能帅气的解决bug并动态更新到用户的手机,一直是客户端开发的求之不得的特性。

1、问题提出
     通常的,一个Android应用在开发到了必定阶段之后,功能模块将会愈来愈多,APK安装包也愈来愈大,用户在使用过程当中也没有办法选择性的加载本身须要的功能模块。此时可能就须要考虑如何分拆整个应用了。
      当前问题:
          1.代码愈来愈庞大,很难维护
          2.需求愈来愈多,某一模块的小改动都要从新发布版本,发布时间愈来愈不可控。
3.项目中某一段代码牵涉模块愈来愈多,应对bug反应愈来愈慢。
      潜在问题:
          早期的Dalvik VM内部使用short类型变量来标识方法的id,dex限制了程序的最大方法数是 65535,若是超过最大限制,没法编译,(此外补充一点,以前作Framework开发时候,曾遇到多方法数量超过65535编译不经过,修改makefile,从外部(通常是源码目录下Vender/xx/xx/xx...)加载类既能够解决)。

2、解决方案提出
     1.用Html5代替部分逻辑
     2.删除无用代码,减小方法数
     3.插件化,将一个 App 划分为多个插件(Apk 或相关格式)

     前两种方法在某种条件下能够解决问题,可是治标不治本。下面咱们重点说一下 Android插件化开发。

3、Android插件化

      Android 插件化 —— 指将一个程序划分为不一样的部分,好比通常 App 的皮肤样式就能够当作一个插件
      Android 组件化 —— 这个概念实际跟上面相差不那么明显,组件和插件较大的区别就是:组件是指通用及复用性较高的构件,好比图片缓存就能够当作一个组件被多个 App 共用
      Android 动态加载 —— 这个实际是更高层次的概念,也有叫法是热加载或 Android 动态部署,指容器(App)在运⾏状态下动态加载某个模块,从而新增功能或改变某⼀部分行为  

     在java开发中随处可见使用jar包的插件机制进行开发,但在android中,目前较成熟的插件机制基本没有,看到的帖子中提到了重写dexclassloader能够完美的解决插件问题,但都只简要描述了原理,没有源码或关键代码,下面对网络中的思路进行总结.

     目前插件包有两种格式:一种是apk,一种是dex包.对插件的接入机制来讲也有两种:一种是须要安装,一种是不须要安装.结合插件包的格式来讲插件的方式只有三种:1,apk安装,2,apk不安装,3,dex包.三种方式其实主要是解决两个方面的问题:1,加载插件中的类,2,加载插件中的资源.第一个加载类的问题,这三个方式均可以很好的解决.但目前三种方式都没有很完美的解决第2个问题.

     1,apk安装方式.插件apk安装后,能够在主程序中经过包名加载到插件的context,有了插件的context就能够解决加载插件资源的问题.但出现的新问题是:若是插件a,b,c间公用一个底层jar包,那么在abc间传送数据时,须要进行序列化和反序列化,由于a中jar包的data类与b中jar包的data类虽然都是一样的jar包也是一样的类,但两个类在java机制来是由不一样的classloader加载的,是不一样的类.那么就会出现插件间jar包冗余和数据传递的效率很差问题.总之能解决问题.

     2,apk不安装,这个是不推荐的方式.能够经过dexclassloader加载到插件a中的类,但插件没有安装就没法得到插件apk的context,也就没法加载到资源,网络上有牛人经过将主程序的context替换关键的对象(如classloader,assertmanager等),伪形成插件的context,而后经过伪context也能够得到插件资源.目前我的验证的问题为:获取到的layout资源中的textview显示文本有问题,没法显示在layout设定的文本.同时我的猜想这种hack的方式或许有其它的未知的问题,但不排除高手已经解决了这个问题.

     3,dex包,这个基本是java开发中jar包的方式.一样经过dexclassloader加载到插件中的类,但依旧没有context,也没法加载到资源.要使用布局,只能在插件中使用java代码来写布局.这种方式最简单(1,相似jar包的方式,也能够随意导出单个类的jar包而后转化为dex包,不存在打包成apk须要完整的工程和依赖关系的要求.2,底层的公用jar包全部插件能够公共一个,传递数据不用反复的序列化和反序列化.),也是最复杂的(布局文件所有代码写,难调试,难维护).


4、优缺点
     插件式开发通俗的讲就是把一个很大的app分红n多个比较小的app,其中有一个app是主app。基本上能够理解为让一个apk不安装也能够被运行。只不过这个运行是有不少限制的运行,因此才叫插件不然就叫病毒了。其实在目前淘宝、百度、腾讯、等都有成熟的动态加载框架,包括apkplug,可是它们都是不开源的。

      优势:
     1.模块解耦
     2.解除单个dex函数不能超过  65535的限制
     3.动态升级
     4.高效开发(编译速度更快)

     基于插件的开发列举两个比较突出的优势:
     一、应用程序很是容易扩展,好比一个新的领域要加到旧的应用程序中,只需把这个新的领域作为一个插件,只开发这个小的app就能够了,旧的应用程序可能会原分不动,就连编译打包都不须要。
     二、下载更新特别省流量,假如一个应用程序有10M把它分红两个的话可能每次更新只须要花费5M或者更少的流量就能够更新完。

     追求完美原本就是一种性格缺陷,说在作软件方面没有近乎完美。基于插件开发固然不是插件越多越好能掌控好内聚和耦合度就更好了。插件增长了主应用程序中的逻辑难度。有优势的东西也是有缺点的这是必然。
     
      缺点:
     1.增长了主应用程序的逻辑难度
     2.技术有难度,目前一些成熟的框架都是闭源的



参考资料:
      1.android插件化及动态部署 - ATLAS--伯奎(阿里无线事业部无线技术专家)


      2.怎么将 Android 程序作成插件化的形式?--知乎
     
      3.Android 插件化 动态升级

      4.apkplug框架

      5.Android插件化开发,初入殿堂

      6.Android 插件框架 AtlasForAndroid(阿里使用框架)
     
      Simple Project
相关文章
相关标签/搜索