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/

 

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