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:还有什么?可以毕了
- android插件扩展学习记录1
- 插件学习记录(1)-comboselect
- Android学习记录1
- Android学习记录1
- android学习记录(1)
- Android 学习记录<1>
- firefox 插件扩展开发 入门记录
- My97DatePicker 插件学习记录
- swift学习记录(扩展)
- 学习记录:ES6 数组扩展
- android:listView学习记录1
- android-JNI学习记录(1)
- Android开发学习记录1
- Android基础知识学习记录[1]
- Android-学习记录(1)
- Unity插件EasyTouch学习记录
- oracle学习记录之扩展表空间
- [记录二]学习扩展卡尔曼滤波器
- php调取solr
- 使用JS对中文字符串进行utf-8的Base64编码,使其与Java编码相同的办法
- Nginx不同域名反向代理到另一台服务器 proxy_pass和$host
- stringstream clear()的误区
- Solr开发文档
- android插件扩展学习记录1
- 8核手机处理器技术评析
- 黑马程序员 笔记(十一)——面向对象(多线程)
- MathType支持64位 WIN 7Office 2013(完美解决)
- Oracle学习:PL_SQL——基本概念
- 【凡尘工作室】 微信平台架构和实现(github开源项目)
- android插入联系人
- 互芯 mmi 主题元素
- GB01中替代字段释放