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

Android studio 如何防止rawproto文件生成或自动删除它们?,android-studio,gradle,android-gradle-plugin,Android Studio,Gradle,Android Gradle Plugin,Android gradle插件在build/Android profile目录中生成大量.rawproto文件。它们是用来干什么的?有没有办法禁用这种疯狂行为或自动删除它们?我已经被它困扰了很长一段时间,现在我注意到它占用了我的小型SSD,我决定想办法禁用它。对我来说,在占用太多空间之前最恼人的事情是gradlew clean留下一个build文件夹 仅使用com.android.tools.build:gradle:3.0.1进行测试,因此YMMV. TL;博士 对于global应用程序,请

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

我已经被它困扰了很长一段时间,现在我注意到它占用了我的小型SSD,我决定想办法禁用它。对我来说,在占用太多空间之前最恼人的事情是
gradlew clean
留下一个
build
文件夹

仅使用
com.android.tools.build:gradle:3.0.1
进行测试,因此YMMV.

TL;博士 对于global应用程序,请阅读最后一节,每个项目在
rootProject
build.gradle
中使用此选项:

com.android.build.gradle.internal.profile.profileriInitializer.recordingBuildListener=
新建com.android.build.gradle.internal.profile.RecordingBuildListener(
com.android.builder.profile.ProcessProfileWriter.get());
//然后是'gradlew--stop&&gradlew clean',以验证没有留下任何生成文件夹
调查 多亏了前面提到的
ProcessProfileWriterFactory.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.profileriInitializer.recordingBuildListener=
新建com.android.build.gradle.internal.profile.RecordingBuildListener(
com.android.builder.profile.ProcessProfileWriter.get());
我知道,这有点冗长,但它是有效的,如果你导入一些东西,它看起来会更好:

ProfilerInitializer.recordingBuildListener=newrecordingbuildlistener(ProcessProfileWriter.get());
施展魔法 在单个项目构建(一个
build.gradle
)中,您必须在之前应用此

apply插件:“com.android.application”
在多项目生成中(大多数模板项目:
app
文件夹、
settings.gradle
,以及许多
build.gradle
s),我建议您在
buildscript
块周围应用它:

buildscript{
// ...
依赖关系{
classpath'com.android.tools.build:gradle:3.0.1'
}
}
//这里是魔线
确保它位于任何
apply plugin:
s之前,而不是在
buildscript
块中

全球应用魔法 显然,如果它在一个项目中困扰我们,那么在所有情况下,它都会在
~/.gradle/init.gradle
%USERPROFILE%\.gradle\init.gradle
中创建一个包含以下内容的文件:

//注意:对此脚本的任何更改都需要一个新的守护程序(`gradlew--stop`或`gradlew--no daemon`)
rootProject{rootProject->//请参阅https://stackoverflow.com/a/48087543/253468
//侦听项目插件上的生命周期事件
rootProject.plugins.whenpluginaded{plugin->
//检查是否应用了任何Android插件(不一定只是“com.Android.application”)
//这个插件实际上正是为了得到通知
if(plugin.class.name==“com.android.build.gradle.api.AndroidBasePlugin”){
logger.info“关闭”build/android profile/profile-*(rawproto | json)`generation“
//在buildscript的上下文中执行hack,而不是在这个initscript中
新GroovyShell(plugin.class.classLoader).evaluate(“”)
com.android.build.gradle.internal.profile.ProfilerInitializer.recordingBuildListener=
新建com.android.build.gradle.internal.profile.RecordingBuildListener(
com.android.builder.profile.ProcessProfileWriter.get());
""")
}
}
}

至于它们的用途,有人在上面列出了一个答案,也许可以开始解释。@JeffRichards你可能对我的答案感兴趣。全局解决方案对我不起作用,但TL;part博士做到了,非常感谢@artkoenig全球解决方案出了什么问题?您使用的是3.0.1,并且确保重新启动守护进程(请参阅
init.gradle
中的第一行)。