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


更多相关文章

  1. Android从零撸美团(四) - 美团首页布局解析及实现 - Banner+自定
  2. Android通过原生方式获取经纬度与城市信息的方法
  3. android缩放大图片加载
  4. 使用IntelliJ IDEA开发Android中,你用崩溃汇报插件么?
  5. Android Studio 基础 之 一键快速实现一个类的 构造函数、getter
  6. Android Studio酷炫插件(一)——自动化快速实现Parcelable接口序列
  7. Android中的UID和PID意义,及查看方式

随机推荐

  1. Android极光推送jPush混淆解决方案终极篇
  2. Android 漂亮的 Dialog (弹出框)
  3. Android添加一个回调监听接口
  4. Android代码性能优化技巧
  5. android的入门学习
  6. 尝试在安卓系统中获得USSD响应
  7. Cocos2d-x 3.0 开发(十七)使用Cocos2d-x 3.
  8. Android源码在UBUNTU编译全过程
  9. 空对象引用错误:使用SQLite的Android Stud
  10. onActivityResult与singleTask或singleIn