android插件扩展学习记录1
2013-03-19 17:31
253 查看
代码地址: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:还有什么?可以毕了
前段时间有空,学习了下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:还有什么?可以毕了
相关文章推荐
- Android学习记录(2)—Android中数据库的常见操作
- osg android学习--经验记录
- Android Gradle插件学习
- [记录二]学习扩展卡尔曼滤波器
- 插件学习记录(1)-comboselect
- 【android学习记录】socket的初步学习
- Android学习记录之Volley网络通信框架基础解析(1)
- (记录学习android遇到的问题)使用被weight分配空间后的控件高度值画新控件出现的问题
- Android学习记录:Acitivity
- [转载]关于Android ProGuard混淆学习记录
- vim 插件学习记录
- Eclipse plugins 插件开发学习 - 扩展点介绍
- 文字特效 Text Fx插件学习记录
- Android 开发学习记录(4)---- httpclient使用(三)
- Android学习--App模块化及工程扩展
- Android Gradle学习记录1 基本特点
- Android学习之——自己搭建Http框架(2)——框架扩展
- Android测试单元学习记录
- 记录我的Android学习
- Android学习记录:SQLite数据库、res中raw的文件调用