根據(jù)Google Play的政策要求怕午,自 2021 年 8 月起,Google Play 將開始要求新應(yīng)用使用 Android App Bundle(以下簡稱aab) 進(jìn)行發(fā)布沦零。該格式將取代 APK 作為標(biāo)準(zhǔn)發(fā)布格式
正常情況下直接用AS的打包生成aab就可以滿足需求,上傳到Google play了辐赞。
但是會(huì)有這么一個(gè)問題钾埂,并不是所有時(shí)候你都可以拿到一個(gè)游戲工程或者源碼的,如果給你的是一個(gè)apk包断楷,那你怎么辦呢锨匆?
接下來,就向大家介紹如何從apk一步步轉(zhuǎn)化成aab冬筒。
需要工具
bundletool-all-1.6.1.jar
bundletool.jar 是google提供生成&測試aab的工具恐锣,gradle打包里面也是使用的這個(gè)工具。
獲取方式github: github.com/google/bundletool/releases
詳細(xì)文檔&使用方法: developer.android.com/studio/command-line/bundletoolapktool_2.5.0.jar
反編譯安卓apk工具舞痰。
獲取方式github: github.com/iBotPeaches…aapt2
aapt全稱Android Asset Packaging Tool是Android資源打包工具土榴。
獲取方式ANDROID SDK: $ANDROID_SDK/build-tools/30.0.3/aapt2
詳細(xì)文檔&使用方法:developer.android.com/studio/command-line/aapt2android.jar
android framework,提供了系統(tǒng)的資源和api。
獲取方式ANDROID SDK: $ANDROID_SDK/platforms/android-30/android.jar
apk生成aab
解壓apk
通過apktool去解壓apk包
java -jar apktool_2.5.0.jar d test.apk -s -o decode_apk_dir
解壓apk后 decode_apk_dir 目錄結(jié)構(gòu):
編譯資源
編譯資源使用aapt2編譯生成 *.flat文件集合
aapt2 compile --dir decode_apk_dir\res -o compiled_resources.zip
生成compiled_resources.zip文件
關(guān)聯(lián)資源
生成base.apk
aapt2 link --proto-format -o base.apk -I android_30.jar
--min-sdk-version 19
--target-sdk-version 29
--version-code 1
--version-name 1.0
--manifest decode_apk_dir\AndroidManifest.xml
-R compiled_resources.zip
--auto-add-overlay
解壓base.apk
解壓到base文件夾匀奏,目錄結(jié)構(gòu):
拷貝資源
創(chuàng)建base文件夾鞭衩,以base文件夾為根目錄
將解壓得到的resources.pb拷貝到 ./temp/base/resources.pb
將解壓得到的res拷貝到 ./temp/base/res
創(chuàng)建manifest文件夾, 將解壓得到的AndroidManifest.xml拷貝到 ./temp/base/manifest
拷貝assets , 將 ./temp/decode_apk_dir/assets 拷貝到 ./temp/base/assets
拷貝lib娃善, 將 ./temp/decode_apk_dir/lib 拷貝到 ./temp/base/lib
創(chuàng)建root文件夾论衍,拷貝unknown, 將 ./temp/decode_apk_dir/unknown 拷貝到 ./temp/base/root/unknown
拷貝kotlin聚磺, 將 ./temp/decode_apk_dir/kotlin拷貝到 ./temp/base/root/kotlin
root目錄下創(chuàng)建META-INF文件夾坯台,得到 ./temp/base/root/META-INF
創(chuàng)建dex 文件夾,將 ./temp/decode_apk_dir/*.dex拷貝到 ./temp/base/dex(多個(gè)dex都要一起拷貝過來)
base/resources.pb ============> base/resources.pb
base/res ============> base/res
base/AndroidManifest.xml ============> base/manifest/AndroidManifest.xml
decode_apk_dir/assets ============> base/assets
decode_apk_dir/lib ============> base/lib
decode_apk_dir/unknown ============> base/root
decode_apk_dir/kotlin ============> base/root/kotlin
創(chuàng)建META-INF ============> base/root/META-INF
decode_apk_dir/.dex ============> base/dex/.dex
最終的目錄結(jié)構(gòu)
base/
├── assets
├── dex
├── lib
├── manifest
├── res
├── resources.pb
└── root
壓縮資源
將base文件夾瘫寝,壓縮成base.zip 一定要zip格式
注意:壓縮后雙擊打開顯示的是所有資源蜒蕾,而不是顯示base稠炬,點(diǎn)擊base再顯示所有資源;否則會(huì)報(bào)AndroidManifest.xml找不到的錯(cuò)
編譯aab
打包app bundle需要使用bundletool
java -jar bundletool-all-1.6.1.jar build-bundle --modules=base.zip --output=base.aab
aab簽名
jarsigner -digestalg SHA1 -sigalg SHA1withRSA
-keystore <簽名文件路徑>
-storepass <簽名文件密碼>
-keypass <簽名文件密碼>
base.aab
<簽名文件別名>
注意:您不能使用 apksigner 為 aab 簽名咪啡。簽名aab的時(shí)候不需要使用v2簽名首启,使用JDK的普通簽名就行。
測試與安裝
限于篇幅撤摸,Aab的測試與安裝放在下一篇文章
詳見Aab(Android App Bundle)測試與安裝
結(jié)束語
過程中有問題或者需要交流的同學(xué)毅桃、獨(dú)立開發(fā)者同學(xué)、都可以私信我拉群(加好友的備注下准夷,因?yàn)锳pk轉(zhuǎn)Aab和獨(dú)立開發(fā)俱樂部钥飞,是分開的兩個(gè)群)
關(guān)于腳本
鑒于很多同學(xué)想要Apk轉(zhuǎn)Aab腳本,決定免費(fèi)分享衫嵌。
各位大佬可以在評(píng)論區(qū)留下你們的Github賬號(hào)读宙,我會(huì)給你們開放Collaborators權(quán)限,腳本可以一行命令直接轉(zhuǎn)換楔绞。