• 怎样将「插件化」接入到项目之中?


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

    随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加。项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新。结果频繁的更新。反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装。

    怎么办?这里就能够參考浏览器-插件开发模式。

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

    (1) DynamicLoadApk

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

    (2) AndroidDynamicLoader

    这是点评一个project师介绍的方式,和上面不同的是:它不是用代理 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,相似容器,开发组都是各自的project。各自project之间有通信。那么我们怎样保证单独开发了,各自project之间怎样相互通信了。

    Fish-jenny:contentprovider。

    主持人-龙伟:不能,这个是数据库的吧?本质是binder。这里可能实际到插件的执行环境。

    安琪:远程广播作为接口。

    刘光利:广播非常耗性能啊?

    非墨:广播涉及到进程间调用,效率低。并且不安全。

    安琪:eventbus 跨进程呢?

    主持人-龙伟:不能够

    刘光利:插件与宿主共享数据。逻辑能够定义接口,抽成公用库。

    主持人-龙伟:这个是通用解决方式,跨进程就不太方便了,大家对 android 系统跨进程的理解是什么样的?

    Sirius:binder。

    Willace:套接字,

    非墨:共享内存? 管道,

    安琪:aidl,

    熊生-迈科技-android:共享 sp 文件算不算?

    小可爱:直接写 parcle 进行通信吧?

    主持人-龙伟:这个是本质,一般能够插件包有个 plugincontext,这个是插件接口切入点。借助这个接口能够实现插件之间通信。插件化通用平台仅仅是理想化的目标。实际场景非常难。插件化确实难度大。一晚上讲透彻不太现实,下次有机会再和大家一起探讨。

    谢谢大家今天的主题会參与!

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

    本文转自 OneAPM 官方博客

  • 相关阅读:
    mysql数据增删改查
    Python中的逻辑运算
    Python的格式化输出
    Python变量的命名规则
    解释型语言和编译型语言的比较?
    SQLAlchemy
    ansible
    算法
    数据分析
    scrapy之日志等级
  • 原文地址:https://www.cnblogs.com/llguanli/p/7252743.html
Copyright © 2020-2023  润新知