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

Posted

技术标签:

【中文标题】Android Studio生成的<module>/release/output.json是啥【英文标题】:What is the <module>/release/output.json generated by Android StudioAndroid Studio生成的<module>/release/output.json是什么 【发布时间】:2017-10-27 09:11:45 【问题描述】:

我最近注意到每次运行Build -> Generate Signed APK... 时,android Studio 3 Canary 1 在&lt;module&gt;/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": ""
  
]

【问题讨论】:

普通配置,您可以使用例如:放置服务器,从旧版本的应用程序中检查是否有更新并通知用户,或在网站上显示当前版本等。跨度> 【参考方案1】:

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

让我给你解释一下:

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

【讨论】:

所以没有办法禁用此文件夹和文件生成并将所有风味 APK 保存到输出文件夹? 我仍然不知道如何禁用 output.json 。但是每个风味签名的 apk 都会有单独的文件夹,上面有风味名称。过去所有的 apk 都是生成并放置在输出文件夹 @chitgoks 是的,你是对的。我觉得这很烦人,但为什么他们没有选择将其全部放在输出文件夹中。我喜欢它在 中的行为 我真的想禁用它。【参考方案2】:

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

    在执行Generate Signed APK 时生成

    AndroidManifest.xml下的文件生成

    module/build/intermediates/manifest/androidTest/debug/ouput.json
    

    为单元测试生成,而只为 AndroidTests 生成(取决于要执行的 Android 框架)

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

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

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

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

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

【讨论】:

很好的研究,但我要补充一点,如果你不需要它,删除文件应该是安全的。 我认为文件的目的是反编译和打开dex文件的代码,以防项目丢失。它还具有处理 proguard 反混淆的选项。没有其他重要的【参考方案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"
    

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

自 AS 4.0 起可能将其更改为 $output.outputFile.parent/output-metadata.json @rubo77 为什么不输出*.json 来证明它并仍然支持旧的 IDE? 当然,如果有人不能测试这个,他们可以更新这个答案【参考方案6】:

在以前版本的 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 脚本是有道理的。而是直接从构建过程中捕获有关构建输出的信息。

【讨论】:

我认为您误解了文件的目的,并且可能误解了整个构建过程。听起来好像您将重命名文件的代码放在了错误的位置,或者没有使其成为动态的。 我不知道你为什么认为我错了,具体点。仅供参考,这是我当前设置输出文件名的地方; github.com/servalproject/serval_chat/blob/… 和最新的 Android Studio 配合得很好。正如我上面所说,尝试与以前的版本做类似的事情会导致安装错误的 apk。无论如何,我已经稍微澄清了我的答案,以解释 Android Studio 何时运行您的 gradle 脚本。 我不确定您是在自动安装还是只是错误地标记了构建,但这听起来像是您没有正确配置的东西。如果您正在基于提交生成构建,则需要有一个新的提交来生成一个新文件。您还需要确保您执行的任何类型的安装也会更新提交引用,以便它找到正确的文件。这些实际上都不依赖于output.json 文件。这将是您对build.gradle 文件进行编码的方式。 我使用 git describe 生成版本名称,然后根据该名称设置输出 apk 文件名,以便我可以轻松存档。我的观点是,当您在 Android Studio 中“运行”/“调试”时,gradle 构建就会运行。新版本的 gradle 插件会生成 output.json,其中包含写入的实际输出文件名。然后,Android Studio 会读回它,以便识别要安装和调试的文件。而以前版本的 Android Studio 会假定输出文件名自上一次 gradle 同步以来没有改变。 而且我建议进行此更改主要是出于性能原因,如发行说明中所述,以简化 gradle 同步过程。由于 Android Studio 不必假设构建将输出什么,它可以简单地读取 json 文件并确定发生了什么。【参考方案7】:

我在outputFileName的开头加上../../,APK文件放到output文件夹中

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

【讨论】:

以上是关于Android Studio生成的<module>/release/output.json是啥的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 项目上传到Jcenter完全攻略

如何在Android Studio里设置Build Tool版本

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

android studio生成junitLibs

如何在android studio中随机生成随机运算符

Android Studio在多Module中依赖aar的配置问题