热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何防止rawproto文件生成或自动删除它们?》经验,为你挑选了1个好方法。

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



1> TWiStErRob..:

我已经被它困扰了很长时间了,现在我发现有数十亿字节的这种占用我很小的SSD的空间,我决定寻找一种禁用它的方法。对我来说,在占用太多空间之前最烦人的事情就是gradlew clean留下一个build文件夹。

仅通过进行了测试com.android.tools.build:gradle:3.0.1,因此YMMV。

TL; DR

对于全球应用程序读取最后一节,每个项目使用该在rootProjectbuild.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
调查中

感谢@JeffRichards提到的链接/sf/ask/17360801/,我在此处放置了一个断点,并通过运行(不要与混淆)并附加一个远程调试器来检查谁在调用它。ProcessProfileWriterFactory.javagradlew -Dorg.gradle.debug=true --info--debug

我遵循了线索,发现ProcessProfileWriter.finishAndMaybeWrite创建了文件夹并进行了写入。在方法调用上进行回溯,我发现它可以ProfilerInitializer.recordingBuildListener控制是否调用...,并直接由BasePluginapply 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'

在多项目构建中(大多数模板项目:appfolder settings.gradlebuild.gradle),我建议您将其应用于代码buildscript块:

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

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

在全球范围内应用魔术

显然,如果它困扰我们一个项目,那么在任何情况下都将如此,因此,请按照Gradle的手册,在~/.gradle/init.gradle%USERPROFILE%\.gradle\init.gradle(请注意,可以使用来重新定位此文件夹GRADLE_USER_HOME)中创建一个文件,其内容如下:

// NB: any changes to this script require a new daemon (`gradlew --stop` or `gradlew --no-daemon `)
rootProject { rootProject -> // see /sf/ask/17360801/
    // 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());
            """)
        }
    }
}


推荐阅读
author-avatar
赵庭洪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有