在android studio2.2之前采用的是ndk编译,在build.gradle中的
android{
buildTypes{
ndk{
abiFilters "armeabi"
}
}
}
就可以过滤掉很多市场占有率极少的cpu架构使用的so库,从而减小apk的体积,同时也能防止外部人员在模拟器上安装应用。那么采用Cmake的编译之后,该如何过滤掉多余的so库,来减小apk的体积呢?
一:cmake{abiFilters xxx}
使用下面的方法就可以过滤掉其他的so库。过滤掉之后,发现apk是不是轻盈很多来呢
android {
defaultConfig {
externalNativeBuild {
cmake {
abiFilters "armeabi" //这里是打包的配置
cppFlags ""
}
}
}
}
二:ndk{ abiFilters xxx}
后来在读文档的过程中发现,之前的写法一样通用:
defaultConfig{
ndk{
abiFilters "x86","armeabi" //这里是编译的配置
}
}
三:以上两种的区别
我们在defaultConfig把二者都配置上,然后分析发现,其实最后起到决定作用的还是cmake中的abiFilters。
结论:也就是说,如果没有设置打包配置的话,编译配置了几个ABI,就会打包到apk中几个ABI。但是如果设置了打包配置,那么最终还是由打包配置决定到底会有几个so库会被打包到apk中。
附录
android studio 构建c++原生项目官方文档,该文档中对如何添加CMakeLists.txt,以及如何基本使用,都有一个基本的介绍。这里还有一个google提供的使用进阶。
如果相对CMake有进一步的了解,可以参看CMake的官方wiki以及CMake官方文档。当然也可以优先查看