【问题标题】:Android Studio Gradle sourceSets copyAndroid Studio Gradle sourceSets 复制
【发布时间】: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 语句之前,我们需要紧急关闭它们。

两种可能的解决方案 -

  1. 执行一个简单的脚本,该脚本将删除“src/main/java”中 Java 源文件中的所有 Sysout 语句。但关于这一点,flavor1Debug 和 flavor2Debug 变体需要 Loggers 来显示应用程序中发生的事情。
  2. 在构建时执行一个简单的 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 重定向到日志? stackoverflow.com/questions/1200175/…
  • 对于一家大型跨国公司,Android 应用程序经过严格的安全许可程序,尤其是 APK 文件,而不仅仅是不同安全执行团队的源代码存储库。应用程序中的客户数据可能全部加起来数万亿美元。任何安全漏洞都可能给全球交易市场造成巨大损失。如果安全团队说,他们不想看到 Sysout 声明,那么没有人可以反驳。我们最好把它们全部撕掉,而不是重定向到默认的 Logger。
  • 使用*.java 作为find 模式而不是* 怎么样?

标签: android android-studio gradle release


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2019-11-04
    • 1970-01-01
    • 2017-02-24
    • 2017-10-19
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多