¿Cuál es el<module>/release/output.json generado por Android Studio?
android-studio apk (6)
Recientemente noté un nuevo archivo generado en <module>/release/output.json
por Android Studio 3 Canary 1 cada vez que ejecuto Build
-> Generate Signed APK...
, que tiene los siguientes contenidos.
¿Alguien puede confirmar que también ve este comportamiento? ¿O se debe a alguna configuración local en mi computadora portátil?
¿Y alguien puede explicar el propósito de este archivo? ¿Es seguro agregar a .gitignore
?
[{
"outputType": {
"type": "APK"
},
"apkInfo": {
"type": "MAIN",
"splits": [],
"versionCode": 32
},
"outputFile": {
"path": "/path/to/the/generated/release/filename.apk"
},
"properties": {
"packageId": "com.example.android",
"split": ""
}
}]
Agrego ../../
al comienzo de outputFileName
, y el archivo APK se coloca en la carpeta de output
android{
applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = "../../output_name.apk"
}
}
}
Android studio 3.0 es responsable de este archivo. No necesita preocuparse por el archivo output.json.
Déjame explicarte esto:
Para versiones anteriores, lo que Android Studio hizo fue generar una APK firmada y ponerla en la carpeta de "salida". Incluso si tuviera múltiples dimensiones de sabor para su APK, todas ellas podrían ubicarse en el mismo directorio, que era la carpeta de salida. Desde la última versión de Android Studio 3.0 (canario y estable), han organizado esta estructura de archivos. Para cada dimensión de sabor, cada vez que firme una APK, tendrá una carpeta separada con un archivo output.json correspondiente. Este archivo no es más que una descripción de la fuente APK. Como puede ver, el archivo que compartió aquí describe el APK liberado.
Con las versiones anteriores de Android Studio, intenté nombrar automáticamente el apk de salida en función del resultado de git describe
. Sin embargo, mientras "Syncing Project with Gradle Files", Android Studio ejecutaba el script de Gradle una vez y capturaba la configuración de compilación, incluido el nombre del archivo de salida, y luego suponía que cada compilación continuaría usando el mismo nombre.
Entonces cada vez que creé una nueva confirmación, el nombre del archivo de salida real cambiaría. Pero Android Studio podría instalar la versión anterior o fallar si se hubiera limpiado.
Creo que output.json se ha agregado para permitir que Android Studio cargue todo lo que necesita saber sobre la última compilación, incluso si ha personalizado su script de gradle para cambiar algo de forma inesperada.
Este cambio no se menciona específicamente en las notas de la versión del complemento de gradle ( https://developer.android.com/studio/releases/gradle-plugin.html#3-0-0 ). Aunque hicieron un montón de cambios drásticos por razones de rendimiento. Para mí tiene sentido que prefieran ejecutar menos secuencias de comandos de Gradle al sincronizar. En su lugar, capturar información sobre los resultados de compilación directamente desde el proceso de compilación.
En respuesta a la elaborada respuesta de @wonsuc, puedes hacer que gradle elimine el archivo luego de una compilación exitosa agregando el siguiente código a la sección de android
:
android {
...
applicationVariants.all { variant ->
variant.assemble.doLast {
variant.outputs.each { output ->
delete "${output.outputFile.parent}/output.json"
}
}
}
}
Para cualquiera que quiera desactivar esta función, este es mi truco.
Simplemente elimina output.json
después de la generación.
applicationVariants.all { variant ->
variant.assemble.doLast {
def buildType = variant.buildType.name
def outputPath = ""
// If you use separated output path for both condition.
if (buildType == "debug") {
outputPath = "${buildDir}/outputs/apk"
}
if (buildType == "release") {
outputPath = "${rootDir}/apk"
}
println "outputPath:" + outputPath
delete "${outputPath}/yourFlavor1/${buildType}/output.json"
delete "${outputPath}/yourFlavor2/${buildType}/output.json"
delete "${outputPath}/yourFlavor.../${buildType}/output.json"
}
}
ouput.json
archivo ouput.json
es un tipo de archivo de metadatos para su APK generado. Este archivo se genera debido a varias razones. He encontrado algunos de ellos, que pueden no enumerar todos los casos de uso, pero esta es la lista:
- Se genera cuando se ejecuta
Generate Signed APK
Generado para el archivo
AndroidManifest.xml
en{module}/build/intermediates/manifest/androidTest/debug/ouput.json
No se genera para pruebas unitarias, sino que solo se genera para AndroidTests (que depende de que se ejecute el framework Android)
- El archivo
output.json
generado paraAndroidManifest.xml
en la ubicación especificada anteriormente es ligeramente diferente del generado para APK como lo mencionó. - Como puede ver, las propiedades descritas por el archivo
output.json
son muy similares a las propiedades que generalmente especificamos en nuestro archivobuild.gradle
, por lo que debe usarse y requerirse para que el proceso de compilación funcione correctamente (o puede que se genere como un resultado de compilación y extracción exitosas de las propiedades requeridas debuild.gradle
).
Sobre esto, podemos concluir que seguramente depende de que se genere el marco Android y está relacionado con la descripción de los detalles / información sobre el archivo APK o Manifiesto .
Personalmente, he intentado buscar en Google y encontrar una respuesta adecuada incluso en el sitio web de Desarrolladores de Android, pero parece que no se documenta nada sobre este archivo en detalle.
He revisado varios proyectos en GitHub y revisé el archivo
.gitignore
para el mismo, no pude encontrar ninguno del archivooutput.json
similar en ninguno de los proyectos alojados en GitHub. Por lo tanto, debería ser una buena práctica excluirlos en sus compromisos.En resumen, este archivo es un archivo descriptivo que contiene metadatos importantes sobre el proyecto. Debe estar allí por una razón. Te sugiero que no te metas con él ya que no sabemos en qué puede resultar.