android studio 混淆去log不起作用,Androidstudio 混淆去掉日志 assumenosideeffects 不起作用...

本文详细解读了如何在Gradle中使用Proguard进行混淆和资源优化,并展示了如何在proguard-rules.pro中配置去除日志和System.out控制台输出。重点讨论了不同混淆文件的区别,以及在实际项目中的应用实例,确保代码在发布时的体积减小和安全性提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.gradle

主要看 buildTypes

apply plugin: 'com.android.application'android {

compileSdkVersion 26buildToolsVersion "26.0.1"defaultConfig {

applicationId"com.dxiang.demoproguard"minSdkVersion 16targetSdkVersion 26versionCode1versionName"1.0"testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"}

buildTypes {

debug {

//Zipalign优化zipAlignEnabledtrue// 移除无用的resource文件shrinkResourcestrue//混淆--minifyEnabledtrue//前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//默认不优化proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'//optimize 默认优化就是这两个区别//// //签名// signingConfig signingConfigs.release}

release {

//Zipalign优化zipAlignEnabledtrue// 移除无用的resource文件shrinkResourcestrue//混淆--minifyEnabledtrue//前一部分代表系统默认的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文件

-keepclassmembersclass * extends android.support.v7.app.AppCompatActivity {

public void *(android.view.View);}

-keepclass * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;}

-dontwarnandroid.support.**

-keepclassmembersclass **.R$* {

public static ;}

-assumenosideeffectsclass 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(...);}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值