Androidstudio 混淆去掉日志 assumenosideeffects 不起作用

来源:互联网 发布:中越战争 知乎 编辑:程序博客网 时间:2024/06/16 17:54

1.gradle

主要看 buildTypes

apply plugin: 'com.android.application'android {    compileSdkVersion 26    buildToolsVersion "26.0.1"    defaultConfig {        applicationId "com.dxiang.demoproguard"        minSdkVersion 16        targetSdkVersion 26        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        debug {            //Zipalign优化            zipAlignEnabled true            // 移除无用的resource文件            shrinkResources true            //混淆--            minifyEnabled true            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//默认不优化            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'//optimize 默认优化就是这两个区别////            //签名//            signingConfig signingConfigs.release        }        release {            //Zipalign优化            zipAlignEnabled true            // 移除无用的resource文件            shrinkResources true            //混淆--            minifyEnabled true            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'////            //签名//            signingConfig signingConfigs.release        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'    })    compile 'com.android.support:appcompat-v7:26.+'    compile 'com.android.support.constraint:constraint-layout:1.0.2'    testCompile 'junit:junit:4.12'}

2。proguard-rules.pro文件

  -keepclassmembers class * extends android.support.v7.app.AppCompatActivity {      public void *(android.view.View);    }  -keep class * implements android.os.Parcelable {   public static final android.os.Parcelable$Creator *;  } -dontwarn android.support.** -keepclassmembers class **.R$* {   public static <fields>; }-assumenosideeffects class android.util.Log {    public static boolean isLoggable(java.lang.String,int);    public static int v(...);    public static int i(...);    public static int w(...);    public static int d(...);   public static int e(...);}-assumenosideeffects class java.io.PrintStream {    public *** println(...);    public *** print(...);}

注释:

1.去掉log日志:  -assumenosideeffects class android.util.Log {
      public static boolean isLoggable(java.lang.String,int);
      public static int v(...);
      public static int i(...);
      public static int w(...);
      public static int d(...);
     public static int e(...);
  }
2.去掉System.out.println 和System.out.print输出:  -assumenosideeffects class java.io.PrintStream {
      public *** println(...);
      public *** print(...);
  }


3.assumenosideeffects :assume no side effects:无副作用的东西


3.assumenosideeffects 不起作用注意点:

1. 在gradle中使用的文件错误:

    1) //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件;

//这两个文件是合并关系;

//  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//默认不优化
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'//optimize 默认优化就是这两个区别

本文使用的是proguard-android-optimize.tx这个文件,不是Android Studio默认使用的proguard-android.txt

   2) proguard-android.txt 和proguard-android-optimize.txt的区别:

(1).proguard-android.txt 默认不优化,而proguard-android-optimize.txt是优化的;

   3)一定要注意-dontoptimize,配置。

        (1)don‘t   optimize 不要优化  将会关闭优化,导致日志语句不会被优化掉,所以不能有这个配置;

(2)如果有“-dontoptimize”这句话 一定要将其注释掉;

 (3)  “2)” 的却别,就在于proguard-android.txt配置了这句话“-dontoptimize”,而"proguard-android-optimize.txt"没有使用

4.测试

源码1)

检验是否真的能优化掉日志。。
public class MainActivity extends Activity {      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Log.e("MainActivity", "log" );      }  } 

通过生成的apk反编译出如下代码1-1)

public class MainActivity extends Activity  {    protected void onCreate(Bundle paramBundle)    {      super.onCreate(paramBundle);      setContentView(2130903040);    }  }  

运行LogCat中没有输出日志。

很明显Log.e("MainActivity","log" );被优化掉了

源码2)

Log.e("jiese1990", test() );test()函数会被一起优化掉吗?
public class MainActivity extends Activity {      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Log.e("MainActivity", "log " + test());      }            private String test(){          Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();          return "jjyy";      }  }  


通过生成的apk反编译出如下代码2-1) 

public class MainActivity extends Activity  {    protected void onCreate(Bundle paramBundle)    {      super.onCreate(paramBundle);      setContentView(2130903040);      //如下是test()函数的代码      StringBuilder localStringBuilder = new StringBuilder("log ");      Toast.makeText(this, "test", 0).show();      localStringBuilder.append("jjyy").toString();    }  } 


运行LogCat中没有输出日志。但是弹出toast。

很明显Log.e();被优化掉了,但是test()方法依然被保留了,


源码3):

Log.e("jiese1990", test() );test()函数会被一起优化掉吗?
public class MainActivity extends Activity {      int i = 0;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Log.e("MainActivity", "log" + test() );          Toast.makeText(this, "i = " + i, Toast.LENGTH_SHORT).show();    //i == 1;      }        private String test(){          i++;          return "test" + i;      }  }  


通过生成的apk反编译出如下代码3-1)

public class MainActivity extends Activity  {    private int a = 0;    //proguard将代码混淆后变量i变为了a      protected void onCreate(Bundle paramBundle)    {      super.onCreate(paramBundle);      setContentView(2130903040);      //Log.e()代码被删除了,但是调用test()函数里的i++被直接优化到这里      StringBuilder localStringBuilder = new StringBuilder("log");          this.a = (1 + this.a);      localStringBuilder.append("test" + this.a).toString();      Toast.makeText(this, "i = " + this.a, 0).show();    }  } 

 


运行LogCat中没有输出日志。但是弹出toast 显示字符串 : "i = 1"

很明显Log.e();被优化掉了,但是test()方法依然被保留了,