今天遊戲包和管道包合并,成功回編生成apk之後,采用zipalign對齊優化,然後采用打包工具jarsigner簽名。
def Sign_haveback(input,signFile):
if len(signFile)==0:
signFile = default_signFile
output = input.split('.')[0] + '_sign.apk'
print(output)
order = jdkroot + '/bin/jarsigner -verbose -keystore ' + signFile + " -signedjar " + output + " " + input + " " + default_account + " -storepass " + default_password
ResultFile = os.system(order)
if ResultFile == 0:
return 'Success'
else:
return 'Fail'
然後迫不及待地安裝,爆出以下錯誤:
Failed to commit install session 679667849with command cmd package install-commit679667849.Error: -124: Failed parse duringinstallPackageLl: Targeting R+(version 30and above) requires the resources.arsc ofinstalled APKs to be stored uncompressedand aligned on a 4-byte boundary
target30出現的問題
按照以上失敗資訊提示:如果以 Android 11(API 級别 30)或更高版本為目标平台的應用包含壓縮的 resources.arsc 檔案或者如果此檔案未按 4 位元組邊界對齊,應用将無法安裝。如果存在其中任意一種情況,系統将無法對此檔案進行記憶體映射。無法進行記憶體映射的資源表必須讀入 RAM 中的緩沖區,進而給系統造成不必要的記憶體壓力,并大大增加裝置的 RAM 使用量。
看了下zipalign對齊結果,發現resources.arsc對齊了但是沒有壓縮,别的都壓縮和對齊了
滿足的啊,好像沒做錯啊。
對齊指令如下
zipalign -v 4 F:\example\game-file\dist\game.apk game_aligned.apk
做了幾遍發現沒錯,确實resources.arsc對齊了那麼也壓縮了。回想自己操作步驟,是采用的V1簽名。會不會這裡有問題,換為V2簽名。
java -jar apksigner.jar sign --ks test.jks --ks-key-alias testalias --ks-pass pass:xxx --key-pass pass:xxx --out F:\output.apk F:\game_aligned.apk
出包測試,這會正常了。
原來采用API30及以上的應用合并的時候除了對齊之外,還要使用v2簽名才可以