Cmake編譯c++原生庫(kù)如何過(guò)濾x86等其他架構(gòu)的so庫(kù)

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

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

就可以過(guò)濾掉很多市場(chǎng)占有率極少的cpu架構(gòu)使用的so庫(kù),從而減小apk的體積,同時(shí)也能防止外部人員在模擬器上安裝應(yīng)用。那么采用Cmake的編譯之后,該如何過(guò)濾掉多余的so庫(kù),來(lái)減小apk的體積呢?

image.png

一:cmake{abiFilters xxx}

使用下面的方法就可以過(guò)濾掉其他的so庫(kù)。過(guò)濾掉之后,發(fā)現(xiàn)apk是不是輕盈很多來(lái)呢

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

二:ndk{ abiFilters xxx}

后來(lái)在讀文檔的過(guò)程中發(fā)現(xiàn),之前的寫(xiě)法一樣通用:

defaultConfig{
  ndk{
      abiFilters "x86","armeabi"   //這里是編譯的配置
  }
}

三:以上兩種的區(qū)別

我們?cè)赿efaultConfig把二者都配置上,然后分析發(fā)現(xiàn),其實(shí)最后起到?jīng)Q定作用的還是cmake中的abiFilters。

image.png
image.png

結(jié)論:也就是說(shuō),如果沒(méi)有設(shè)置打包配置的話(huà),編譯配置了幾個(gè)ABI,就會(huì)打包到apk中幾個(gè)ABI。但是如果設(shè)置了打包配置,那么最終還是由打包配置決定到底會(huì)有幾個(gè)so庫(kù)會(huì)被打包到apk中。

附錄
android studio 構(gòu)建c++原生項(xiàng)目官方文檔,該文檔中對(duì)如何添加CMakeLists.txt,以及如何基本使用,都有一個(gè)基本的介紹。這里還有一個(gè)google提供的使用進(jìn)階。
如果相對(duì)CMake有進(jìn)一步的了解,可以參看CMake的官方wiki以及CMake官方文檔。當(dāng)然也可以?xún)?yōu)先查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容