android插件扩展学习记录1

来源:互联网 发布:ui bootstrap.js 编辑:程序博客网 时间:2024/05/24 03:38



    代码地址:https://github.com/jixieshi999/WeiPlugin.git   (欢迎拍砖)
前段时间有空,学习了下android下的插件机制,在Java中一般是用动态加载jar包形式来加载插件。网上搜了下,android下面,对这种形式做了特殊的处理,android下只能动态加载dex文件,其中不少人给出,腾讯游戏大厅使用的就是动态加载dex。dex个人理解就是优化版的jar而已,所以原理是差不多的。
  简单点就是,原始项目里面添加基本的接口,由于android的特殊性,有的可以使用activity当作公共接口,直接在原项目里面加载插件里面的activity。提到这里,有一点小问题需要注意的是,在插件里面实现接口时,由于是被主程序加载的,所以插件里面的资源文件是不能动态加载和使用的,举个例子,插件dex里面的R.drawable.logo,在编译时可以通过,实际通过主程序加载时,是加载主程序的R.drawable里面值为dex插件里面的R.drawable.logo值的图片,如果没有该值 就找不到图片。
在代码里面使用的是activity和自定义接口结合使用来达到寻找和加载插件功能。
先来说下代码分三部分WeiPlugin , WeiPluginImplDemo , WeiUIPluginImplDemo;
WeiPlugin是主程序,负责加载和运行插件,并将插件信息存储到数据库中。
WeiPluginImplDemo是实现无界面的插件demo,WeiUIPluginImplDemo


在WeiPlugin项目中,可以内部实现一些插件,作为常用插件,或者是核心插件。
com.android.weiplugin.action是插件接口声明的包
com.android.weiplugin.actionloader是插件加载的包
com.android.weiplugin.plugins是插件管理的包
com.android.weiplugin.data序列化数据通信类
其他略~ ~


记录下,其中在加载插件时,卡了一段时间,由于自定义了一个序列化类(com.android.weiplugin.data.Command)用来与插件之间通信,在接口方法里面对这个类来传递参数,通过反射加载之后,该类一直穿不过来数据,断点跟了下,发现是对于不同DexClassLoader加载的这种自定义的com.android.weiplugin.data.Command(报java.lang.IllegalArgumentException argument 3 should have type com.android.weiplugin.data.Command, got com.android.weiplugin.data.Command),是不能相符复制和转换的,结果用了一个笨办法,通过反射将两个Command的Object实例,反射得到每一个field的然后赋值(PS:后来想了下,用序列化应该不需要这么麻烦,没有去验证。。),对于加载系统的Properties就没有出现这种问题。
对于这种情况,我在纯java项目中测试时,是没有问题的,可能android类加载机制做了一些调整,也可能是学艺不精。




PS:测试完这个demo时,有点小总结,事务一开始简单,单一,个别,易于管理,慢慢发展到--》复杂,多,这样导致不好管理,于是开始发展归类,归类多了,开始出现参差不齐,于是出现规范,标准,持久,在到后面想不到了。(虽然与代码没有多大联系,但是还是记下来舒服点)


PS:还有什么?可以毕了