前言:
根據(jù)Google Play的政策要求,自 2021 年 8 月起察署,Google Play 將開始要求新應(yīng)用使用 Android App Bundle(以下簡稱aab) 進(jìn)行發(fā)布梢莽。該格式將取代 APK 作為標(biāo)準(zhǔn)發(fā)布格式是偷。
想了解更多關(guān)于aab的介紹可以直接閱讀android官方文檔膘融,有詳細(xì)的說明developer.android.com/guide/app-b…
正常情況:直接Android Studio上面點(diǎn)擊打包或者用Gradle命令直接生成一個aab马昙,交給運(yùn)營提包到Google Play商店上面去茵瘾,任務(wù)完成踢关,下班~ 。
存在問題:我沒有工程库物,也沒有源碼霸旗,到我手上的就只有一個apk,走google提供的方案就不行了戚揭。
思 考:我們常做的事情是把a(bǔ)pk拿過來诱告,反編譯一下,修改修改代碼民晒,換換參數(shù)精居,然后重新打成新apk。 apk和aab都是同一個項(xiàng)目生成的潜必,代碼資源都一樣靴姿,那么可不可以相互轉(zhuǎn)化?
查資料ing.....
本文向大家介紹如何從apk一步步轉(zhuǎn)化成aab磁滚,文末提供本文所使用到的工具&python腳本源碼
需要工具
bundletool-all-1.6.1.jar
bundletool.jar 是google提供生成&測試aab的工具佛吓,gradle打包里面也是使用的這個工具。
獲取方式github: github.com/google/bund…
詳細(xì)文檔&使用方法: developer.android.com/studio/comm…-
aapt2
aapt全稱Android Asset Packaging Tool是Android資源打包工具垂攘。
獲取方式ANDROID SDK: $ANDROID_SDK/build-tools/30.0.3/aapt2
獲取方式google maven: dl.google.com/dl/android/…
詳細(xì)文檔&使用方法:developer.android.com/studio/comm… apktool_2.5.0.jar
反編譯安卓apk工具维雇。
獲取方式github: github.com/iBotPeaches…android.jar
android framework,提供了系統(tǒng)的資源和api。
獲取方式ANDROID SDK: $ANDROID_SDK/platforms/android-30/android.jar
apk生成aab
Android Studio打包可選Android App Bundle(aab)晒他,并提供詳細(xì)教程吱型,本文不再說明。
解壓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):
./decode_apk_dir
├── AndroidManifest.xml
├── apktool.yml
├── assets
├── classes2.dex
├── classes.dex
├── lib
├── original
├── res
└── unknown
編譯資源
編譯資源使用aapt2編譯生成 *.flat文件集合
aapt2 compile --dir decode_apk_dir\res -o compiled_resources.zip
復(fù)制代碼
生成compiled_resources.zip文件
為什么要加.zip的后綴陨仅,不和谷歌官方文檔一樣直接生成compiled_resources文件津滞,或者compiled_resources文件夾铝侵。此處為了windows能正常的編譯打包,linux和mac隨意~
關(guān)聯(lián)資源
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.apk
通過unzip解壓到base文件夾触徐,目錄結(jié)構(gòu):
./base
├── AndroidManifest.xml
├── res
└── resources.pb
拷貝資源
以base文件夾為根目錄
創(chuàng)建 base/manifest 將 base/AndroidManifest.xml 剪切過來
拷貝assets , 將 ./temp/decode_apk_dir/assets 拷貝到 ./temp/base/assets
拷貝lib咪鲜, 將 ./temp/decode_apk_dir/lib 拷貝到 ./temp/base/lib
拷貝unknown, 將 ./temp/decode_apk_dir/unknown 拷貝到 ./temp/base/root
拷貝kotlin锌介, 將 ./temp/decode_apk_dir/kotlin拷貝到 ./temp/base/root/kotlin
拷貝META-INF,將./temp/decode_apk_dir/original/META-INF 拷貝到 ./temp/base/root/META-INF (刪除簽名信息.RSA猾警、.SF孔祸、*.MF)
創(chuàng)建./base/dex 文件夾,將 ./decode_apk_dir/*.dex(多個dex都要一起拷貝過來)
base/manifest ============> base/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
decode_apk_dir/original/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格式
編譯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 luojian37.jks \
-storepass ****** \
-keypass ****** \
base.aab \
******
注意:您不能使用 apksigner
為 aab 簽名崔慧。簽名aab的時候不需要使用v2簽名,使用JDK的普通簽名就行穴墅。
測試
此時我們已經(jīng)拿到了一個aab的包惶室,符合Google Play的上架要求,那么我們要確保這個aab的包是否正常呢玄货?作為一個嚴(yán)謹(jǐn)?shù)某绦騿T還是得自己測一下皇钞。
上傳Google Play
上傳Google Play的內(nèi)部測試,通過添加測試用戶從Google Play去下載到手機(jī)測試松捉。更加能模擬真實(shí)的用戶環(huán)境夹界。
bundletool安裝aab(推薦)
每次都上傳到Google Play上面去測試,成本太高了隘世,程序員一般沒上傳權(quán)限可柿,運(yùn)營也不在就沒法測試了。此時我們可以使用bundletool模擬aab的安裝丙者。
連接好手機(jī)复斥,調(diào)好adb,執(zhí)行bundletool命令進(jìn)行安裝
1.從 aab 生成一組 APK
java -jar bundletool-all-1.6.1.jar build-apks \
--bundle=base.aab \
--output=base.apks \
--ks=luojian37.jks \
--ks-pass=pass:****** \
--ks-key-alias=****** \
--key-pass=pass:******
2.將 APK 部署到連接的設(shè)備
java -jar bundletool-all-1.6.1.jar install-apks --apks=base.apks
還原成apk
竟然apk可以轉(zhuǎn)化成aab械媒,同樣aab也可以生成apk目锭,而且更加簡單
java -jar bundletool-all-1.6.1.jar build-apks \
--mode=universal \
--bundle=base.aab \
--output=test.apks \
--ks=luojian37.jks \
--ks-pass=pass:****** \
--ks-key-alias=****** \
--key-pass=pass:******
此時就可以或得一個test.apks
的壓縮包,解壓這個壓縮包就有一個universal.apk
纷捞,和開始轉(zhuǎn)化的apk幾乎一樣侣集。
原文作者:https://juejin.cn/post/6982111395621896229
最后總結(jié)
在此感謝37互娛的同學(xué) 因?yàn)楣居袀€需求是要能修改aab里面的部分內(nèi)容 所以我個人的思路是把別人提供的apk 拆包后修改里面部分內(nèi)容然后重新編譯后 修改重新編譯簽名成新的apk 然后通過37互娛同學(xué)提供的腳本工具 來轉(zhuǎn)換成aab 還有aab 先轉(zhuǎn)apk 然后拆包修改里面部分 重新編譯 然后再用腳本轉(zhuǎn)成aab 即可 在此感謝37互娛的同學(xué)提供方案和腳本 希望給后人多些幫助 減少被坑的概率 最后希望我的文章能幫助到各位解決問題 ,以后我還會貢獻(xiàn)更多有用的代碼分享給大家兰绣。各位同學(xué)如果覺得文章還不錯 世分,麻煩給關(guān)注和star,小弟在這里謝過啦!