android插件开发机制研究

在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包所有插件可以公共一个,传递数据不用反复的序列化和反序列化.),也是最复杂的(布局文件全部代码写,难调试,难维护).

 

参考资料:

1,android-application-plug-ins-frame-work

     https://code.google.com/p/android-application-plug-ins-frame-work/

   2,Android动态加载代码技术

     http://www.cnblogs.com/frydsh/archive/2012/12/21/2828561.html

   3,Android基于类装载器插件架构的实现   http://wenku.baidu.com/link?url=zrm8bGJeYOE5Z3REHLSITdGI28g-1jz2Kw_QWqWrFDHHRGnZq2W_Y3olKe5scn7ysD77Mw8INWfAtQshYKoD-9AdPgeSQgK5dnvIwU_YzbW

 4, Android动态加载(上)——加载未安装APK中的类

http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html

 http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html

5.Android Dynamic Loader框架(https://github.com/mmin18/AndroidDynamicLoader)

6,安卓应用程序插件化开发框架 -AAP Framework https://code.google.com/p/android-application-plug-ins-frame-work/

7,XCombine https://github.com/wyouflf/xCombine

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值