【问题标题】:Remove code lines from android project on release build在发布构建时从 android 项目中删除代码行
【发布时间】:2015-03-29 08:51:41
【问题描述】:

我创建了一个 Logger 类,我在其中放置了一个字符串和日志级别。 该行如下所示:

  Logger.log("The error is" + err , Logger.DEBUG);

我想删除所有在发布版本中使用 Logger.DEBUG 日志级别的 Logger.log 消息。 目前我还没有找到使用 gradle 来做到这一点的技巧。 我也尝试使用 proguard -assumenosideeffects 但我找不到为所有项目提交它的确切规则。 Proguard 说:

您可以让 ProGuard 删除日志记录代码。诀窍是指定 日志记录方法没有副作用——即使它们 实际上是这样做的,因为它们会写入控制台或日志文件。 ProGuard 会相信你的话并删除调用(在 优化步骤),如果可能的话,记录类和方法 自己(在缩小步骤中)。

【问题讨论】:

  • 您真的需要删除这些行还是只是想确保它们没有被执行?如果日志级别未设置为 ERROR、FATAL 等,则有像 slf4j 这样的第 3 方库“忽略”您的日志语句(意味着它们没有创建您的日志字符串)。
  • 我想删除它,因为如果我不执行命令,函数中会出现一个字符串追加事件。
  • 如果不是太费时,我会把它切换到slf4j。它们允许您使用参数化消息进行日志记录,如果未给出日志级别,则避免字符串附加。这样您可以使用logger.debug("The error is {}", err)。仅当级别为debug 时才会执行字符串 concat。如果你不能切换,那么对不起,如果这是题外话:)

标签: java logging proguard android-gradle-plugin


【解决方案1】:

我通过写一个gradle脚本解决了这个问题:

task deleteJavaDebugLogs << {
    description "This function will delete all SDK DEBUG log level from the project, be careful with it!"
    FileTree  javaFiles = fileTree('src/main/java/com/"your-name"') {
        include '**/*.java'
    }
    String regex = "Logger.log[^,]+[^L]+(.*)Logger.SDK_DEBUG[^;];"
    javaFiles.each { File javaFile ->
        println "Start replacing regex on $javaFile.name"
        String content = javaFile.getText()
        content = content.replaceAll(regex, "")
        javaFile.setText(content)
    }
}

每次发布​​前我都会运行这个 gradle 脚本。 使用 Regex 它只从项目中删除有问题的行。 我建议使用 Jenkins 或其他构建工具将其添加到您的构建过程中

在没有备份的项目上运行它时要小心,因为它会使用上述正则表达式从您的代码中删除所有行。

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多