最近收到小米、oppo、vivio應(yīng)用商店的通知,要求上架引用時(shí)提供64位的app包

其實(shí)從自?2019 年 8 月 1 日起, Google Play 上已經(jīng)要求發(fā)布的應(yīng)用必須支持64位架構(gòu),只是國(guó)內(nèi)的應(yīng)用商店都還沒有要求,那一些老的APP自然也不會(huì)進(jìn)行升級(jí),現(xiàn)在收到通知看來是不得不升級(jí)了。(心疼那些委托開發(fā)又不在維護(hù)的APP,又要淘汰一大批了)
google提供了升級(jí)的方法,https://developer.android.com/distribute/best-practices/develop/64-bit#test_your_app_on_64-bit_hardware,相信做Android移動(dòng)開發(fā)的應(yīng)該都能夠翻墻看的,這邊簡(jiǎn)單的描述一下操作步驟。
1.首先檢查您的APP是否包含原生庫代碼
若要確定應(yīng)用是否包含 64 位庫,最簡(jiǎn)單的方法就是檢查 APK 文件的結(jié)構(gòu)。在構(gòu)建時(shí),APK 會(huì)與應(yīng)用所需的所有原生庫打包在一起。原生庫會(huì)根據(jù)?ABI?存儲(chǔ)在不同的文件夾中。您的應(yīng)用不一定要支持所有 64 位架構(gòu),但對(duì)于支持的每種原生 32 位架構(gòu),應(yīng)用都必須包含相應(yīng)的 64 位架構(gòu)。
對(duì)于?ARM 架構(gòu),32 位庫位于?armeabi-v7a?中。 對(duì)應(yīng)的 64 位庫則位于?arm64-v8a?中。
對(duì)于 x86 架構(gòu),32 位庫位于?x86?中,64 位庫則位于?x86_64?中。
首先要確保這兩個(gè)文件夾中都有原生庫??偨Y(jié)如下:

請(qǐng)注意,每個(gè)文件夾中的一套庫可能完全相同,也可能不完全相同,這取決于應(yīng)用的具體情況。您應(yīng)達(dá)到的目標(biāo)是確保您的應(yīng)用能夠在僅支持 64 位架構(gòu)的環(huán)境中正常運(yùn)行。
通常情況下,同時(shí)針對(duì) 32 位和 64 位架構(gòu)構(gòu)建的 APK 或軟件包會(huì)具有這兩種 ABI 的文件夾,每個(gè)文件夾中都有一套相應(yīng)的原生庫。如果您的應(yīng)用不支持 64 位架構(gòu),那么您很可能會(huì)看到 32 位 ABI 文件夾,但沒有 64 位文件夾。
使用 APK 分析器查找原生庫
APK 分析器是一款可用于對(duì)構(gòu)建的 APK 進(jìn)行各方面評(píng)估的工具。針對(duì)我們目前所討論的情況,我們將使用該工具查找原生庫,以確定是否具備 64 位庫。
1.打開?Android Studio,然后打開任一項(xiàng)目。
2.從菜單中依次選擇?Build > Analyze APK…

3.選擇您要評(píng)估的 APK。
4.查看?lib?文件夾,您可以在其中找到“.so”文件。如果在您的應(yīng)用中找不到任何“.so”文件,則說明該應(yīng)用的相應(yīng)庫已準(zhǔn)備就緒,您無需采取進(jìn)一步措施。如果您看到?armeabi-v7a?或?x86,則說明您有 32 位庫。
5.檢查是否?arm64-v8a?或?x86_64?文件夾中有類似的“.so”文件。

6.如果您沒有任何?arm64-v8a?或?x86_64?庫,則需要更新構(gòu)建流程以開始構(gòu)建并打包 APK 中的這些工件。
7.如果您看到 32 位和 64 位的庫均已打包到軟件包中,則可以跳至在 64 位硬件上測(cè)試應(yīng)用。
通過解壓縮 APK 查找原生庫
APK 文件的結(jié)構(gòu)類似于 ZIP 文件,可以像 ZIP 文件一樣解壓縮。 如果您更喜歡使用命令行或任何其他解壓縮工具,也可以采用解壓縮 APK 的方法。
只需解壓縮 APK 文件(根據(jù)您使用的解壓縮工具,您可能需要將其重命名為 .zip),然后按照上文中的指南瀏覽解壓縮后的文件,即可確定您的應(yīng)用是否已經(jīng)為支持 64 位設(shè)備做好準(zhǔn)備了。
例如,您可以從命令行中運(yùn)行如下命令:
:: Command Line
> zipinfo -1 YOUR_APK_FILE.apk | grep \.so$
lib/armeabi-v7a/libmain.so
lib/armeabi-v7a/libmono.so
lib/armeabi-v7a/libunity.so
lib/arm64-v8a/libmain.so
lib/arm64-v8a/libmono.so
lib/arm64-v8a/libunity.so
請(qǐng)注意,此示例中存在?armeabi-v7a?庫和?arm64-v8a?庫,這表明該應(yīng)用支持 64 位架構(gòu)。
2.使用 64 位庫構(gòu)建應(yīng)用
使用 Android Studio 或 Gradle 進(jìn)行構(gòu)建
大多數(shù) Android Studio 項(xiàng)目都使用 Gradle 作為底層構(gòu)建系統(tǒng),因此本部分適用于使用這兩種工具進(jìn)行構(gòu)建的情況。針對(duì)原生代碼進(jìn)行構(gòu)建很簡(jiǎn)單,只需將?arm64-v8a?和/或?x86_64(視您要支持的架構(gòu)而定)添加到應(yīng)用的“build.gradle”文件中的?ndk.abiFilters?設(shè)置中即可:
// Your app's build.gradle
apply plugin: 'com.android.app'
android {
? compileSdkVersion 27
? defaultConfig {
? ? ? appId "com.google.example.64bit"
? ? ? minSdkVersion 15
? ? ? targetSdkVersion 28
? ? ? versionCode 1
? ? ? versionName "1.0"
? ? ? ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
// ...
當(dāng)然還能使用CMake和使用 ndk-build 進(jìn)行構(gòu)建,我的項(xiàng)目沒有用到,因此就不贅述了。