proguard-log.gradle 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // generate proguard config for log
  2. class LogProguardRuleTask extends DefaultTask {
  3. @Input
  4. String projectName
  5. @Input
  6. String[] proguardClassList
  7. @Input
  8. String currentLogLevel
  9. @OutputFile
  10. File logProguardFile
  11. private ArrayList<String> removeLogLevels
  12. private HashMap<String, String> allowedLogLevels
  13. LogProguardRuleTask() {
  14. removeLogLevels = new ArrayList<>()
  15. allowedLogLevels = [VERBOSE: "v",
  16. DEBUG : "d",
  17. INFO : "i",
  18. WARN : "w",
  19. ERROR : "e"]
  20. }
  21. private void updateProguardFile() {
  22. File file = logProguardFile
  23. if (file.exists()) {
  24. file.delete()
  25. }
  26. file.createNewFile()
  27. file.append("\n" + genProguardRules())
  28. }
  29. private String genProguardRules() {
  30. def rules = ""
  31. for (String logClass : proguardClassList) {
  32. def rule = genLogRules(logClass, removeLogLevels)
  33. logger.lifecycle(rule)
  34. rules += rule
  35. }
  36. return rules
  37. }
  38. private String genLogRules(clazz, levels) {
  39. def sb = new StringBuilder()
  40. sb.append(String.format("-assumenosideeffects class %s{\n", clazz))
  41. for (String level : levels) {
  42. sb.append(String.format(" public static *** %s(...);\n", level))
  43. }
  44. sb.append("}\n")
  45. return sb.toString()
  46. }
  47. @TaskAction
  48. void doTaskAction() {
  49. println("proguard.gradle, LogProguardRuleTask, doTaskAction()")
  50. logger.debug("proguard.gradle, LogProguardRuleTask, doTaskAction()")
  51. if (project.name != projectName) {
  52. return
  53. }
  54. if (!project.hasProperty("LOG_LEVEL")) {
  55. return
  56. }
  57. logger.debug("gradle param log level: ${currentLogLevel}")
  58. for (def i = 0; i < allowedLogLevels.size(); i++) {
  59. if (allowedLogLevels.keySet()[i] != currentLogLevel.toUpperCase()) {
  60. removeLogLevels.add(allowedLogLevels.values()[i])
  61. } else {
  62. break
  63. }
  64. }
  65. logger.debug("proguard log level: " + removeLogLevels)
  66. updateProguardFile()
  67. }
  68. }
  69. def genLogProguardFileTask = tasks.register("genLogProguardFile", LogProguardRuleTask) {
  70. projectName = "app"
  71. proguardClassList = ["android.util.Log",
  72. "com.adealink.frame.log.Log"]
  73. currentLogLevel = System.getenv("LOG_LEVEL")
  74. if (currentLogLevel == null || currentLogLevel == "") {
  75. currentLogLevel = project.hasProperty("LOG_LEVEL") ? project.property("LOG_LEVEL") : "NONE"
  76. }
  77. logProguardFile = new File(project.buildFile.getParent() + File.separator + "proguard-log.pro")
  78. }
  79. // remove low level log before compile, since proguard can't remove the concat log clearly
  80. class RemoveConcatLogTask extends DefaultTask {
  81. @Input
  82. String projectName
  83. @Input
  84. String[] proguardClassList
  85. @Input
  86. String currentLogLevel
  87. private HashMap<String, String> allowedLogLevels
  88. RemoveConcatLogTask() {
  89. allowedLogLevels = [VERBOSE: "v",
  90. DEBUG : "d",
  91. INFO : "i",
  92. WARN : "w",
  93. ERROR : "e"]
  94. }
  95. @TaskAction
  96. void doTaskAction() {
  97. if (project.name != projectName) {
  98. return
  99. }
  100. def paramLevel = ""
  101. for (int i = 0; i < allowedLogLevels.size(); i++) {
  102. if (allowedLogLevels.keySet()[i] != currentLogLevel.toUpperCase()) {
  103. paramLevel += allowedLogLevels.values()[i] + " "
  104. } else {
  105. break
  106. }
  107. }
  108. def paramClass = ""
  109. for (def logClass : proguardClassList) {
  110. paramClass += logClass.split('\\.')[-1] + " "
  111. }
  112. if (paramClass.length() > 0 && paramLevel.length() > 0) {
  113. println("proguard.gradle, RemoveConcatLogTask, doTaskAction, python proguard-log paramClass:" + paramClass + " paramLevel:" + paramLevel)
  114. // project.exec {
  115. // workingDir "."
  116. // commandLine "python3", "proguard-log.py", "-c " + paramClass, "-l " + paramLevel
  117. // }
  118. }
  119. }
  120. }
  121. def emptyConcatLogStringTask = tasks.register("emptyConcatLogString", RemoveConcatLogTask) {
  122. projectName = "app"
  123. proguardClassList = ["android.util.Log",
  124. "com.adealink.frame.log.Log"]
  125. currentLogLevel = System.getenv("LOG_LEVEL")
  126. if (currentLogLevel == null || currentLogLevel == "") {
  127. currentLogLevel = project.hasProperty("LOG_LEVEL") ? project.property("LOG_LEVEL") : "NONE"
  128. }
  129. }
  130. android.applicationVariants.configureEach {
  131. if (it.buildType.name != "debug") {
  132. it.preBuildProvider.configure {
  133. dependsOn emptyConcatLogStringTask
  134. }
  135. }
  136. }
  137. tasks.named("preBuild").configure {
  138. dependsOn genLogProguardFileTask
  139. }