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

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)

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

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

  1. public class MainActivity extends Activity
  2. {
  3. protected void onCreate(Bundle paramBundle)
  4. {
  5. super.onCreate(paramBundle);
  6. setContentView(2130903040);
  7. }
  8. }


运行LogCat中没有输出日志。

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

源码2)

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

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

  1. public class MainActivity extends Activity
  2. {
  3. protected void onCreate(Bundle paramBundle)
  4. {
  5. super.onCreate(paramBundle);
  6. setContentView(2130903040);
  7. //如下是test()函数的代码
  8. StringBuilder localStringBuilder = new StringBuilder("log ");
  9. Toast.makeText(this, "test", 0).show();
  10. localStringBuilder.append("jjyy").toString();
  11. }
  12. }

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

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

源码3):

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

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

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


 

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

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

(0)

相关推荐