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 在<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": ""
]
【问题讨论】:
普通配置,您可以使用例如:放置服务器,从旧版本的应用程序中检查是否有更新并通知用户,或在网站上显示当前版本等。跨度> 【参考方案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 框架,并且与描述 APK 或 Manifest 文件的详细信息/信息有关.
我亲自尝试过 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
,只需添加到<project>/.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版本