C++ SDK包大小優化實踐

目錄

1 總攬

2 資源優化

3 代碼交付物優化

3.1 代碼段優化

優化方法


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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章