Use apktool, aapt2, bundletool para convertir apk a aab (Android App Bundle)

Escenarios encontrados en el desarrollo

  • En el artículo anterior, hablamos sobre el resumen del uso de la línea de comando AAPT2. Hay un escenario de uso en el que se convierte el apk en un archivo aab. El archivo aab es el formato de paquete especificado para la aplicación en Google Play. Vamos a practicarlo a continuación.
  • Si tenemos un requisito de escenario de este tipo, un juego o aplicación se conecta al SDK de agregación que desarrollamos y luego nos proporciona un paquete apk. Podemos usar la herramienta de empaquetado para integrar el SDK de canal específico o el complemento con el paquete apk. Ahora necesitamos que este paquete se publique en el extranjero, por lo que solo se lanzará el paquete aab.
  • Primero imprimimos el paquete apk integrado a través de la herramienta de empaquetado y luego procesamos el apk

Herramientas utilizadas en la práctica.

Implementado usando la línea de comando

  • Primero elija un directorio, copie el apktool descargado, aapt2, bundletool, android.jar y otras herramientas a este directorio, para que podamos ejecutar comandos, y prepare un apk empaquetado para cambiar el directorio, como mi directorio recién creado D:\ espacio de trabajo\LCQ\apk-aab:
  • A continuación, ingresamos cmd en la barra de direcciones del archivo y presionamos Enter para ingresar a la interfaz de comando cmd
  • Use el comando apktool para descompilar el paquete app-release.apk y ejecute el comando
    java -jar apktool_2.6.1.jar d app-release.apk -s -o decode_apk

    Nos centramos en la carpeta res después de la descompilación. Los archivos de recursos en res deben compilarse con aapt2 para generar archivos que cumplan con los requisitos de formato de búfer del protocolo de Google.

  •  Usamos el comando de compilación de aapt2 para compilar la carpeta res

    aapt2 compile --dir decode_apk\res -o compiled_resources.zip

    Puede ver que el archivo zip generado contiene archivos binarios con el sufijo .flat o arsc.flat

  • Luego usamos el comando de enlace de aapt2 para generar una base.apk

    aapt2 link --proto-format -o base.apk -I android.jar --manifest decode_apk\AndroidManifest.xml -R compiled_resources.zip --auto-add-overlay

    Descomprimimos el archivo base.apk, creamos una nueva carpeta de manifiesto, movemos el archivo AndroidManifest.xml a ella y luego copiamos los activos y lib en el directorio (decode_apk) generado por la descompilación de apktool a la base, y agregamos el sufijo .dex Copiar todos los archivos a module/dex, copie unknown y kotlin a module/root, y el directorio final se verá así

  • Luego seleccionamos todos los archivos y directorios bajo el módulo y los comprimimos en un archivo .zip, como se muestra en la figura

    Asegúrese de que el directorio base no esté comprimido después de abrir el archivo zip comprimido, copiamos el archivo base.zip comprimido en el mismo directorio que bundletool, 

  • Cuando copiamos, debemos prestar atención para no confundir el directorio generado por la descompilación y el recurso del directorio base descomprimido generado por el enlace aapt2, de lo contrario, el comando bundletool fallará, como InvalidProtocolBufferException

    [BT:1.12.1] Error: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
    java.io.UncheckedIOException: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
            at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntry(BundleModule.java:418)
            at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntries(BundleModule.java:399)
            at com.android.tools.build.bundletool.model.utils.BundleModuleParser.parseBundleModuleInternal(BundleModuleParser.java:66)
            at com.android.tools.build.bundletool.model.utils.BundleModuleParser.parseAppBundleModule(BundleModuleParser.java:41)
            at com.android.tools.build.bundletool.validation.BundleModulesValidator.lambda$validate$0(BundleModulesValidator.java:75)
            at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
            at java.base/java.util.Collections$2.tryAdvance(Collections.java:4747)
            at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4755)
            at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
            at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
            at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
            at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
            at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
            at com.android.tools.build.bundletool.validation.BundleModulesValidator.validate(BundleModulesValidator.java:76)
            at com.android.tools.build.bundletool.commands.BuildBundleCommand.execute(BuildBundleCommand.java:231)
            at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:78)
            at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:54)
    Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
            at com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:129)
            at com.google.protobuf.CodedInputStream$StreamDecoder.checkLastTagWas(CodedInputStream.java:2124)
            at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:217)
            at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:232)
            at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:237)
            at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:48)
            at com.google.protobuf.GeneratedMessageV3.parseWithIOException(GeneratedMessageV3.java:339)
            at com.android.aapt.Resources$XmlNode.parseFrom(Resources.java:44493)
            at com.android.tools.build.bundletool.model.BundleModule$SpecialModuleEntry$1.addToModule(BundleModule.java:459)
            at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntry(BundleModule.java:416)
            ... 16 more
    
  • Luego usamos el comando bundletool para generar el archivo aab, ejecute el comando

    java -jar bundletool-all-1.12.1.jar build-bundle --modules=base.zip --output=module.aab

    Puede ver que se ha generado el archivo aab. Ahora es imposible usar la herramienta bundletool para instalarlo y probarlo directamente, porque aún no se ha firmado. La firma aab solo puede ser firmada por jarsigner, no apksigner 

  • Use el comando jarsigner para firmar base.aab

    jarsigner -digestalg SHA1 -sigalg SHA1withRSA -keystore 你的签名文件.jks -storepass 秘钥文件密码 -keypass 秘钥密码 base.aab 别名
    
  • Puede ver que la firma es exitosa y se genera el directorio META-INF, que contiene el archivo de información de la firma.

     El archivo base.aab firmado se puede usar para probar y cargar Google Play

  • Si desea probar el archivo aab, también debe usar la línea de comando de bundletool. Primero, permitamos que adb se conecte al dispositivo y genere el archivo json de información del dispositivo.

    java -jar bundletool-all-1.12.1.jar get-device-spec --output=./device-spec.json
  • Luego genera apks

    java -jar bundletool-all-1.12.1.jar build-apks --bundle=base.aab --output=abase.apks --overwrite --ks=你的签名文件.jks --ks-pass=pass:"111111" --ks-key-alias=别名--key-pass=pass:"111111"
    
  • Luego instale los apks en el dispositivo correspondiente

    ava -jar bundletool-all-1.12.1.jar install-apks --apks=base.apks

Sugerencia: como usamos el apk para generar aab por nosotros mismos, puede haber omisiones de archivos en el proceso de procesamiento medio, casos especiales que no han sido procesados, etc. Debe ser que el aab generado por AS es más confiable, y es se recomienda usar el aab generado por AS para poner su propia aplicación en el estante

Supongo que te gusta

Origin blog.csdn.net/qq_19942717/article/details/127716913
Recomendado
Clasificación