随着数字化转型的不断深入,计算机应用领域的不断扩大,程序优化已经成为各行各业的关键技术之一。
尤其是为了预防山寨与盗版的发生,不少APP开发商主动选择“应用加固”保护知识产权,但给应用戴上“金钟罩”,必然在体积和运行效率上对用户体验造成不同程度的影响。
如何平衡安全性与应用性能是业界的一大难题。网易易盾在加固行业中适配了各种不同行业背景的APP,而对加固性能优化也有一定的沉淀和积累,以提高系统的稳定性、安全性、响应速度等方面的性能。
本文对一些通用的优化方法进行总结,主要分为程序体积优化、APK体积优化、内存优化、性能优化四大方向,为业界实践提供参考。
01程序体积优化程序的体积优化分为两类:一个是代码优化,另一个是编译优化。
代码优化
c++模板:使用模板带来的体积增量可能会超出预期,一开始模板代码的便利和体积膨胀可能成正比。如果面对体积相对敏感的场合,建议不要使用模板,改为实现通用的接口以减少体积。静态库:常见的静态库有stl中的string、map、vector等标准模板库,可能开发者只是使用了极少的功能,但会导致体积莫名增大几百k。因此,可自实现一些stl库,仅仅实现自己常用的算法和结构即可。
垃圾代码和重复代码:这和开发者实现和程序迭代有关,一般有较好的编码习惯的人而言,这部分能优化的点并不多。
编译优化
下面按照对体积影响、功能影响的综合因素进行排序,讲解如何优化编译后的程序体积。
Strip:Strip是一个用来去除可执行文件或动态连接库中符号表和调试信息等部分内容的工具。它可以将目标文件中的符号表、调试信息、注释等内容去除,从而减小可执行文件的大小,同时也会保护源代码的安全性。
导出符号优化:可执行程序或so有其特有的功能,而且开发者有预期的公开接口(符号),默认情况下,导出符号个数远大于开发者预留的口,可以通过编译选项version-script控制导出函数特征,从而减少程序体积。
符号哈希优化:可执行文件支持GNUhash和ELFhash两种格式,部分程序会生成两套hash值。其中GNUhash查找速度快,却可能不兼容一些低版本系统,而ELFhash没有兼容性问题。一般情况下,自定义的动态链接库不建议导出太多符号,而且少量的符号查找需要优化的空间并不大,所以可以强制使用ELFhash。
编译选项优化代码体积:编译器有专门的编译选项优化体积。测试体积优化较好的参数有下面几个:
O优化
参考链接: