Android插件开发初探——基础篇
来源:互联网 发布:奥飞游戏 知乎 编辑:程序博客网 时间:2024/05/27 00:55
Android插件开发初探
对于Android的插件化其实已经讨论已久了,但是市面上还没有非常靠谱成熟的插件框架供我们使用。这里我们就尝试性的对比一下Java中,我们使用插件化该是一个怎么样的流程,且我们如何将此流程移植到Android框架上去使用。很多代码都是内部资料,不喜勿喷,谢谢~
为什么要插件化?
- 功能越来越多
- 代码、安装包越来越大
- 小的更新也需要重新发布
- 更新频繁,安装成本太大
- 用户无法选择性加载需要的模块
- ……
插件化的好处
- 主安装包较小
- 强制模块化,降低耦合度
- 减少整体更新的次数
- 插件可单独静默更新
- 用户可以有所选择
- ……
插件化的要求
- 没有独立运行的入口
- 主应用控制,下载、安装、删除、静默升级、打开和关闭
- 主应用和插件资源共享
安装包的组成
需要安装的插件
对比一个安装包的组成,我们要处理的东西也就是很多:
- 主应用可以以Intent方式启动具体的插件,同时带入Map类型参数或者json串参数
- 使用相同的android:sharedUserId,资源数据共享
- 根据sharedUserId来查找插件
- queryIntentActivities查找符合这个action的所有activity(或其它)即插件
- query方式可以获得插件的路径以及实现接口类的类名
- 通过检索sharedUserId能够得到路径却无法获得到类名
- 通常可以使用一个描述文件(xml、json)描述插件结构
- createPackageContext()
- getResourcesForApplication()
动态加载普通类
- Java 可以用 ClassLoader 动态加载.jar 中的Class文件,android可以吗?
- PathClassLoader
- DexClassLoader
接口类
package com.plug; public interface InterfacePlug { public String function_01(); public int function_02(int a,int b); }
实现类
import com.plug.InterfacePlug; public class PlugImpl implements InterfacePlug{ @Override public String function_01() { return null; } @Override public int function_02(int a, int b) { return a+b; } }
主应用类
package com.host; public class MyhostActivity extends Activity { public void useDexClassLoader() { DexClassLoader cDexClassLoader = new DexClassLoader("/mnt/sdcard/Myplugdex.jar", "/data/data/com.host", null, this.getClass() .getClassLoader()); try { Class<?> class1 = cDexClassLoader.loadClass("com.plug.PlugImpl"); InterfacePlug interfacePlug = (InterfacePlug) class1.newInstance(); int ret = interfacePlug.function_02(12, 13); tv.setText(" return value :" + ret); } catch (Exception e) { } } }
导出插件包时只能导出实现类,否则会出现
Classref in pre-verified class resolvedtounexpected implementation重复定义错误
当然,安装包的解析与插件安装远不止于类文件的加载,我们还需要:
- 不是普通类怎么办?
- 系统组件如何接收回调?
- 如何加载资源?
- PackageInfo处理?
- Resources的处理?
- Assets的处理?
动态加载系统组件和资源
PluginLib
PluginHost
PluginTest
我们一个简单的插件框架就如下图所示:
主应用列出安装的Plugins,点击启动对应的PluginActivity
当然,我们也可以根据此简单的机制来完成一个完整的插件系统。
可以基本完整实现一个Activity
可以继续增加其他组件的插件,完成更多的功能(Service,Receiver,ContentProvider,Application?)
此插件机制的缺点
- Manifest中注册的信息由系统控制,因此插件需要权限信息需要预先注册在主程序中。
- 目前实现有一定的限制,如插件宿主的相互调用、插件间的相互调用
Github上的插件框架,基于Fragment的开源插件框架
- https://github.com/mmin18/AndroidDynamicLoader
- UI基于Fragment
- 反射得到Resources
- 通过uri进行页面跳转
/*
* @author zhoushengtao(周圣韬)
* @since 2015年1月27日 上午14:02:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流学习QQ群:341989536
* @私人QQ:445914891
/
- Android插件开发初探——基础篇
- Android插件开发初探——分析篇
- 【Android】Android插件开发 —— 基础入门篇
- 【Android开发学习笔记】【高级】【随笔】插件化——初探
- 开发DEDE插件—基础篇
- JQuery插件开发初探——结构熟悉
- JQuery插件开发初探——图片轮播
- Android第一开发语言—初探Kotlin
- Android Studio插件开发基础
- android插件开发——加载插件
- IOS、安卓IM语音聊天开发初探部分心得——网络基础篇
- ETL工具——kettle插件开发(基础篇)
- Android基础入门教程——4.4.1 ContentProvider初探
- IOS开发初探xcode插件
- android动画基础初探
- Android插件化基础篇—— class 文件
- Android插件化基础篇—— class 文件
- Android插件化基础篇 — dex 文件
- android各版本号的定义和比较方法
- IdHTTP 设置cookie 和访问后读取Cookie 值。
- windows下拉菜单截图
- python库安装的一些错误
- 关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
- Android插件开发初探——基础篇
- [web安全] XSS的防御
- JS正则表达式学习之路:(二)用于模式匹配的String方法
- Phoenix(四)JDBC CRUD操作
- Android内存优化之一:MAT使用入门
- ToggleButton开关按钮
- 对NGUI的UISprite和UITexture进行裁剪,圆形裁剪
- tomcat多域名配置
- JS正则表达式学习之路:(三)RegExp对象