腾讯|5年磨一剑|优酷Android包瘦身治理思路全解(12)


单点瘦身 , 是指在源代码层面 , 通过去除无用、合并冗余、修正不合理等方式实现瘦身 , 其核心特点可以归纳为“源头处理 , 轻爽健康” 。 由于需要在源码级别操作 , 因此只能针对有源码工程的自研代码 , 对于无源码的二、三方SDK则无法实施(其实也可以在字节码层面改造sdk , 非常规方案) 。 另外 , 之所以称为“单点”瘦身 , 是因为需要对每一个具体的可瘦身点进行改造、验证并上线 , 因此最好是对代码最熟悉并负责的同学直接上手改造 , 这类瘦身的应用难度整体较低 , 但是涉及研发同学范围很广 , 改造周期通常也非常之久 , 同时在瘦身效果上一般会比较缓慢 。
这里划分了9个单点瘦身技术 , 在优酷自研的包大小分析工具中 , 均实现了对应的检测分析能力 , 具体可以参考前文「分析技术」章节 , 这里简单列出:
【代码】线上无用类 【资源】超大 【资源】无用 【资源】多维度 【资源】无透明度png图片 【资源】相似 【so】静态链接C++ STL 【so】链接非标准C++STL 【so】无用导出符号 另外 , 无用和冗余的去除 , 本身就是一种代码质量的提升 , 也可以明显降低工程腐化程度 , 同时对构建耗时也会有正向收益 。
还能做些什么 包瘦身是移动app领域长期存在的一个工程问题 , 无论是否关注和治理 , 其影响始终客观存在 。 接下来聊聊一些相关的思考 , 希望能够给感兴趣的同学带来一些有价值的参考和启发 。
5.1 决心
任何新需求迭代几乎不可能做到0代码增加 , 因此包大小天然是一个与代码增量“对抗”的事情 , 但又不像稳定性、性能一样可以产生立即、直接的影响 , 所以在写代码时很容易被忽视 。 如果包瘦身的重要性并没有在app全开发团队上下 , 获得一致性的认可以及足够的决心 , 即使相关技术、卡口能力、治理策略再怎么完善 , 也无法在这场“包瘦身持久战”中始终利于不败之地 。
前文所属的常态化治理模式下 , 各种技术支撑以及治理策略 , 究其本质都是为了将“对包大小的考量”融入到每一名研发同学的代码思维中 , 这样才能够在coding阶段就尽可能减少包大小不友好代码的产生 。 “不产生”比“产生了再治理” , 在对研发同学技术能力的要求上 , 恐怕要高出不止一个段位 。 在追求卓越工程师的路上 , 不妨把代码对包大小的影响也纳入进来吧 。
5.2 以包大小为支点
“穷则独善其身 , 达则兼济天下” , 当包瘦身治理已经处于良好的常态化治理局面时 , 由于包瘦身本质还是对app工程中不合理代码的改进 , 因此不妨以包大小为支点 , 撬动用户体验、工程(代码)质量等其它方面的提升 。 各种以瘦身作为“导火索”的代码清理、优化、改造 , 实际上是对app整体工程和代码健康度的有效提升 , 也是促使业务间功能复用的重要推动力量 。 而这些代码和业务功能设计层面的提高 , 长期来看也会对app稳定性、性能、研发效率等的全面提升 , 具有很好的促进作用 。
5.3 探索实践永不止步
虽然优酷的包大小治理 , 已经处于可持续的常态化治理模式 , 但瘦身相关的技术探索 , 以及现有技术的完整落地实践 , 还没有到结束的时候 。 很多存量技术问题仍有待挖掘 , 例如:对于动态链接库so的检测分析技术 , 还有不少可以探索的方向;对于混淆规则精简 , 如何能够提供更有效的辅助工具 , 进一步降低分析、改造、验证的成本和风险 , 也是一件很有挑战的事情;对于各种中间件 , 如何能够作出对包大小更友好的设计和迭代 , 这也已经超出个人、单个组织所能够完成的范围 , 但是如何能够对此带来更好的影响和改变也值得思考 。 新技术的趋势和影响也需要及时关注:AndroidX包含的新组件、新开发模式 , 各种手机厂商的特色能力sdk不断引入等等 , 都会带来新的机遇和挑战 。