|
导读:插件化是 Android 技术畛域里关注度较高的技术框架,插件化框架给 Android 开发者带来了得多方便,然而针对插件 APK 的维护也需求开发者重点关注。本文经过对插件化框架的配景以及原理的引见,分享了易盾目前对插件 APK 的维护计划。
文 | 尹彬彬
网易易盾
qwvzmxeyce4.jpg
前言
插件化是 Android 技术畛域里关注度较高的技术框架,自从 20十二 年插件化概念被初次提出,到当初各种插件化计划百花斗丽,插件化的热度始终居高不下。
在插件化框架中,插件依赖于宿主运用,宿主运用经过静态加载、反射等形式将插件包加载使用。作为一种特殊的运用场景,对插件的维护天然不同于个别的加固维护场景。目前市面上大可能是针对非插件 APK 的加固维护计划,针对插件 APK 的维护计划目前还对比欠缺,因此亟需一种针对插件 APK 的加固维护计划。
本文将扼要论述插件化技术的配景、原理和运用场景,同时会引见如何对插件包这类场景做加固维护。
o300rba4dwx.jpg
插件化技术配景
作甚「插件化」,望文生义,就是把一些中心繁杂依赖度高的业务模块封装成独立的插件,而后按照不同业务需要进行组合,静态交换,可对插件进行办理、更新等操作。
在插件化中有两个根底概念:
宿主:所谓宿主,就是需求能提供运转环境,给资源调用提供上下文环境,个别也就是咱们主 APK ,要运转的运用,它作为运用的主工程,完成了一套插件的加载和办理的框架,插件都是依靠于宿主的 APK 而存在的。插件:插件能够想象成每个独立的功用模块封装为一个小的APK ,能够经过在线配置和更新完成插件APK在宿主APK中的上线和下线,以及静态更新等功用。那末为什么要使用插件化技术?简略来讲有下列这几点益处:
插件静态更新,用户无需从新装置宿主 APK 就可以降级运用功用;按需加载不同的插件,完成灵敏的功用配置;宿主与插件离开编译,无需频繁更新,增加版本上线本钱开消。上面是对比知名的几个开源的插件化框架,根据泛起的时间排序。大抵能够看出插件化技术的开展脉络,按照完成原理能够将这几个框架划分红了三代。
skgjmrhbq5h.jpg
第一代:dynamic-load-APK 最先使用 ProxyActivity 这类动态代理技术,由 ProxyActivity 去管制插件中 PluginActivity 的生命周期。该种形式缺陷显著,插件中的 activity 必需承继 PluginActivity,开发时要谨慎处置 context。而 DroidPlugin 经过 Hook 零碎办事的形式启动插件中的 Activity,使得开发插件的进程和开发普通的 APP 没有甚么区分,然而因为 Hook 过量零碎办事,异样繁杂且不敷不乱。
第二代:为了同时达到插件开发的低侵入性和框架的不乱性,在完成原理上都是趋近于选择尽可能少的 Hook,并经过在 manifest 中预埋一些组件完成对四大组件的插件化。此外各个框架按照其设计思想都做了不同水平的扩展,其中 Small 更是做成为了一个跨平台,组件化的开发框架。
第三代:VirtualApp 对比厉害,可以彻底摹拟 APP 的运转环境,可以完成 APP 的免装置运转和双开技术。Atlas 是阿里开源出来的一个结合组件化和热修复技术的 APP 根底框架,其普遍的运用与阿里系的各个 APP,号称是一个容器化框架。
i5dj5y1nuc2.jpg
插件化中心原理
插件化计划次要是解决上面三个问题:
插件中代码的加载和与宿主的相互调用。插件中资源的加载和与宿主的相互拜候。插件中四大组件的调用与生命周期的办理。针对插件四大组件的处置上,插件化次要存在两大流派:插桩代理计划,Hook 计划。
插桩代理计划
扼要概括下,就是在宿主的包中经过定义代理组件来对插件中的组件进行代理,由宿主的组件类同步插件中组件的生命周期,至关于对插件中组件功用进行转发。
1ka0qfagepa.jpg
Hook 计划
经过 Hook 零碎 Framework 层与组件启动相干的接口,并在 Manifest 文件中注册事后占位组件,达到欺上瞒下的成果,启动的是宿主中占位的组件,实际履行的代码逻辑是插件中相应组件的逻辑,因为宿主中占位的组件被注册过,被 Hook 代理的插件组件生命周期和原生组件根本上是统一的。不外 Hook 计划由于要兼容不同的 Android 零碎版本,需求做各个版本的适配,兼容性存在一定的危险。
2zpj4q5zrfu.jpg
fdqkvicpjqz.jpg
插件化运用场景
APP 插件
跟着名目的不停后退,当 APP 范围开展到一定阶段后,业务逻辑日益繁杂,完成模块化的开发成为一种刚需。插件化计划提供了一种解决的思绪。将 APP 中部份独立的功用封装成模块,作为插件 APK 进行加载。一方面能够使业务模块化,不同模块互不搅扰,此外,模块在不同的 APP 中能够进行复用,增加代码反复建立。
游戏插件
游戏作为文娱 APP,其中的功用模块一样有着升高耦合、增加繁杂度的需要。好比登录、领取、人脸辨认等功用模块,这些模块作为通用功用也能够插件化,使得游戏开发者能够分心于游戏业务逻辑的完成。此外像目前云游戏概念也对比火,开发者经过在名目中嵌入云游戏模块,能够疾速上线不同的云游戏插件,无需频繁发版就能让玩家有更丰硕的游戏体验。
双开运用
双开运用能够算是插件化技术的延长场景,作为插件的 APK 能够完成在双开运用里多开运转。这时候的宿主 APP 即双开 APP 代替零碎对插件 APK 完成免装置运转,以及与原零碎运用的数据隔离(双开)。
gjukpjin5rn.jpg
插件 APK 维护计划
插件包因为是被宿被动态加载启动的,其启动机会是由宿主是不是调用加载插件相应逻辑进行触发的,与正常 APP 有残缺的零碎启动流程不同。传统的总体加固计划是经过代理 Application 获取履行入口,而后经过内存加载原始 Dex 对 APK 进行维护,这类计划显然无奈运用在插件包 APK 的维护中。
目前易盾在插件化场景下,采取自研 VMP 计划来对维护插件 APK 中的代码。VMP 计划是把待维护的插件中心代码进行 Naitve 化,使之转换到易盾自定义的虚构机中去履行,维护粒度到办法级,这样不受插件 APP 启动机会的影响。
例如在某游戏协作过程当中,他们除了对宿主做加固外,还但愿对领取插件等中心模块进行高强度的维护,防止症结的领取逻辑被黑灰产破解利用,终究使用了易盾插件化维护计划,下图是 VMP 计划的维护成果(非实际代码,仅作演示):
维护前:
r1snei0oxml.jpg
维护后:
b2p5t01temt.jpg
通过维护后能够看到针对这个类的代码曾经彻底被 Native 化维护了,防止被反编译及逆向剖析。易盾自研 VMP 计划拥有平安强度高、兼容性较好的特征,加固后的插件使用形式与未加固的插件包根本统一,不会减少开发者额定的接入本钱。
oyclo1dmajb.jpg
结语
插件化框架给 Android 开发者带来了得多方便,然而针对插件 APK 的维护也需求开发者重点关注。本文经过对插件化框架的配景以及原理的引见,并给出了易盾目前对插件 APK 的维护计划。有兴致的开发者能够分割试用。
作者:尹彬彬
出处:http://mp.weixin.qq.com/s/CqNZPjQqy-AuYR5Iwx4vXw |
|