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 库