如何在 Release 版本的 android 中使用 Proguard 防止 LOG 打印
How to prevent LOG print using Proguard in android in Release build
我正在使用 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只是一种在控制台打印的方法(phone日志文件)
即使这是发布版本,它也会被执行
如果您想在发布版本中阻止日志,请按照以下步骤操作:
像这样创建一个class:
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);
}
}
}
Now in application class init isDebug variable
public static boolean isDebug = BuildConfig.DEBUG;
然后像这样打印你的日志
LogTag.d('message...');
否则将此行添加到 proguard
-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);
我正在使用 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只是一种在控制台打印的方法(phone日志文件) 即使这是发布版本,它也会被执行 如果您想在发布版本中阻止日志,请按照以下步骤操作:
像这样创建一个class:
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);
}
}
}
Now in application class init isDebug variable
public static boolean isDebug = BuildConfig.DEBUG;
然后像这样打印你的日志
LogTag.d('message...');
否则将此行添加到 proguard
-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);