口红 5年磨一剑|优酷Android包瘦身治理思路全解( 九 )


瘦身技术 前面讲了很多治理模式相关内容 , 看起来可能有些抽象 , 接下来会回到具体的瘦身技术 , 侧重点不在于深入技术原理和实现细节(大多会给出参考链接) , 而是尝试将每一项瘦身技术的优缺点进行一次概括性讲解和巡展 , 便于形成一个整体认知 , 在对具体app进行瘦身时 , 能够根据实际情况进行选择和优先级安排 。 瘦身技术 , 顾名思义 , 就是指可以用于包瘦身的任何技术(方案) , 按照所需技术、生效阶段、影响范围综合评判 , 将其划分为以下三种类型:

4.1 远程化
远程化是指将原本在apk中的功能 , 剥离出来放到服务器 , app运行时进行下载、加载等一系列动作后 , 才能够正常使用功能的一种技术方案 , 其核心特点可以归纳为“本地剥离 , 远程下载” 。 远程化瘦身效果显著 , 也因此容易为了追求瘦身结果而被过度使用 , 但这并不是远程化本身的原罪 , 实际上一些边缘、非核心、实验性业务 , 都比较适合进行远程化改造 。 远程化框架涉及的关键技术 , 在业内已经有很成熟的解决方案 , 但是具体到代码实现 , 还是有不少需要仔细思考和反复打磨的地方 , 例如:apk构建体系的兼容性是否足够广泛 , 远程化改造的代码限制和改造难度是否足够低 , app唤端、多进程、用户磁盘占用、下载线程占用、apk升级复用、下载带宽成本等 。
按照远程化元素类型 , 以及业界普遍使用情况 , 将其分为远程so、远程bundle、远程资源三种 。
首先来看远程so 。 动态链接库so与其它代码的耦合度低 , 在apk中具有较强的独立性 , 同时占用apk体积相对较大 , 因此单独将so进行远程化往往具有很高的瘦身投入产出比 。
第二种远程bundle , 一般是指可以完整的将一块功能进行远程化 , 远程部分相当于一个迷你apk(dex、resource、so) 。 远程bundle相关技术“历史悠久” , 动态化、插件化、组件化等虽然有语境、功能以及设计思想上的区别 , 但在技术上有着很多相似的地方 , 随着新版本os加强了对系统API调用、拦截和替换等方面限制 , 这个领域的主流技术方案逐渐演变为对系统侵入越来越轻量的方向 。 相对于远程so , 远程bundle在实现上要复杂很多:在运行时阶段 , 虽然对系统API的侵入性比较小 , 但是对唤端、组件路由跳转、后台Activity销毁重建等情况依然需要小心处理;在构建阶段 , 由于要“分离”出一个迷你apk , 因此对构建体系的兼容非常困难 , 目前业界有一些同类框架 , 很多时候并不是运行时无法满足需求 , 而是在构建侧无法做到很好的兼容性和易用性 。
最后一种远程资源 , 是指针对资源文件的远程化 。 可以通过将资源上传到文件托管平台 , 获取文件url后直接下载并使用(优酷采用的就是这种方式) 。 远程资源的实际应用场景较少 , 投入产出比也不高 , 所以目前优酷没有专门研发一个这样的框架 。 当然 , 如果有大量资源需要进行这种远程化改造 , 那可能有必要开发一个专用框架 。
4.2 整包瘦身
整包瘦身 , 是指在apk构建阶段整体进行处理的一类瘦身技术 , 对全部apk元素均可生效(包括无源码的二、三方sdk) , 新增代码也可以立刻得到同样的处理 , 其核心特点可以归纳为“中间拦截 , 整体生效” 。 也正是由于上述特点 , 这类瘦身的影响范围较广 , 因此在首次应用到app时 , 如何控制好验证成本和线上风险变得非常关键 , 当然在瘦身效果上 , 一般可以立竿见影的获得较大收益 。 自定义的一些整包瘦身方案 , 往往容易出现处理逻辑考虑不周全而导致的稳定性问题 , 注意这不属于技术方案本身的特点 , 而是具体实现代码的问题 。 在工程效能方面 , 对代码质量无影响 , 构建耗时则一般会有增加 , 有些整包瘦身技术会改变apk中目标元素形态 , 因此对各类相关问题分析会带来一定程度的效率降低 。

经验总结扩展阅读