如何将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章《Android 使用动态加载框架DL进行插件化开发》。此处引用原做者的话:android

随着应用的不断迭代,应用的体积不断增大,项目愈来愈臃肿,冗余增长。项目新功能的添加,没法肯定与用户匹配性,发生严重异常每每牵一发而动全身,只能紧急发布补丁版本,强制用户进行更新。结果频繁的更新,反而容易下降用户使用黏性,或者是公司业务的不断发展,同系的应用愈来愈多,传统方式须要经过用户量最大的主项目进行引导下载并安装。怎么办?这里就能够参考浏览器-插件开发模式。git

同时,笔者也在网络上发现了一些开源的插件化框架,包括:github

(1) DynamicLoadApk算法

这个项目实现了一部分的动态加载,原理是 DexClassLoader 加 Activity 代理,能够看看。即在容器中注册几个代理的 Activity,启动插件的 Activity 时实际启动的都是代理的 Activity,这样就解决了 Activity 必须注册的问题。数据库

(2) AndroidDynamicLoader浏览器

这是点评一个工程师介绍的方式,和上面不一样的是:它不是用代理 Activity 的方式实现而是用 Fragment 以及 schema 的方式实现 安全

(3) Android PluginManager网络

这个项目的原理实际也是 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,这个是插件接口切入点。借助这个接口能够实现插件之间通讯。插件化通用平台只是理想化的目标,实际场景很难。插件化确实难度大,一夜讲透彻不太现实,下次有机会再和你们一块儿探讨。谢谢你们今天的主题会参与!

国内 ITOM 管理平台 OneAPM 致力于帮助企业用户提供全栈式的性能管理以及 IT 运维管理服务,经过一个探针就可以完成日志分析、安全防御、APM 基础组件监控、集成报警以及大数据分析等功能。想阅读更多优秀文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

相关文章
相关标签/搜索