Android Studio Gradle sourceSets 复制

Posted

技术标签:

【中文标题】Android Studio Gradle sourceSets 复制【英文标题】:Android Studio Gradle sourceSets copy 【发布时间】:2015-12-11 20:24:11 【问题描述】:

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 语句之前,我们需要紧急关闭它们。

两种可能的解决方案 -

    执行一个简单的脚本,该脚本将删除“src/main/java”中 Java 源文件中的所有 Sysout 语句。但关于这一点,flavor1Debug 和 flavor2Debug 变体需要 Loggers 来显示应用程序中发生的事情。 在构建时执行一个简单的 Gradle 任务,将 Java 源文件从“src/main/java”复制到“src/release/java”,确保省略 Sysout 语句。

解决方案 2 似乎是最快、最简单、最优雅的。特别是当 Gradle 自定义任务独立执行时。除此之外,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 任务中没有任何内容可能导致“src/release”成为“src/main”的精确副本这一错误,而这并非本意。

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

【问题讨论】:

如何将 S.O.P 重定向到日志? ***.com/questions/1200175/… ***.com/questions/5712764/… bonfab.io/2015/09/redirect-system-out-to-logger 对于一家大型跨国公司,Android 应用程序经过严格的安全许可程序,尤其是 APK 文件,而不仅仅是不同安全执行团队的源代码存储库。应用程序中的客户数据可能全部加起来数万亿美元。任何安全漏洞都可能给全球交易市场造成巨大损失。如果安全团队说,他们不想看到 Sysout 声明,那么没有人可以反驳。我们最好把它们全部撕掉,而不是重定向到默认的 Logger。 使用*.java 作为find 模式而不是* 怎么样? 【参考方案1】:

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

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

【讨论】:

以上是关于Android Studio Gradle sourceSets 复制的主要内容,如果未能解决你的问题,请参考以下文章

android studio怎么设置gradle版本

如何建立与 Android studio和 gradle android 库

android studio怎样配置gradle本地路径

android studio Gradle升级到3.5.0遇到的坑

android Studio 降级gradle

android studio怎么配置gradle