混淆器經過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。所以,當你的應用程序對安全敏感(要求高),例如當你受權應用程序的時候,混淆器是一種重要的保護手段。
混淆器被集成在android 構建系統中,因此你沒必要手動調用它。同時混淆器僅在發佈模式下進行構建應用程序的時候纔會運行起來,因此在調試模式下構建程序時,你沒必要處理混淆代碼。讓混淆器運行起來是可選擇的,可是推薦選上。java
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. target=android-19
將proguard.config前面的註釋去掉android
若是在程序中使用了第三方的`jar`包,在混淆後致使出錯,這時咱們須要在proguard-project.txt中去進行相應的配置,來讓其在混淆時不要混淆相應的jar包。對改配置文件中的相關配置解釋以下:安全
-keep public class * extends android.app.Activity 【不進行混淆類名的類,保持其原類名和包名】 -keep public abstract interface com.asqw.android.Listener{ public protected <methods>; 【全部public protected的方法名不進行混淆】 } -keep public class com.asqw.android{ public void Start(java.lang.String); 【對該方法不進行混淆】 } -keepclasseswithmembernames class * { 【對全部類的native方法名不進行混淆】 native <methods>; } -keepclasseswithmembers class * { 【對全部類的指定方法的方法名不進行混淆】 public <init>(android.content.Context, android.util.AttributeSet); } -keepclassmembers class * extends android.app.Activity {【對全部類的指定方法的方法名不進行混淆】 public void *(android.view.View); } -keepclassmembers enum * {【對枚舉類型enum的全部類的如下指定方法的方法名不進行混淆】 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable {【對實現了Parcelable接口的全部類的類名不進行混淆,對其成員變量爲Parcelable$Creator類型的成員變量的變量名不進行混淆】 public static final android.os.Parcelable$Creator *; } -keepclasseswithmembers class org.jboss.netty.util.internal.LinkedTransferQueue {【對指定類的指定變量的變量名不進行混淆】 volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node head; volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node tail; volatile transient int sweepVotes; } -keep public class com.unionpay.** {*; }【對com.unionpay包下全部的類都不進行混淆,即不混淆類名,也不混淆方法名和變量名】
通過上面這兩部以後反編譯後就能混淆了,可是四大組件還在,爲何四大組件還在呢,由於四大組件是在清單文件中進行配置的,若是混淆後就不能根據清單文件的配置去尋找了。
若是對於一些本身的代碼中要想提供出來讓別人經過反射調用的方法時,咱們不想讓部分代碼被混淆,或者是咱們使用別人提供的第三方jar包,由於第三方的jar包通常都是已經混淆過的,咱們要是再混淆就會報錯了,因此咱們要保證這些內容不用混淆,這裏咱們只需修改這個文件,而後加上後面的一句話,他就不會混淆咱們給出的內容app
-keepattributes *Annotation* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgent -keep public class * extends android.preference.Preference -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment -keep public class com.android.vending.licensing.ILicensingService-keep class net.youmi.android.** { *; }