2015-12-11 163 views
1

的Android 2.0工作室预览2,摇篮包装2.8,Mac OS X的的Android工作室摇篮sourceSets复制

-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 { 
    } 
} 

天才开发者在几百的Java源 - 左System.out.println语句,而不是日志报表'src/main/java'中的文件。理想情况下,我们不希望Sysout语句与任何applicationVariants绑定,特别是flavor1Release和flavor2Release。

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

两种可能的解决方案 -

  1. 执行一个简单的脚本,将删除所有在Java源文件中的SYSOUT语句“的src/main/java目录”。但关于这一点,变体flavor1Debug和flavor2Debug需要记录器显示App中正在发生的事情。
  2. 在构建时执行简单的Gradle任务,将Java源文件从“src/main/java”复制到“src/release/java”,确保省略了Sysout语句。

解决方案2似乎是最快,最简单,最优雅。特别是当Gradle Custom-task独立执行时。除此之外,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 
    } 
} 

没有什么自定义摇篮任务,可能会导致制造“的src /释放”“的src/main”的精确副本,这是不打算成为这个错误。

任何阻止“src/main”默认拷贝到“src/release”的指针都将不胜感激。

+0

如何将S.O.P重定向到日志? http://stackoverflow.com/questions/1200175/log4j-redirect-stdout-to-dailyrollingfileappender – RaGe

+0

http://stackoverflow.com/questions/5712764/redirect-system-out-println-to-log4j-while-keeping-班级名称信息 – RaGe

+0

http://bonfab.io/2015/09/redirect-system-out-to-logger/ – RaGe

回答

0

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

Kudos。在'|'之前我不应该打破“find | xargs egrep”分成执行任务中args []中的两个单独的参数。确实,天才!

相关问题