本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章《Android 使用动态加载框架DL进行插件化开发》。此处引用原作者的话:
随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余增加。项目新功能的添加,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,只能紧急发布补丁版本,强制用户进行更新。结果频繁的更新,反而容易降低用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式需要通过用户量最大的主项目进行引导下载并安装。怎么办?这里就可以参考浏览器-插件开发模式。
同时,笔者也在网络上发现了一些开源的插件化框架,包括:
(1) DynamicLoadApk
这个项目实现了一部分的动态加载,原理是 DexClassLoader 加 Activity 代理,可以看看。即在容器中注册几个代理的 Activity,启动插件的 Activity 时实际启动的都是代理的 Activity,这样就解决了 Activity 必须注册的问题。
这是点评一个工程师介绍的方式,和上面不同的是:它不是用代理 Activity 的方式实现而是用 Fragment 以及 schema 的方式实现
这个项目的原理实际也是 DexClassLoader 加 Activity 代理,不同的是上面的 dynamic-load-apk 项目中,插件需要依赖框架的 lib,插件组件继承框架 lib 的 Base 组件。而这个框架通过字节码操作动态生成一个子类去继承插件组件解决插件必须依赖框架的问题,从而达到插件无需做任何改动(理论上)即可加载的效果。
希望,上述的资料和内容,能够对大家了解插件化有所帮助,本期讨论的主题如下,文章系 ITOM 管理平台 OneAPM 整理。
- 什么是插件化?
- 为什么要插件化?
- 插件化需要哪些技术支撑?
- 插件化的坑都有哪些?
- 如何将插件化接入到项目中?
什么是插件化
主持人-龙伟: 大家是如何理解插件化的?
杨天飞-用友超客-android: 动态加载?
杨春-深圳杰为-android开发: 插件化我觉得就是将一个apk改成多个apk。
王岳明:移动平台插件化一般来说,通过后台下发业务模块到终端,实现业务系统的动态更新吧?
安琪: 多apk?
Struggle:不一定是apk。
追寻: dex jar。
小诺理财android-何思敏 : 目前的插件化,还是为了补充 C 端更新修复问题吧。比如热修复、插件load、组件技术等等。
王岳明: 另外插件化也是一种系统架构方式,降低各子系统的耦合性。
主持人-龙伟: 插件化主要是解耦合、热更新、热修复、分布式团队开发。
杨维杰: 主要是把业务逻辑拆分,在需要的时候加载,减少体积吧?依赖加载.
为什么需要插件化?
王岳明:即插即用。
主持人-龙伟:这个类似 USB 接口。
安琪: 不一定是 apk,也许是特有的接口格式特有的压缩包
陈昱:高效率。
刘光利:我用插件化最大出发点就是:模块化,解耦,复用,至于热更新要看业务场景的需要。
千里走单骑:业务驱使,易于团队协作。
小可爱:跟搭积木一样,可以*组装,实现业务模块化,方便开发和维护。
追寻:节省流量。
Sirius:随时上线,灵活。
安琪:Lua 在 Cocos2dx 热更新比较多。
小诺理财android-何思敏: 核心还是模块化,业务分离,组件设计。
安琪:增量更新。
主持人-龙伟: 这些都是插件化的原因。大家看过市面上插件化框架的代码了吗? 比如 Droidplugin,插件化说起来就一句话,加载代码,加载资源。
插件化需要哪些技术支撑?
主持人-龙伟: 插件化需要的技术,首插件化需要懂类加载机制,资源加载机制,大家对着两种技术理解如何,说说自己的看法。
安琪:apk 包机制,assert。
追寻:没超过就一个 dex 吧!
杨天飞-用友超客-android: DexclassLoader
主持人-龙伟:类加载有引导加载,扩展加载,系统加载,我们平时安装的 apk 使用的哪个类加载来加载,大家可以说说。
安琪:也有 cpp 写的。
小可爱: PathClassloader。
主持人-龙伟:Dexclassloader,这个是我们作为插件化加载代码的加载器之一。非 apk 代码可以用这个来加载,一般常见加载的包有 dex jar 插件化 apk 包。
小可爱:目前一般是做成 apk 文件吧,插件的?
刘光利:还可以扩展其他格式吗?
主持人-龙伟:可以,只要符合文件内容协议。
主持人-龙伟:资源的处理是比较麻烦的。首先要保证资源的正确加载,然后要解决很多坑。
刘光利:如何防止插件 apk 中的资源和宿主 apk 中的资源引用冲突?
王岳明:你说的资源是什么?
主持人-龙伟:图片、文本、颜色等等,这些都是资源。
非默:不过你的插件 apk 如何引用宿主 apk 的资源,尤其你的宿主 apk 做了主题之后?
主持人-龙伟:这个需要协商主与宿。
非默:这个我觉得才是插件化相对困难的地方,要么你就互相传递引用,但那样可能会把你的耦合度提高。
刘光利: accd 就是定制 aapt 工具,我觉得不是太好。
非墨:个人觉得,目前没有最优解。
主持人-龙伟:对,插件化是不断发现问题,埋坑!
插件化都有哪些坑?
主持人-龙伟:插件化的中的难点与坑。Android 组件代码加载的特殊性,比如 Activity 的加载。
刘光利:由系统掌握生命周期的类。
非墨:fragment。
小可爱:瞒天过海,360 的框架思想,欺骗系统,把框架层弄于鼓掌之中。
主持人-龙伟:其实就是一个平台,提供上下文。
非墨:这个其实说的有点抽象了,举个例子就是 Android 系统平台,所有的 apk 本身是插件,其实就是中间件的概念。
主持人-龙伟:上下文是一个操场,里面很多活动的对象,这些对象就是 apk,大家这样理解了吗?
安琪:插件化安全吗?会产生依赖病毒吗?
非墨:没有绝对的安全。
主持人-龙伟:既然是插件,那么肯定有缺陷。
王岳明:请教个问题,Android 的插件涉及到签名验证吗?
非墨:系统认证还是代码认证?
刘光利:认证很重要,一般是签名认证吧,不然会有注入攻击的分享。
主持人-龙伟:加载之前必须认证,认证通过才加载。
熊生-迈科技-android:如何认证呢?
王岳明:宿主与主体采用相同的签名方式可以相互调用吗?
主持人-龙伟:可以的,双向的。
非墨:这种方式需要安装么?
主持人-龙伟:插件无需安装,可以通信,我说说代码加载认证。
非墨:我主要没理解,相互调用跟签名相不相同有什么关系?
主持人-龙伟:没关系,看认证机制,无需安装的,就没有系统认证的说法了,其实 apk 安装的时候才会去认证,插件话是绕过去了。但是本身的代码认证还需要。一般可以用sha1算法认证。
Wallace:可以自定义二进制。
主持人-龙伟:二进制难度有点大。
Wallace:不是要校验下载包吗?
主持人-龙伟:这个是比较差异。
Wallace:打包跟解包都靠自己的算法。
非墨:你如果自定义二进制文件不能 loader,load 除非你有一层解码。
Wallace:别人解不了。
如何将插件化接入到项目中?
主持人-龙伟:插件化接入到项目中,大家的理解是什么样的?
Wallace:先说一个场景,然后怎么处理用插件化解决的场景。
主持人-龙伟:首先我们有3个团队开发,有三个业务方向,有个主 APP,类似容器,开发组都是各自的工程,各自工程之间有通信,那么我们如何保证单独开发了,各自工程之间如何相互通信了。
Fish-jenny:contentprovider。
主持人-龙伟:不能,这个是数据库的吧?本质是binder,这里可能实际到插件的运行环境。
安琪:远程广播作为接口。
刘光利:广播很耗性能啊?
非墨:广播涉及到进程间调用,效率低,而且不安全。
安琪:eventbus 跨进程呢?
主持人-龙伟:不可以
刘光利:插件与宿主共享数据,逻辑可以定义接口,抽成公用库。
主持人-龙伟:这个是通用解决方案,跨进程就不太方便了,大家对 android 系统跨进程的理解是什么样的?
Sirius:binder。
Willace:套接字,
非墨:共享内存? 管道,
安琪:aidl,
熊生-迈科技-android:共享 sp 文件算不算?
小可爱:直接写 parcle 进行通信吧?
主持人-龙伟:这个是本质,一般可以插件包有个 plugincontext,这个是插件接口切入点。借助这个接口可以实现插件之间通信。插件化通用平台只是理想化的目标,实际场景很难。插件化确实难度大,一晚上讲透彻不太现实,下次有机会再和大家一起探讨。谢谢大家今天的主题会参与!