Qué es / release / output.json generado por Android Studio


Recientemente noté un nuevo archivo generado en <module>/release/output.json por Android Studio 3 Canary 1 cada vez que corro Build -> Generate Signed APK..., que tiene contenidos que parecen los siguientes.

¿Puede alguien confirmar ver este comportamiento también? ¿O es debido a alguna configuración local en mi computadora portátil?

¿Y puede alguien explicar el propósito de este archivo? ¿Es seguro añadir 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": ""
  }
}]
Author: Vadim Kotov, 2017-05-26

6 answers

Android studio 3.0 es responsable de este archivo. No necesita preocuparse por la salida.archivo json.

Déjame explicarte esto:

Para las versiones anteriores, lo que Android Studio hizo fue generar un APK firmado y ponerlo en la carpeta "salida". Incluso si tuviera varias dimensiones de sabor para su APK, todas podrían estar ubicadas en el mismo directorio, que era la carpeta de salida. Desde la última versión de Android Studio 3.0 (canary y stable), han organizado esta estructura de archivos. Para cada dimensión de sabor, cada vez que firme un APK, tendrá una carpeta separada con una salida correspondiente.archivo json en él. Este archivo no es más que una descripción del APK fuente. Como puedes ver, el archivo que compartiste aquí describe el APK lanzado.

 12
Author: hooray_todd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 07:10:44

ouput.json file es una especie 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 aquí está la lista:

  1. Generado cuando se ejecuta Generate Signed APK
  2. Generado para el archivo AndroidManifest.xml bajo

    {module}/build/intermediates/manifest/androidTest/debug/ouput.json
    
  3. Se genera no para pruebas unitarias, sino solo para pruebas AndroidTests (que depende del marco de Android para ser ejecutado)

  4. El archivo output.json generado para AndroidManifest.xml en la ubicación especificada anteriormente es ligeramente diferente del generado para APK como ha mencionado.
  5. Como puede ver, las propiedades descritas por el archivo output.json son muy similares a las propiedades que generalmente especificamos en nuestro archivo build.gradle, por lo que debe usarse y ser requerido para que el proceso de compilación funcione correctamente (o podría generarse como resultado de la compilación exitosa y la extracción de las propiedades requeridas de build.gradle).

Sobre esto, podemos concluir que seguramente depende del marco de trabajo de Android que se genere y está relacionado con describir los detalles/información sobre el archivo APK o Manifest.

  • Personalmente he intentado Google y encontrar una respuesta adecuada a esto incluso en el sitio web de desarrolladores de Android, pero parece que no se documenta nada sobre este archivo en detalle.

  • He comprobado varios proyectos en GitHub & checked .gitignore para el mismo archivo, no pude encontrar ninguno de los archivos output.json similares en ninguno de los proyectos alojados en GitHub. Por lo tanto, debería ser una buena práctica excluirlos en tus commits.

  • En resumen, este archivo es un archivo descriptivo que contiene metadatos importantes sobre el proyecto. Debe estar ahí por una razón. Le sugeriría que no se metiera con él, ya que no sabemos lo que puede resultar.

 3
Author: Sneh Pandya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-07 09:54:32

Para cualquiera que quiera desactivar esta función, aquí está 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"
    }
}
 1
Author: wonsuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-08 02:03:47

En respuesta a la elaborada respuesta de @wonsuc, puedes hacer que gradle elimine el archivo tras una compilación exitosa agregando el siguiente código a la sección android:

android {
    ...
    applicationVariants.all { variant ->
        variant.assemble.doLast {
            variant.outputs.each { output ->
                delete "${output.outputFile.parent}/output.json"
            }
        }
    }
}
 1
Author: Abandoned Cart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 06:26:07

Agrego ../../ al principio del outputFileName, y el archivo APK se coloca en la carpeta output

android{
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            output.outputFileName =   "../../output_name.apk"
        }
    }
}
 -1
Author: ZengLH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-29 06:05:10

Con versiones anteriores de Android Studio, había intentado nombrar automáticamente el apk de salida basado en la salida de git describe. Sin embargo, mientras" Sincronizaba el proyecto con los archivos de Gradle", Android Studio ejecutaría el script de gradle una vez y capturaría la configuración de compilación, incluido el nombre del archivo de salida, y luego asumiría que cada compilación seguiría usando el mismo nombre.

Así que cada vez que creaba una nueva confirmación, el nombre de archivo de salida real cambiaba. Pero Android Studio instalaría el viejo versión o fallar si se había limpiado.

Creo que la salida.se ha agregado json para permitir que Android Studio cargue todo lo que necesita saber sobre la última compilación, incluso si has personalizado tu script de gradle para cambiar algo de una manera 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 para razones de rendimiento. Tiene sentido para mí que prefieran ejecutar menos de tu script de gradle al sincronizar. En su lugar, capturar información sobre los resultados de compilación directamente desde el proceso de compilación.

 -1
Author: Jeremy Lakeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-13 06:49:21