2015-12-11 98 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 []中的兩個單獨的參數。確實,天才!

相關問題