天天看點

Android 11(API 級别 30)的應用zipalign對齊之後安裝不了的原因

作者:3tang

今天遊戲包和管道包合并,成功回編生成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'           
Android 11(API 級别 30)的應用zipalign對齊之後安裝不了的原因

然後迫不及待地安裝,爆出以下錯誤:

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

Android 11(API 級别 30)的應用zipalign對齊之後安裝不了的原因

target30出現的問題

按照以上失敗資訊提示:如果以 Android 11(API 級别 30)或更高版本為目标平台的應用包含壓縮的 resources.arsc 檔案或者如果此檔案未按 4 位元組邊界對齊,應用将無法安裝。如果存在其中任意一種情況,系統将無法對此檔案進行記憶體映射。無法進行記憶體映射的資源表必須讀入 RAM 中的緩沖區,進而給系統造成不必要的記憶體壓力,并大大增加裝置的 RAM 使用量。

看了下zipalign對齊結果,發現resources.arsc對齊了但是沒有壓縮,别的都壓縮和對齊了

Android 11(API 級别 30)的應用zipalign對齊之後安裝不了的原因

滿足的啊,好像沒做錯啊。

對齊指令如下

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簽名才可以

繼續閱讀