一个成熟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
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。