我最近发现,每次运行<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": ""
}
}]
答案 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的元数据文件。由于各种原因生成此文件。我找到了其中一些,可能没有列出所有的用例,但是这里是列表:
Generate Signed APK
时生成在
下为AndroidManifest.xml
文件生成
{module}/build/intermediates/manifest/androidTest/debug/ouput.json
为单元测试生成不,但仅为AndroidTests生成(依赖于要执行的Android框架)
output.json
生成的文件AndroidManifest.xml
与为您提及的 APK 生成的文件略有不同。output.json
文件描述的属性与我们通常在build.gradle
文件中指定的属性非常相似,因此必须使用&amp;构建过程成功运行所需的(或者可能是由于build.gradle
)成功构建和提取所需属性而生成的。在此之后,我们可以得出结论,它肯定取决于生成的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)
-
只留下 Gradle-aware make
选项classpath "com.android.tools.build:gradle:7.0.0-alpha07"
来自项目级别的 build.gradle 中的新 alpha15
版本 1
jcenter()
到 build.gradle of project level
和 settings.gradle
如果之前被删除
回滚到以前的 sdk 版本和构建工具,例如:
android {
compileSdkVersion 30
buildToolsVersion '30.0.3'
// buildToolsVersion '31.0.0 rc4'
....
在 build.gradle
应用模块级别。
现在它应该生成 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"
}
}
}