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缩放大图片加载
  2. Android通过原生方式获取经纬度与城市信息的方法
  3. 一起学android之简单了解Android(安卓)OS内部机制(29)
  4. Android中的UID和PID意义,及查看方式
  5. Android(安卓)Studio酷炫插件(一)——自动化快速实现Parcelable接
  6. Android(安卓)Studio 基础 之 一键快速实现一个类的 构造函数、g
  7. Android(安卓)HAL实现的三种方式(1) - 基于JNI的简单HAL设计
  8. 使用IntelliJ IDEA开发Android中,你用崩溃汇报插件么?
  9. Android(安卓)HAL实现的三种方式(1) - 基于JNI的简单HAL设计

随机推荐

  1. 面试题六:异步消息处理机制
  2. Android关键知识点详解
  3. 简单的Android之apk包反编译方法
  4. Copy" did not complete normally. Pleas
  5. OpenGL for Android
  6. 获取手机的视频和图片的缩略图
  7. Android(安卓)ninja: fatal: fork: Canno
  8. Xamarin.Forms教程Android(安卓)SDK工具
  9. Android中对话框显示需要判断的前提条件
  10. Android(安卓)自定义发送验证码, 倒计时