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


常态化治理 , 是指在长期的版本迭代过程中始终能够控制好增量 , 并在维持住当前包大小水位前提下实现“稳中有降” 。 一般在常态化治理阶段 , 头部问题已经基本不存在 , 需要在业务功能和代码源头进行更全面、精细、深入的分析和思考 , 从而在版本迭代过程中逐步“消化掉”可以瘦身的地方 。 在治理所需人力投入上 , 具有较低的整体管控投入 , 并形成团队、业务、功能的开发者自治局面 。 在治理节奏上 , 整体包瘦身目标调整周期较长 , 同时不再进行细粒度的瘦身里程碑制定 , 采用相对宽松和灵活的方式 , 把自主权给到具体负责的团队和开发者 。 在瘦身效果上 , 可以较好维持住当前水位而不发生反弹 , 甚至是缓慢降低 。 常态化治理的“精神内核”是体验优先 , 将包瘦身这件事“融入”到日常研发迭代过程 , 与稳定性(crash/bug等)、性能(启动速度/页面切换/流畅度等)一样 , 共同成为研发团队(同学)在业务需求和功能之外关注并考量的技术项 。
在时间、人力、节奏、效果、精神“内核”这五个维度上 , 二者的对比情况汇总如下:

常态化和专项式的关系并非简单的“优于”就能够说清楚 , 首先二者具有演进关系 , 类似人类文明的“石器、青铜、农业、工业”等代际进化 , 常态化治理也是在生产力(分析瘦身技术)不断提高的情况下 , 促使生产关系(治理模式)等发生变革(嗯 , 这个比喻不一定准确) 。 其次 , 二者有着不同的适用情况 , 专项式治理用于快速降低包大小 , 而常态化治理用于低成本可持续维持或者缓降 。 如果app无论与同类竞品还是自身相比 , 都明显处于较高的包大小水位 , 那显然需要先通过专项治理将包大小快速降低下去 , 然后再衔接上常态化治理来获得“长治久安”;如果app已经处于常态化治理模式 , 但是由于某些原因需要进一步快速降低 , 那么就需要切换到专项式治理模式 , 达成目标后再继续回到常态化治理模式 。
常态化治理相对专项式治理 , 更需要当作一个系统化工程来看待 , 整体治理思路如下:

由专项式到常态化 , 首先要做的转变是将关注点从“事”转移到“人”:每一个Byte都是由人(开发者)添加的 , 对产生的原因(技术、流程、心理等)进行全面分析 , 并给出有效解决方案 , 才能够实现专项式到常态化的跃变 。 这个解决方案 , 主要包括技术支撑、治理策略两方面 , 二者相辅相成缺一不可 。
2.2 技术支撑
整个技术支撑体系的核心是包大小精准分析 , 即对apk内任意实体元素(类、资源、so等)获取其在apk文件中实际占用值 。 因为编译过程会进行各种合并、裁剪、优化、格式转换等 , 同时apk中不同类型元素的压缩率也不相同 , 如果使用原始大小作为度量标准 , 会在包大小治理的整个链路引入较大误差 , 导致难以抓住瘦身重点 , 也无法提前精准预判瘦身效果 , 这对常态治理过程具有非常大的负面影响 。
第一点可瘦身项 , 是指类、资源、so等元素中的“不合理”项 , 对其进行改造或优化就可以降低包大小 。 这些可瘦身项细碎并且不易被人工发现 , 但是累积起来却不容小觑 , 通过工具化的分析能力可以快速找出这些可瘦身项 , 一方面提供瘦身指导:为逐步降低包大小提供更多“方向”和“空间” , 另一方面用来评判:一个功能/业务/团队 , 在这段时间内减少/增加了哪些可瘦身项 , 当前是否已经瘦无可瘦 。
第二点归属聚合 , 是指将apk大小拆解到有效的责任实体 , 根据app涉及到的研发团队和迭代模式不同 , 责任实体可以是组织结构中具体的团队 , 也可以是业务/功能/模块负责人 。 总之 , 拆解的目的是明确责任 , 即团队/业务/功能/模块对apk大小的“贡献”分别是多少 。
第三点研发流程 , 是代码上线的“必经之路” , 在这个过程中需要具备及时的增量感知 , 以及超限后的拦截阻断能力 。 只有这样才能实现低(人力)成本持续管控 , 另外这也是去中心化策略的重要技术支撑 , 可以避免很多低效的增量定位排查、沟通、跟进等工作 。
第四点辅助工具 , 是为研发同学对代码进行瘦身提供一系列切实有效的工具 , 用来提高效率以及降低风险 。 目前在优酷已经沉淀了引用分析、代码归属/热度分析、模块下载/版本号同步查询对比、progaurd对比(mapping、usage)分析、apk信息查询/对比/反编译等共计十几项工具 。


推荐阅读