1. 程式人生 > >android應用程式的混淆打包(轉)

android應用程式的混淆打包(轉)

target=android-8

proguard.config=proguard.cfg

Eclipse會通過此配置在工程目錄生成proguard.cfg檔案

 2 . 生成keystore (如已有可直接利用)

按照下面的命令列 在D:\Program Files\Java\jdk1.6.0_07\bin>目錄下,輸入keytool -genkey -alias android.keystore -keyalg RSA -validity 100000 -keystore android.keystore

引數意義:-validity主要是證書的有效期,寫100000天;空格,退格鍵 都算密碼。

命令執行後會在D:\Program Files\Java\jdk1.6.0_07\bin>目錄下生成 android.keystore檔案。

 3. 在Eclipce的操作

File -> Export -> Export Android Application -> Select project -> Using the existing keystore , and input password -> select the destination APK file 

經過混淆後的原始碼,原先的類名和方法名會被類似a,b,c。。。的字元所替換,混淆的原理其實也就是類名和方法名的對映。

但4大元件並沒有混淆(所有在清單檔案定義的元件不能被混淆),因為系統需要通過清單檔案來查詢和執行應用程式

 proguard.cfg 檔案程式碼解讀

-optimizationpasses 5  ->設定混淆的壓縮比率 0 ~ 7 

-dontusemixedcaseclassnames -> Aa aA 

-dontskipnonpubliclibraryclasses ->如果應用程式引入的有jar包,並且想混淆jar包裡面的class 

-dontpreverify 

-verbose ->混淆後生產對映檔案 map 類名->轉化後類名的對映

 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  ->混淆採用的演算法.

 -keep public class * extends android.app.Activity   ->所有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.BackupAgentHelper

-keep public class * extends android.preference.Preference

-keep public class com.android.vending.licensing.ILicensingService

 -keepclasseswithmembernames class * {

    native <methods>;   -> 所有native的方法不能去混淆. 

}

 -keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet);

    -->某些構造方法不能去混淆

}

 -keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet, int);

}

 -keepclassmembers class * extends android.app.Activity {

   public void *(android.view.View);

}

 -keepclassmembers enum * {   -> 列舉類不能去混淆. 

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

 -keep class * implements android.os.Parcelable {   -> aidl檔案不能去混淆. 

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

}