Cmake编译c++原生库如何过滤x86等其他架构的so库

在android studio2.2之前采用的是ndk编译,在build.gradle中的

android{
     buildTypes{
          ndk{
              abiFilters "armeabi"  
          }
     }  
}

就可以过滤掉很多市场占有率极少的cpu架构使用的so库,从而减小apk的体积,同时也能防止外部人员在模拟器上安装应用。那么采用Cmake的编译之后,该如何过滤掉多余的so库,来减小apk的体积呢?

image.png

一:cmake{abiFilters xxx}

使用下面的方法就可以过滤掉其他的so库。过滤掉之后,发现apk是不是轻盈很多来呢

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                abiFilters "armeabi"    //这里是打包的配置
                cppFlags ""
            }
        }
    }
}
image.png

二:ndk{ abiFilters xxx}

后来在读文档的过程中发现,之前的写法一样通用:

defaultConfig{
  ndk{
      abiFilters "x86","armeabi"   //这里是编译的配置
  }
}

三:以上两种的区别

我们在defaultConfig把二者都配置上,然后分析发现,其实最后起到决定作用的还是cmake中的abiFilters。

image.png
image.png

结论:也就是说,如果没有设置打包配置的话,编译配置了几个ABI,就会打包到apk中几个ABI。但是如果设置了打包配置,那么最终还是由打包配置决定到底会有几个so库会被打包到apk中。

附录
android studio 构建c++原生项目官方文档,该文档中对如何添加CMakeLists.txt,以及如何基本使用,都有一个基本的介绍。这里还有一个google提供的使用进阶
如果相对CMake有进一步的了解,可以参看CMake的官方wiki以及CMake官方文档。当然也可以优先查看

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容