Android studio 如何防止rawproto文件生成或自动删除它们?
Android gradle插件在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应用程序,请
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
中的第一行)。