主要看 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優(yōu)化 zipAlignEnabled true // 移除無(wú)用的resource文件 shrinkResources true //混淆-- minifyEnabled true //前一部分代表系統默認的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個(gè)文件是自己的定義混淆文件// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//默認不優(yōu)化 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'//optimize 默認優(yōu)化就是這兩個(gè)區別 //簽名// signingConfig signingConfigs.release } release { //Zipalign優(yōu)化 zipAlignEnabled true // 移除無(wú)用的resource文件 shrinkResources true //混淆-- minifyEnabled true //前一部分代表系統默認的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個(gè)文件是自己的定義混淆文件 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'}
-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(...);}
注釋?zhuān)?/span>
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:無(wú)副作用的東西
1. 在gradle中使用的文件錯誤:
1) //前一部分代表系統默認的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個(gè)文件是自己的定義混淆文件;
//這兩個(gè)文件是合并關(guān)系;
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//默認不優(yōu)化
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'//optimize 默認優(yōu)化就是這兩個(gè)區別
本文使用的是proguard-android-optimize.tx這個(gè)文件,不是Android Studio默認使用的proguard-android.txt
2) proguard-android.txt 和proguard-android-optimize.txt的區別:
(1).proguard-android.txt 默認不優(yōu)化,而proguard-android-optimize.txt是優(yōu)化的;
3)一定要注意-dontoptimize,配置。
(1)don't optimize 不要優(yōu)化 將會(huì )關(guān)閉優(yōu)化,導致日志語(yǔ)句不會(huì )被優(yōu)化掉,所以不能有這個(gè)配置;
(2)如果有“-dontoptimize”這句話(huà) 一定要將其注釋掉;
(3) “2)” 的卻別,就在于proguard-android.txt配置了這句話(huà)“-dontoptimize”,而"proguard-android-optimize.txt"沒(méi)有使用
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.e("MainActivity", "log" );
- }
- }
通過(guò)生成的apk反編譯出如下代碼1-1)
- public class MainActivity extends Activity
- {
- protected void onCreate(Bundle paramBundle)
- {
- super.onCreate(paramBundle);
- setContentView(2130903040);
- }
- }
很明顯Log.e("MainActivity","log"
- 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";
- }
- }
通過(guò)生成的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中沒(méi)有輸出日志。但是彈出toast。
很明顯Log.e();被優(yōu)化掉了,但是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;
- }
- }
通過(guò)生成的apk反編譯出如下代碼3-1)
- public class MainActivity extends Activity
- {
- private int a = 0; //proguard將代碼混淆后變量i變?yōu)榱薬
- protected void onCreate(Bundle paramBundle)
- {
- super.onCreate(paramBundle);
- setContentView(2130903040);
- //Log.e()代碼被刪除了,但是調用test()函數里的i++被直接優(yōu)化到這里
- 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中沒(méi)有輸出日志。但是彈出toast 顯示字符串 : "i = 1"
很明顯Log.e();被優(yōu)化掉了,但是test()方法依然被保留了,
聯(lián)系客服