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()方法依然被保留了,