Android Studio Gradle sourceSets副本

时间:2015-12-11 20:24:12

标签: 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 {
    }
}

一位天才开发者留下了System.out.println语句,而不是'src / main / java'中数百个Java源文件中的Log语句。理想情况下,我们不希望Sysout语句与任何applicationVariants捆绑在一起,特别是flavor1Release和flavor2Release。

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

两种可能的解决方案 -

  1. 执行一个简单的脚本,删除'src / main / java'中Java源文件中的所有Sysout语句。但关于这一点,变种flavor1Debug和flavor2Debug需要记录器显示应用程序中发生的事情。
  2. 在构建时执行一个简单的Gradle任务,将Java源文件从'src / main / java'复制到'src / release / java',确保省略Sysout语句。
  3. 解决方案2似乎是最快,最简单,最优雅的。特别是当Gradle Custom-task独立执行时。除此之外,Android-Studio中的Gradle-sync似乎正在复制从'src / main'到'src / release'的所有内容,包括资产,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-task中没有任何内容可能导致此错误使“src / release”成为“src / main”的精确副本,而这并不是原来的。

    任何可以防止“src / main”默认副本为“src / release”的指针都将非常感激。

1 个答案:

答案 0 :(得分:0)

基于RaGe的评论 - &#34;如何使用* .java作为查找模式而不是*?&#34;

奖励。我不应该打破&#34;发现| xargs egrep&#34;在&#39; |&#39;之前在exec任务的args []中分成两个独立的args。确实,天才!!!