52

I recently noticed a new file generated at <module>/release/output.json by Android Studio 3 Canary 1 each time I run Build -> Generate Signed APK..., which has contents that look like following.

Can anyone confirm seeing this behavior as well? Or is it due to some local configuration on my laptop?

And can anyone explain the purpose of this file? Is it safe to add to .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": ""
  }
}]
4

7 回答 7

25

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

让我向您解释一下:

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

于 2017-11-07T06:13:44.307 回答
7

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

  1. Generate Signed APK执行时生成
  2. AndroidManifest.xml为下的文件生成

    {module}/build/intermediates/manifest/androidTest/debug/ouput.json
    
  3. 不是为单元测试生成的,而只是为 AndroidTests 生成的(取决于要执行的 Android 框架)

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

在此基础上,我们可以得出结论,它肯定取决于要生成的 Android 框架,并且与描述有关APKManifest文件的详细信息/信息有关。

  • 即使在 Android 开发者网站上,我也亲自尝试过 Google 并找到正确的答案,但似乎没有详细记录此文件。

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

  • 简而言之,该文件是一个描述性文件,其中包含有关项目的重要元数据。它的存在一定是有原因的。我建议你不要惹它,因为我们不知道它可能会导致什么。

于 2017-11-07T09:54:32.087 回答
3

对于想要禁用此功能的任何人,这是我的窍门。它只是在生成后
删除。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"
    }
}
于 2018-04-08T02:03:47.110 回答
2

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

# Metadata created after successful build.
/app/release/output-metadata.json
于 2020-09-03T10:12:41.150 回答
2

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

android {
    ...
    applicationVariants.all { variant ->
        variant.assemble.doLast {
            variant.outputs.each { output ->
                delete "${output.outputFile.parent}/output*.json"
            }
        }
    }
}
于 2018-04-12T06:26:07.353 回答
-1

在以前版本的 Android Studio 中,我曾尝试根据git describe. 然而,虽然“同步项目与 Gradle 文件”Android Studio 将运行一次 gradle 脚本并捕获构建配置,包括输出文件名,然后假设每个构建将继续使用相同的名称。

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

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

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

于 2018-03-20T02:38:08.333 回答
-2

我添加../../到开头,outputFileNameAPK文件放入output文件夹

android{
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            output.outputFileName =   "../../output_name.apk"
        }
    }
}
于 2017-11-29T05:43:24.373 回答