讓APK只包含指定的ABI

        現在很多android第三方 sdk是以aar形式提供的,甚至是遠程aar,如果這個sdk對abi的支持比較全,可能會包含armeabi, armeabi-v7a,x86, arm64-v8a,x86_64五種abi,而你應用的其它so只支持armeabi,armeabi-v7a,x86三種,直接引用sdk的aar,會自動編譯出支持5種abi的包。

       但是應用的其它so缺少對其它兩種abi的支持,那麼如果應用運行於arm64-v8a,x86_64爲首選abi的設備上時,就會CRASH

       怎麼解決這個問題?其實arm64-v8a,x86_64這兩個abi應用並不是必須要做支持,手機一般都會提供自動兼容,像微信就是一個armeabi打天下。

       所以我們只要把對x86, arm64-v8a,x86_64的支持去掉就可以。怎麼去呢,之前想了一個比較笨的辦法,就是寫個腳本直接把lib目錄下對應的abi文件夾刪掉再重新簽名。

       後來找到兩個更方便的辦法

一、需要在build.gradle的android裏添加如下內容:

productFlavors {
    necess {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "x86"
            abiFilters "armeabi"
        }
    }
    abiall {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "x86"
            abiFilters "armeabi"
            abiFilters "arm64-v8a"
            abiFilters "x86_64"
        }
    }
}
生成apk的界面如下圖:

會分別生成app-abiall-release.apk和app-necess-release.apk

如果本來有做渠道包支持,只要添加對應的ndk.abiFilters即可,原理就是設置不同的渠道包指定不同的指令集

二、使用全局設置,這種方法對一般需求來說可能更爲實用

        build.gradle的android裏的defaultConfig內添加如下內容:

    defaultConfig {
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
    }
然後所有渠道包都會頂多包含此三種指令集


發佈了36 篇原創文章 · 獲贊 55 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章