【发布时间】: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 重定向到日志? stackoverflow.com/questions/1200175/…
-
对于一家大型跨国公司,Android 应用程序经过严格的安全许可程序,尤其是 APK 文件,而不仅仅是不同安全执行团队的源代码存储库。应用程序中的客户数据可能全部加起来数万亿美元。任何安全漏洞都可能给全球交易市场造成巨大损失。如果安全团队说,他们不想看到 Sysout 声明,那么没有人可以反驳。我们最好把它们全部撕掉,而不是重定向到默认的 Logger。
-
使用
*.java作为find模式而不是*怎么样?
标签: android android-studio gradle release