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)

检验是否真的能优化掉日志。。
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()方法依然被保留了,



  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值