Android應(yīng)用從32位升級(jí)64位

最近收到小米、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)目沒有用到,因此就不贅述了。

最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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