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.
- apktool, una herramienta para descompilar y compilar apk, dirección de descarga: Apktool: una herramienta para la ingeniería inversa de aplicaciones de Android binarias, cerradas y de terceros.
- bundletool, una herramienta de línea de comandos para crear paquetes de aplicaciones y paquetes SDK usted mismo, dirección de descarga: Lanzamientos · google/bundletool · GitHub
- aapt2, es una herramienta de compilación que analiza recursos, indexa recursos y compila recursos en un formato binario optimizado para la plataforma Android, en el directorio SDK instalado
android_sdk/build-tools/version/下找到aapt2,也可以最新的版本,比如下载3.2.0-alpha18-4804415版本,其他版本替换地址里面的版本就可以了
: https://dl.google.com/dl/android /maven2/com/ android/tools/build/aapt2/8.0.0-alpha07-9193536/aapt2-8.0.0-alpha07-9193536-windows.jar - android.jar, el kit de desarrollo de SDK proporcionado por Android, se puede encontrar en
android_sdk
/plataformas/ /version
- jarsigner, una herramienta de firma, en el directorio bin JDK instalado, la variable de entorno jdk está configurada para ejecutar la línea de comando directamente
- Instale JDK y configure las variables de entorno para facilitar la ejecución de comandos en la ventana cmd
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