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

时间:2017-05-26 12:54:32

标签: android android-studio apk android-studio-3.0

我最近发现,每次运行<module>/release/output.json时,Android Studio 3 Canary 1都会在Build生成一个新文件 - &gt; Generate Signed APK...,其内容如下所示。

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

有谁可以解释这个文件的目的?添加到.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": ""
  }
}]

8 个答案:

答案 0 :(得分:18)

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

让我向你解释一下:

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

答案 1 :(得分:4)

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

  1. 执行Generate Signed APK时生成
  2. 下为AndroidManifest.xml文件生成
    {module}/build/intermediates/manifest/androidTest/debug/ouput.json
    
  3. 为单元测试生成,但仅为AndroidTests生成(依赖于要执行的Android框架)

  4. 在上述指定位置为output.json生成的文件AndroidManifest.xml与为您提及的 APK 生成的文件略有不同。
  5. 正如您所看到的,output.json文件描述的属性与我们通常在build.gradle文件中指定的属性非常相似,因此必须使用&amp;构建过程成功运行所需的(或者可能是由于build.gradle)成功构建和提取所需属性而生成的。
  6. 在此之后,我们可以得出结论,它肯定取决于生成的Android框架和它与描述 APK 清单文件的详细信息有关。

    • 我亲自试过Google&amp;即使在Android开发者网站上也能找到合适的答案,但似乎没有详细记录此文件。

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

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

答案 2 :(得分: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"
    }
}

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

  1. 更新IDE
  2. 运行选项卡->编辑配置->androidApp=>app
  3. -> 常规选项卡-> 模块,选择项目的根目录(其名称)
  4. ->安装选项,部署->默认apk
  5. ->启动选项->启动->默认活动
  6. 在当前整个对话框弹出的右侧滚动滚动条
  7. 在启动前-> 全部删除 - 只留下 Gradle-aware make 选项
  8. 回滚到
<块引用>

classpath "com.android.tools.build:gradle:7.0.0-alpha07"

来自项目级别的 build.gradle 中的新 alpha15 版本 1

  1. 重新添加
<块引用>

jcenter()

build.gradle of project levelsettings.gradle 如果之前被删除

回滚到以前的 sdk 版本和构建工具,例如:

android {
 compileSdkVersion 30
 buildToolsVersion '30.0.3'
//    buildToolsVersion '31.0.0 rc4'
....

build.gradle 应用模块级别。

  1. 出于某些原因,logcat 现在只能在“无过滤器”模式下工作。但它不是这样的问题。

现在它应该生成 apk 并在模拟器上安装一个。并且没有奇怪的错误。让他们自己弄乱新的 gradle 工具版本一段时间。

答案 6 :(得分:-1)

使用以前版本的Android Studio,我曾尝试根据git describe的输出自动命名输出apk。但是,当“使用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脚本。而是直接从构建过程中捕获有关构建输出的信息。

答案 7 :(得分:-2)

我将../../添加到outputFileName的开头,并将APK文件放入output文件夹

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