目录
一个成熟sdk,必然要经历 压缩包大小 / 瘦身的过程。尤其以SDK的形式接入一个第三方APP中。客户方是宿主APP,对第三方sdk会提出各种苛刻要求。如果APP是top级的,比如微信,QQ,滴滴打车,美团这类,居高临下 这类要求会更加难以回绝。
1 总揽
包大小优化,类似减肥的过程。主要分几种:
- 资源大小,图片,配置文件,字体库
- 代码交付物,aar/so/.a/
- 代码段
2 资源优化
1)图片大小,调整分辨率,或者对于可以延迟加载的走网络下载。
2)配置文件,压缩或者二进制化,
3)字体库尽可能裁剪掉,修改代码逻辑使用系统自带的字体。
3 代码交付物优化
so比.a要小很多,而且直接使用静态库集成到工程中,版本更新频繁会导致仓库空间爆掉。。尤其安卓分各种cpu架构,armeabi-v7a arm64-v8a x86_64 x86。.我们的android sdk仓库接近30G...
3.1 代码段优化
代码段统计方法:
按大小排序
size ./obj/local/armeabi-v7a/libxxx.a | awk '{print $1,$6,$8 | "$1 sort -n"}'
统计总量
size ./libglmaplib.a | awk '{a+=$1} END {print a}'
优化方法
1)模块化裁剪
- 抽离成动态库,独立下载, 比较难。
- 次之,通过静态宏控插拔,
针对宏控实现模块插拔,对每个模块的改造主要两种做法:
- 每个类模块的.h / .cpp 开始尾都用宏锁一层,,,改造面比较大。
- 如果模块化比较好,接口层用宏控做分流,下图:
2)模块复用
谨记DRY原则,尽可能服用代码。。
- 大的讲,比如多个三角化函数库,libtess / triangle;多个数据库 btree,sqlite,leveldb;多个图片编解码库,libpng,cute_png,stbimage。。
- 小的讲,相同模式的代码段抽离成函数,增大复用率。。
重复度,用一些代码静态扫描工具能够发现。
3)代码层级的优化,
- 宏定义用函数替代,
- 代码比较多的inline函数,去内敛化
- STL的使用有所节制,
- 数字字符转化用strtol/atoi/atof之类,别用sstream。避免引入ostream系列
- key为数字的尽量用数组 替换map,
- 大量定义static全局对象的头文件,避免多次被引用,
4)编译方式优化
- ndk的stl版本:stlport比c++_static 大很多。。
- C++ rtti,exception这类的去掉
- 编译优化 O2,
Author:ryfdizuo,https://blog.csdn.net/ryfdizuo/