android - Android Studio Gradle sourceSets复制

标签 android android-studio gradle release

Android Studio 2.0 Preview 2,Gradle Wrapper 2.8,Mac OS X

-MainProjectWorkspace    
-|-build.gradle    
-|-settings.gradle    
-|-gradle.properties    
-|-gradle    
-|-MyLibraryDependencies    
-|-MyMainModule   
--|-build.gradle    
--|-build    
--|-src    
---|-androidTest    
---|-main    
----|-assets    
----|-jniLibs    
----|-libs    
----|-java    
-----|-com    
----|-res    
----|-AndroidManifest.xml

MyMainModule/build.gradle

//Not a single SourceSets configurations.

productFlavors {
    flavor1 {
    }
    flavor2 {
    }
}    

buildTypes {
    release {
    }
    debug {
    }
}

一位天才的开发人员在“src / main / java”中的数百个Java源文件中保留了System.out.println语句,而不是Log语句。理想情况下,我们不希望Sysout语句与任何applicationVariants bundle 在一起,尤其是flavor1Release和flavor2Release。

在对这数百个Java源文件进行修改并最终将Sysout语句切换为Log语句之前,我们需要紧急将其关闭。

两种可能的解决方案-
  • 执行一个简单的脚本,该脚本将删除“src / main / java”中Java源文件中的所有Sysout语句。但与此有关的是,variant1Debug和flavor2Debug的变体需要记录器显示应用程序中正在发生的事情。
  • 在构建时执行一个简单的Gradle任务,将Java源文件从“src / main / java”复制到“src / release / java”,确保省略Sysout语句。

  • 解决方案2似乎是最快,最简单,最优雅的。特别是当Gradle自定义任务独立执行时。除此之外,Android-Studio中的Gradle-sync似乎正在复制从“src / main”到“src / release”的所有内容,包括 Assets ,jniLibs,libs,res甚至AndroidManifest.xml。幸运的是,Java源文件被剥离了“src / release”中的Sysout语句,这是预期的结果,理想情况下,仅应保留“src / release / java”而没有任何其他文件夹。
    task prepareRelease(type: Task) {
    Pattern sysoutRegex = Pattern.compile(<Sysout-Pattern>)
    try {
        File releaseFolder = file("src/release")
        File mainFolder = file("src/main")
        ByteArrayOutputStream output = new ByteArrayOutputStream()
        exec {
            commandLine = "sh"
            args = ["-c", "find ${mainFolder.canonicalPath} -name '*' -type f -print ",
                    "| xargs egrep -l '${sysoutRegex.pattern()}'"]
            standardOutput = output
        }
        def fileList = output.toString().split(System.getProperty("line.separator"))
        fileList.each { line ->
            File srcFile = file(line)
            File destFile = file(srcFile.canonicalPath.replace("main", "release"))
    
            def content = srcFile.readLines()
            if (!destFile.exists()) {
                    destFile.parentFile.mkdirs()
                    destFile.createNewFile()
                    destFile.writable = true
             }
             destFile.withWriter { out ->
                content.eachWithIndex { contentLine, index ->
                        if (!sysoutRegex.matcher(contentLine).find()) {
                            out.println contentLine
                        }
                }
            } 
        } catch (Exception fail) {
            throw fail
        }
    }
    

    自定义Gradle任务中没有任何内容可能会导致使“src / release”成为“src / main”的精确副本的错误,而这并非原本的意图。

    防止此默认副本从“src / main”到“src / release”的任何指针都将受到赞赏。

    最佳答案

    基于RaGe的评论-“如何将* .java用作查找模式而不是*?”

    荣誉我不应该在'|'之前打破“find | xargs egrep”在exec任务的args []中分为两个单独的args。确实,天才!!!

    关于android - Android Studio Gradle sourceSets复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34231967/

    相关文章:

    java - Android Studio - httpparams、httpclient 等旧命令不再有效

    android - 为Android Studio安装Material Design时出错

    android - 如何在 Android 中以圆形图案将文本绘制到 View

    java - 如何通过单击Android中的抽屉导航项打开新 Activity

    java - Android 中的序列化?

    java - Android Studio 默认值/传递变量

    intellij-idea - IntelliJ Spring Boot : How to create an executable jar

    android - 如何处理 Android Studio 项目中的私有(private)数据?

    gradle - 在 gradle 复制任务中动态设置文件权限

    android - 究竟是什么决定了一个整数有多少位