Android App Bundle是一種改進的應用程序打包方式,能大幅度減少應用體積
unity可以直接導出appbundle,只需要在導出的時候勾選
但是通常項目有sdk離不開java端,我這里是用unity導出的gradle來做的
我的unity版本2018.4.0,android studio版本3.4
unity設置:
scripting backend選用il2cpp
armv7是肯定需要的;arm64在今后的版本提交android包必須要有,不然會給你警告;x86可選
arm64和x86勾選上的話,每個項通常會給包大小增加10M,(都勾選的話增加了20M)
所以,不管是為了谷歌新發布機制(以后都會用appbundle提包,apk會不再使用),還是為了減少包大小,app bundle是趨勢
File->Build Setting->(Android平台)Player Setting->Other Settings
設置完后導出gradle吧:File->Build Setting->(Android平台)勾選導出->Export
這是我導出的gradle:
打開build.gradle:
appbundle減少包大小,我所理解的是它將包內容拆分成各個包,然后根據手機類型來安裝它所需要的包,這樣多余的內容就不需要安裝進手機了(apk是將所有內容打包安裝進手機),從而減少包大小
開啟拆分:
android {
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
gradle工具版本:
build.gradle:
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
}
}
gradle-wrapper.properties:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
我之前打出appbundle包安裝到手機上啟動就會崩潰,然后查了資料,各種測試,發現gradle工具版本如果對應不上也是部分原因,
com.android.tools.build:gradle:3.2.0對應的是gradle-4.6-all.zip
前置條件完成(你得同步成功吧),接下來就是打包成appbundle了:
生成.aab文件:跟生成apk文件一樣,Android Studio里面Build->Generate Signed Bundle or APK->Android App Bundle
--------導出的key
編譯完成后的.aab文件就是我們需要的東西了,這個時候其實已經over了,如果測試沒問題,就可以用.aab文件發布了
接下來測試:
測試方法一:
測試工具:bundletool-all-0.6.0.jar 這個東西unity已經幫你下好了,路徑:Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools
步驟是,使用工具將.aab文件導出一個.apks文件,再用.apks文件安裝到你的手機上,
用到的命令行:
.aab文件導出.apks文件:
java -jar "工具bundletool-all-0.6.0.jar路徑" build-apks --bundle=".aab文件路徑" --output="導出的.apks文件路徑,你想放哪放哪" --ks="keystore路徑" --ks-key-alias="keystore別名" --ks-pass="keystore密碼"
.apks文件安裝到手機(需連接設備):
java -jar "工具bundletool-all-0.6.0.jar路徑" install-apks --apks=".apks文件路徑" --adb="adb路徑(xxx/adb.exe)"
測試方法二:
新建一個.sh文件,輸入下面內容,將對應的路徑和名字密碼改成你自己的,記住這里路徑不同於windows的c://xxxx,而是/c/xxx
#!/bin/sh
KEYSTORE=/C/Users/Administrator/Desktop/AndroidAppBundle/windforce_keystore
KS_ALIAS="windforce games"
PASS='pass:Wfwindforce123'
BUNDLETOOL_PATH=/C/Users/Administrator/Desktop/AndroidAppBundle/bundletool-all-0.6.0.jar
TMP_APKS_PATH=/C/Users/Administrator/Desktop/AndroidAppBundle/DragnMerge.apks
AAB_PATH=/C/Users/Administrator/Desktop/AndroidAppBundle/DragnMerge.aab
ADB_PATH=/G/Users/Administrator/AppData/Local/Android/Sdk/platform-tools/adb.exe
echo "Creating $TMP_APKS_PATH from $AAB_PATH"
java -jar $BUNDLETOOL_PATH build-apks --bundle=$AAB_PATH --output=$TMP_APKS_PATH \
--ks=$KEYSTORE --ks-key-alias="$KS_ALIAS" --ks-pass=$PASS && \
echo "Installing $TMP_APKS_PATH" && \
java -jar $BUNDLETOOL_PATH install-apks --apks=$TMP_APKS_PATH --adb=$ADB_PATH
保存.sh文件,你可以下載一個Git來運行它
----------------------------------------------------------------------------------------------------------------------------------------------
后記:
生成出來的.apks文件可以改后綴為.zip解壓看看里面的內容(此步驟可省略,只為看appbundle本質)
Google play到時候安裝到玩家手機上時,會自動根據玩家的機型配置安裝對應的.apk,達到減小包大小的目的
小米8測試:
安裝后大小對比
前面提到閃退,一個原因是gradle工具版本號不對應,另外一個原因就是我在unity里面使用了Marshal下面的這個函數public static IntPtr StringToCoTaskMemAnsi(string s);