gpt4 book ai didi

android-studio - 如何防止 rawproto 文件生成或自动删除它们?

转载 作者:行者123 更新时间:2023-12-03 15:49:22 25 4
gpt4 key购买 nike

Android gradle 插件生成大量 .rawproto build/android-profile 中的文件目录。它们是做什么用的?有没有办法禁用这种疯狂或自动删除它们?

最佳答案

我已经被它困扰了很长时间,现在我注意到有数千兆字节的数据占用了我的小 SSD,我决定想办法禁用它。对我来说,在占用太多空间之前最讨厌的事情是 gradlew clean留下 build文件夹后面。

仅使用 com.android.tools.build:gradle:3.0.1 进行测试,所以 YMMV。

TL; 博士

对于 全局应用程序阅读最后一节,每个项目在 rootProject 中使用它的 build.gradle :

com.android.build.gradle.internal.profile.ProfilerInitializer.recordingBuildListener =
new com.android.build.gradle.internal.profile.RecordingBuildListener(
com.android.builder.profile.ProcessProfileWriter.get());
// and then `gradlew --stop && gradlew clean` to verify no build folder is left behind

调查

感谢 https://stackoverflow.com/a/43910084/253468链接人 @JeffRichardsProcessProfileWriterFactory.java ,我在那里放置了一个断点并通过运行 gradlew -Dorg.gradle.debug=true --info 来检查谁在调用它(不要与 --debug 混淆)并附加远程调试器。

我跟着线索,发现 ProcessProfileWriter.finishAndMaybeWrite创建文件夹并写入。回溯方法调用我发现 ProfilerInitializer.recordingBuildListener控制它是否被调用 ... 并由 BasePlugin 直接初始化( apply plugin: 'com.android.*' )。

因此,为了防止发生任何事情,我选择尝试通过预先初始化该静态字段来禁用守卫。谢天谢地,Groovy(以及 Gradle)没有给出关于 JVM 可见性修饰符的 *,所以没有反射这里是神奇的线:

com.android.build.gradle.internal.profile.ProfilerInitializer.recordingBuildListener =
new com.android.build.gradle.internal.profile.RecordingBuildListener(
com.android.builder.profile.ProcessProfileWriter.get());

我知道,它有点冗长,但它有效,如果你导入东西它看起来更好:

ProfilerInitializer.recordingBuildListener = new RecordingBuildListener(ProcessProfileWriter.get());

应用魔法

在单项目构建(一个 build.gradle)中,您 必须申请此 之前

apply plugin: 'com.android.application'

在多项目构建中(大多数模板项目: app 文件夹、 settings.gradle 和许多 build.gradle s)我建议你在 buildscript 周围应用它堵塞:

buildscript {
// ...
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
// magic line here

确保它在任何 apply plugin: 之前s,而不是在 buildscript 内堵塞。

在全局范围内应用魔法

显然,如果它在一个项目中困扰我们,那么在所有情况下都会困扰我们,因此请关注 Gradle's manual , 在 ~/.gradle/init.gradle 中创建文件或 %USERPROFILE%\.gradle\init.gradle (请注意 this folder can be relocated with GRADLE_USER_HOME ),内容如下:

// NB: any changes to this script require a new daemon (`gradlew --stop` or `gradlew --no-daemon <tasks>`)
rootProject { rootProject -> // see https://stackoverflow.com/a/48087543/253468
// listen for lifecycle events on the project's plugins
rootProject.plugins.whenPluginAdded { plugin ->
// check if any Android plugin is being applied (not necessarily just 'com.android.application')
// this plugin is actually exactly for this purpose: to get notified
if (plugin.class.name == 'com.android.build.gradle.api.AndroidBasePlugin') {
logger.info 'Turning off `build/android-profile/profile-*.(rawproto|json)` generation.'
// execute the hack in the context of the buildscript, not in this initscript
new GroovyShell(plugin.class.classLoader).evaluate("""
com.android.build.gradle.internal.profile.ProfilerInitializer.recordingBuildListener =
new com.android.build.gradle.internal.profile.RecordingBuildListener(
com.android.builder.profile.ProcessProfileWriter.get());
""")
}
}
}

关于android-studio - 如何防止 rawproto 文件生成或自动删除它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43521979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com