gpt4 book ai didi

java - 如何在 Release build 的 android 中使用 Proguard 防止 LOG 打印

转载 作者:行者123 更新时间:2023-11-29 19:29:24 25 4
gpt4 key购买 nike

我正在使用 Android studio 2.2.2 gradle。我以这种方式在 build.gradle 中使用 Proguard。

 buildTypes {

release {

// Enable ProGuard
minifyEnabled true
shrinkResources true
// Common release options
zipAlignEnabled true
debuggable false
jniDebuggable false

// Notice that the default ProGuard file (SDK-provided) also enables optimization
// Here we also include a third file which disables the logging (see below)
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'


}

debug {
// We enable ProGuard also for debug builds
minifyEnabled true

// Notice that the default ProGuard file (SDK-provided) differs from the release one
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

这是我的混淆器...

-keepattributes EnclosingMethod

-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
-dontwarn sun.misc.Unsafe
-dontwarn org.w3c.dom.bootstrap.DOMImplementatio Registry

-keep class * extends android.

-assumenosideeffects class android.util.Log { *; }

-assumenosideeffects class java.io.PrintStream {
public void println(...);
public void print(...);
}

现在,在我的 MainActivity.java 中,我在 oncreate 中检查了一些东西——

 int i=0;
Log.d(TAG,"i val:"+i++);
Toast i value

并且总是输出“i val:1”。现在我的问题是为什么要执行日志行?

最佳答案

日志行或 system.out 只是一种在控制台(电话日志文件)中打印的方法即使这是发布版本,它也会被执行如果您想在发布版本中阻止日志,请按照以下步骤操作:

像这样创建一个类:

public class LogTag {
public static void d(String msg){
if (ApplicationClass.isDebug){
Log.d("log_tag", msg);
}
}

public static void v(String msg){
if (ApplicationClass.isDebug){
Log.v("log_tag", msg);
}
}
public static void e(String msg,Exception e){
if (ApplicationClass.isDebug){
Log.e("log_tag", msg, e);
}
}
public static void e(String msg){
if (ApplicationClass.isDebug){
Log.e("log_tag", msg);
}
}
}

现在在应用程序类中初始化isDebug变量

public static boolean isDebug = BuildConfig.DEBUG;

然后像这样打印你的日志

LogTag.d('message...');

否则在混淆器中添加这行

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

如果你反编译 apk,让我们更深入地看一下,这是你将拥有的代码:

    Log.d("TAG", "TAG");
int i = 0 + 1;
Log.d("TAG", "i val:" + 0);
System.out.println("i:" + i);

原创

    Log.d("TAG","TAG");
int i=0;
Log.d("TAG","i val:"+i++);
System.out.println("i:"+i);

所以你可以看到编译器会随着我们尝试优化和删除 Log.d 而改变

再举个例子反编译代码:

    int index = 0;
while (index < 10) {
int i2 = i + 1;
Log.d("TAG", "i val:" + i);
index++;
i = i2;
}
System.out.println("i:" + i);

原代码:

    for(int index = 0;index<10;index++){
Log.d("TAG","i val:"+i++);
}
System.out.println("i:"+i);

关于java - 如何在 Release build 的 android 中使用 Proguard 防止 LOG 打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40427034/

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