Android Studio 生成的 <module>/release/output.json 是什么

What is the <module>/release/output.json generated by Android Studio

我最近注意到每次 运行 Build -> Generate Signed APK... 时 Android Studio 3 Canary 1 在 <module>/release/output.json 生成了一个新文件内容如下所示。

任何人都可以确认看到这种行为吗?还是由于我的笔记本电脑上的一些本地配置?

谁能解释一下这个文件的用途?添加到 .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": ""
  }
}]

Android studio 3.0 负责此文件。您无需担心 output.json 文件。

让我向您解释一下:

对于旧版本,Android Studio 所做的是生成一个签名的 APK 并将其放在 "output" 文件夹中。即使您的 APK 有多个风格维度,它们也可能位于同一目录中,即输出文件夹。从最新发布的 Android Studio 3.0(金丝雀版和稳定版)开始,他们组织了这个文件结构。对于每个风格维度,无论何时签署 APK,它都会有一个单独的文件夹,其中包含相应的 output.json 文件。该文件实际上只是对源 APK 的描述。如您所见,您在此处共享的文件描述了已发布的 APK。

ouput.json 文件是您生成的 APK 的一种元数据文件。由于各种原因生成此文件。我找到了其中一些,可能没有列出所有用例,但这是列表:

  1. 执行Generate Signed APK时生成
  2. 下的 AndroidManifest.xml 文件生成
    {module}/build/intermediates/manifest/androidTest/debug/ouput.json
    
  3. 不是为单元测试生成的,而是只为Android测试生成的(这取决于Android框架执行)

  4. 在上述指定位置为 AndroidManifest.xml 生成的文件 output.json 与您提到的为 APK 生成的文件略有不同。
  5. 如您所见,output.json 文件描述的属性与我们通常在 build.gradle 文件中指定的属性非常相似,因此构建过程必须使用并且需要它才能工作成功(或者它可能是由于从 build.gradle 中成功构建和提取所需属性而生成的)。

据此,我们可以得出结论,它肯定依赖于 Android 框架生成并且它与描述 details/info 关于 APK清单 文件。

  • 我个人曾尝试 Google 甚至在 Android 开发者网站上也找到了正确的答案,但似乎没有关于此文件的详细记录。

  • 我检查了 GitHub 上的几个项目并检查了 .gitignore 文件是否相同,我在任何文件中都找不到任何类似的 output.json 文件在 GitHub 上托管的项目数。因此,在您的提交中排除它们应该是一个好习惯。

  • 简而言之,这个文件是一个包含项目重要元数据的描述性文件。它一定是有原因的。我建议你不要搞砸它,因为我们不知道它会导致什么。

我在outputFileName开头添加../../,APK文件放入output文件夹

android{
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            output.outputFileName =   "../../output_name.apk"
        }
    }
}

使用以前版本的 Android Studio,我曾尝试根据 git describe 的输出自动命名输出 apk。然而,虽然 "Syncing Project with Gradle Files" Android Studio 会 运行 gradle 脚本一次并捕获构建配置,包括输出文件名,然后假设每个构建都将继续使用一样的名字。

所以每当我创建一个新的提交时,实际的输出文件名都会改变。但是 Android Studio 要么会安装旧版本,要么会在清理后失败。

我相信已添加 output.json 以允许 Android Studio 加载它需要了解的有关上次构建的所有信息,即使您自定义了要更改的 gradle 脚本意想不到的方式。

此更改未在 gradle 插件发行说明 (https://developer.android.com/studio/releases/gradle-plugin.html#3-0-0) 中具体提及。尽管出于性能原因,他们确实进行了一系列重大更改。对我来说,他们更愿意在同步时 运行 少你的 gradle 脚本是有道理的。而是直接从构建过程中捕获有关构建输出的信息。

对于想要禁用此功能的任何人,这是我的技巧。
它只是在生成后删除output.json

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"
    }
}

为了回应@wonsuc 的详尽回答,您可以 gradle 通过将以下代码添加到 android 部分来在成功构建后删除文件:

android {
    ...
    applicationVariants.all { variant ->
        variant.assemble.doLast {
            variant.outputs.each { output ->
                delete "${output.outputFile.parent}/output*.json"
            }
        }
    }
}

在 Android Studio 4.0 中,成功构建(apk 或 aab)后会出现一个新文件:app/release/output-metadata.json。为了不在 Git 中惹恼它,只需添加到 <project>/.gitignore:

# Metadata created after successful build.
/app/release/output-metadata.json