Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Gradle插件3.4.0之后的日志语句(使用R8编译器)_Android_Logging_Android Gradle Plugin - Fatal编程技术网

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

Android Gradle插件3.4.0之后的日志语句(使用R8编译器),android,logging,android-gradle-plugin,Android,Logging,Android Gradle Plugin,Android的新R8编译器以及其他东西 它是否也删除日志语句?例如,如果我构建了我的发布APK,准备启动,我是否可以在我的应用程序中保留日志声明 Log.d("LogStatement", variable.toString()) 或者每次我上传/更新我的应用程序到Google Play时都必须删除它们吗?不,你可以通过Proguard工具来完成。在build.gradle中,您可以启用Proguard release { minifyEnabled true

Android的新R8编译器以及其他东西

它是否也删除日志语句?例如,如果我构建了我的发布APK,准备启动,我是否可以在我的应用程序中保留日志声明

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

或者每次我上传/更新我的应用程序到Google Play时都必须删除它们吗?

不,你可以通过Proguard工具来完成。在
build.gradle
中,您可以启用Proguard

release {
        minifyEnabled true

        proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'),
                'proguard-rules.pro'
    }
修改proguard-rules.pro文件,该文件应位于标准Android应用程序目录下:

-assumenosideeffects class android.util.Log {
  public static *** v(...);
  public static *** d(...);
  public static *** i(...);
  public static *** w(...);
  public static *** e(...);
}

我希望这个答案对您有所帮助。

我不确定,如果您仍然在寻找这个问题的答案,但是,它没有被删除,如果您使用apk analyzer检查apk(使用映射文件以确保可读性),您将看到日志类确实存在。就像@Younes Charfaoui提到的那样,你可以添加那些proguard规则来删除它。

简单回答:这取决于你的情况

正如您在本期R8中看到的:

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

使用中提到的ProGuard规则时,将删除对记录器的调用。 这仅在使用普通字符串时有效:

Log.d(“LogTag”、“我的日志语句”);
-->将被正确移除

但在日志记录中使用(自动)StringBuilder时:

Log.d(“LogTag”,“我的Log语句将显示某个变量:“+variable”);
只有对记录器的调用将被删除。
这意味着StringBuilder部件将在生成的字节码中保持可见。
您必须小心,不要使用任何自动StringBuilder。
另一个例子:

@覆盖
创建时的公共void(Bundle savedInstanceState){
Log.d(“MyFragment::onCreate”,“将被删除”);//将被删除
Log.d(“MyFragment::onCreate::”,savedInstanceState.toString());//对toString()的调用将保留
}
见:

有一些ProGuard规则仅由ProGuard支持,R8还不支持,它们可以轻松删除其余的StringBuilder:AssumeOuternalSetEffects、AssumeOuternalReturnValues

使用自动StringBuilder记录时,您有:

  • StringBuilder执行其操作时性能不佳,结果未使用
  • 由于调试日志语句的剩余StringBuilder,任何试图反汇编apk并读取字节码的人都可能更容易理解模糊代码
要真正确保使用R8删除日志代码,您有两个选项:

  • 使用支持消息构建的记录器库(如slf4j),您可以在其中写入:
logger.debug(“我的log语句将显示一些变量:{},可能还有另一个:{}”,variable1,variable2);
  • 在每次调用logger时都要进行测试(如果您喜欢像sonarqube这样的静态代码分析,那么阅读起来真的很难看,会增加代码的复杂性)。
    Logger.SHOW_LOG必须是一个公共静态final布尔值,其值为false,因此代码优化会将整行代码检测为未使用的代码,并正确地删除其间的所有内容
if(记录器显示日志){
debug(“我的log语句将显示一些变量:“+variable1+”,可能还有另一个:“+variable2”);
}
另见:

如果您还认为,R8应该与ProGuard一样使用,请在下面的问题中选择一个:



谢谢。但我想问的是,安卓是否会自动做到这一点。因为Android文档现在说:当您使用Android Gradle插件3.4.0或更高版本构建项目时,该插件不再使用ProGuard执行编译时代码优化。相反,该插件与R8编译器配合使用,以处理以下编译时任务……哦,好吧,这对我来说是一条缺失的信息!非常感谢。
invoke-virtual {p1}, Landroid/os/Bundle;->toString()Ljava/lang/String;