Android反編譯和程式碼混淆

weixin_34320159發表於2016-07-08

混淆: 並不是讓程式碼無法被反編譯,而是將程式碼中的類、方法、變數等資訊進行重新命名,把它們改成一些毫無意義的名字。混淆程式碼可以在不影響程式正常執行的前提下讓破解者很頭疼,從而大大提升了程式的安全性。

混淆APK: build.gradle中minifyEnabled的值是false,這裡我們只需要把值改成true,打出來的APK包就會是混淆過的了。

release { 
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

其中minifyEnabled用於設定是否啟用混淆,proguardFiles用於選定混淆配置檔案。注意這裡是在release閉包內進行配置的,因此只有打出正式版的APK才會進行混淆,Debug版的APK是不會混淆的。

proguard-android.txt檔案:
Android SDK/tools/proguard目錄下

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Dont warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

-dontusemixedcaseclassnames: 表示混淆時不使用大小寫混淆類名。
-dontskipnonpubliclibraryclasses:不跳過library中的非public方法。
-verbose: 列印混淆的詳細資訊。
-dontoptimize: 不進行優化,優化可能會造成一些潛在風險,不能保證在所有版本的Dalvik上都正常執行。
-dontpreverify: 不進行預校驗。
** -keepattributes Annotation **:對註解引數進行保留。
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService:

表示不混淆上述宣告的兩個類。

表示不混淆任何包含native方法的類的類名以及native方法名

-keepclasseswithmembernames class * {
    native <methods>;
}

表示不混淆任何一個View中的setXxx()和getXxx()方法,因為屬性動畫需要有相應的setter和getter的方法實現

-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

表示不混淆Activity中引數是View的方法

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

表示不混淆列舉中的values()和valueOf()方法

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

表示不混淆Parcelable實現類中的CREATOR欄位

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

表示不混淆R檔案中的所有靜態欄位

-keepclassmembers class **.R$* { public static <fields>;}

proguard中一共有三組六個keep關鍵字的含義

keep  保留類和類中的成員,防止它們被混淆或移除。
keepnames 保留類和類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除。
keepclassmembers  只保留類中的成員,防止它們被混淆或移除。
keepclassmembernames  只保留類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除。
keepclasseswithmembers  保留類和類中的成員,防止它們被混淆或移除,前提是指名的類中的成員必須存在,如果不存在則還是會混淆。
keepclasseswithmembernames  保留類和類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除,前提是指名的類中的成員必須存在,如果不存在則還是會混淆。

keepclasseswithmember和keep關鍵字的區別
如果這個類沒有native的方法,那麼這個類會被混淆

-keepclasseswithmember class * {
    native <methods>;
}

不管這個類有沒有native的方法,那麼這個類不會被混淆

-keep class * {
    native <methods>;
}

proguard-rules.pro:
任何一個Android Studio專案在app模組目錄下都有一個proguard-rules.pro檔案,這個檔案就是用於讓我們編寫只適用於當前專案的混淆規則的

相關文章