目錄
一個成熟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/