gpt4 book ai didi

android - Android Gradle 插件 3.4.0 之后的日志语句(使用 R8 编译器)

转载 作者:行者123 更新时间:2023-11-29 02:20:43 43 4
gpt4 key购买 nike

Android 的新 R8 编译器 detects and safely removes unused classes, fields, methods, and attributes from your app and its library dependencies除其他事项外。

它是否也删除了 Log 语句?例如。如果我构建 Release APK,准备发布,我可以安全地将我的日志语句留在我的应用程序中吗?

Log.d("LogStatement", variable.toString())

还是每次我将我的应用上传/更新到 Google Play 时都必须删除它们?

最佳答案

简短回答:视情况而定。

正如您在 R8 的这个问题上看到的那样:https://issuetracker.google.com/issues/73708157

这取决于您使用的记录器。当然,您必须定义适当的 ProGuard 规则。

当使用 Younes Charfaoui 提到的 ProGuard 规则时,对记录器的调用将被删除。这仅在使用纯字符串时有效:

Log.d("LogTag", "My log statement");

--> 将被正确删除。

但是在记录时使用(自动)StringBuilder 时:

Log.d("LogTag", "My log statement will show some variable: " + variable);

只会删除对记录器的调用。
这意味着,StringBuilder 部分将在生成的字节码中保持可见。
您必须小心,不要使用任何自动 StringBuilder。
另一个例子:

@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("MyFragment::onCreate", "will be removed"); // will be dropped
Log.d("MyFragment::onCreate::", savedInstanceState.toString()); // call for toString() will remain
}

见:

invoke-virtual {p1}, Landroid/os/Bundle;->toString()Ljava/lang/String;

有一些 ProGuard 规则仅受 ProGuard 支持,R8 尚不支持,可以轻松删除剩余的 StringBuilder:assumenoexternalsideeffects、assumenoexternalreturnvalues。

当使用带有自动 StringBuilder 的日志记录时,您有:

  • 性能不佳,因为 StringBuilder 执行其操作并且结果未被使用。
  • 削弱了你的混淆,因为任何试图反汇编你的 apk 并阅读字节码的人都可能更容易理解混淆代码,因为你的调试日志语句的剩余 StringBuilder。

要真正确保您的日志记录代码已随 R8 删除,您有两个选择:

  • 使用支持消息构建的记录器库(如 slf4j),您可以在其中编写:
logger.debug("My log statement will show some variable: {} and maybe another one: {}", variable1, variable2);
  • 在每次调用 logger 时都进行测试(阅读起来真的很难看,并且会增加代码的复杂性,就像你关心像 sonarqube 这样的静态代码分析一样)。
    Logger.SHOW_LOG 必须是值为 false 的 public static final boolean,因此代码优化会将整行检测为未使用的代码,并正确删除其间的所有内容。
if (Logger.SHOW_LOG) {
logger.debug("My log statement will show some variable: " + variable1 + " and maybe another one: " + variable2);
}

另见:http://www.slf4j.org/faq.html#logging_performance

如果您还认为,这应该像在 ProGuard 上一样在 R8 上工作,请给以下问题之一加注星号:
Add support for Proguard 6 -assumenoexternalsideeffects optimization option
Add support for Proguard 6 -assumenoexternalreturnvalues optimization option
Improve unused StringBuilder elimination

关于android - Android Gradle 插件 3.4.0 之后的日志语句(使用 R8 编译器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55988096/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com