android 混淆

本文轉自 http://deanandbai-gmail-com.iteye.com/blog/1538663

注意:這裏介紹的混淆是2.3SDK以後我方式。

 

1.打開工程會發現一個文件“proguard-android.txt”

  -optimizationpasses 5 

-dontusemixedcaseclassnames  

-dontskipnonpubliclibraryclasses  

-dontpreverify  

-verbose  

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  

-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 com.android.vending.licensing.ILicensingService  

-keepclasseswithmembernames class * {  

    native <methods>;  

}  

-keepclasseswithmembernames class * {  

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

}  

-keepclasseswithmembernames class * {  

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

}  

-keepclassmembers enum * {  

    public static **[] values();  

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

}  

-keep class * implements android.os.Parcelable {  

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

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-dontpreverify

-verbose

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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 com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {

    native <methods>;

}

-keepclasseswithmembernames class * {

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

}

-keepclasseswithmembernames class * {

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

}

-keepclassmembers enum * {

    public static **[] values();

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

}

-keep class * implements android.os.Parcelable {

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

}

 

 

上述文件就是android 自帶的文件,從腳本中可以看到,混淆中保留了繼承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本組件。

並保留了所有的Native變量名及類名,所有類中部分以設定了固定參數格式的構造函數,枚舉等等。

此文件中的每一項在後面會具體列出。

 

2。操作步驟

  1).在工程的"default.properties"中添加這樣一句話“proguard.config=proguard-android.txt”

  2).簽名打包:選中工程--->右擊Android Tools—Export Signed Appalication Packges

  3).打出的APK反編譯你會發現代碼都邊了,此APK可以安裝使用。

 

3。遇到問題

  1).如果不能打包,看出錯在那裏,一般的出現warning 的話,你在 proguard-android.txt文件中添加這一命令

    -dontwarn

  2).打包出的結果比以往的不混淆的大小是不一樣的,可能省略很多東西。具體要看 proguard文件夾中的           四個.txt文件

       運行混淆器之後輸出的文件有:

         dump.txt

                   描述.apk包中所有class文件的內部結構。

         mapping.txt

                   列出了源代碼與混淆後的類,方法和屬性名字之間的映射。這個文件對於在構建之後得到的     bug報告是有用的,因爲它把混淆的堆棧跟蹤信息反翻譯爲源代碼中的類,方法和成員名字。更多信息,    查看解碼混淆過的堆棧跟蹤信息。

         seeds.txt

                   列出那些未混淆的類和成員。

         usage.txt

                   列出從.apk中剝離的代碼

  3).有些類是不能混淆的,從proguard-android.txt文件可以看出,保留了很多類和方法。

  4).新建的工程中可能proguard-android.txt文件是空的,你可以去SDK目錄下..\android-sdk-windows\tools\proguard查找這個文件。

 

 

 

 

 

3.介紹下proguard中的各個代碼的具體含義

參數: 

 

-include {filename}    從給定的文件中讀取配置參數 

 

-basedirectory {directoryname}    指定基礎目錄爲以後相對的檔案名稱 

 

-injars {class_path}    指定要處理的應用程序jar,war,ear和目錄 

 

-outjars {class_path}    指定處理完後要輸出的jar,war,ear和目錄的名稱 

 

-libraryjars {classpath}    指定要處理的應用程序jar,war,ear和目錄所需要的程序庫文件 

 

-dontskipnonpubliclibraryclasses    指定不去忽略非公共的庫類。 

 

-dontskipnonpubliclibraryclassmembers    指定不去忽略包可見的庫類的成員。 

 

 

保留選項 

-keep {Modifier} {class_specification}    保護指定的類文件和類的成員 

 

-keepclassmembers {modifier} {class_specification}    保護指定類的成員,如果此類受到保護他們會保護的更好 

 

-keepclasseswithmembers {class_specification}    保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。 

 

-keepnames {class_specification}    保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除) 

 

-keepclassmembernames {class_specification}    保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除) 

 

-keepclasseswithmembernames {class_specification}    保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後) 

 

-printseeds {filename}    列出類和類的成員-keep選項的清單,標準輸出到給定的文件 

 

壓縮 

-dontshrink    不壓縮輸入的類文件 

 

-printusage {filename} 

 

-whyareyoukeeping {class_specification}     

 

優化 

-dontoptimize    不優化輸入的類文件 

 

-assumenosideeffects {class_specification}    優化時假設指定的方法,沒有任何副作用 

 

-allowaccessmodification    優化時允許訪問並修改有修飾符的類和類的成員 

 

混淆 

-dontobfuscate    不混淆輸入的類文件 

 

-printmapping {filename} 

 

-applymapping {filename}    重用映射增加混淆 

 

-obfuscationdictionary {filename}    使用給定文件中的關鍵字作爲要混淆方法的名稱 

 

-overloadaggressively    混淆時應用侵入式重載 

 

-useuniqueclassmembernames    確定統一的混淆類的成員名稱來增加混淆 

 

-flattenpackagehierarchy {package_name}    重新包裝所有重命名的包並放在給定的單一包中 

 

-repackageclass {package_name}    重新包裝所有重命名的類文件中放在給定的單一包中 

 

-dontusemixedcaseclassnames    混淆時不會產生形形色色的類名 

 

-keepattributes {attribute_name,...}    保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. 

 

-renamesourcefileattribute {string}    設置源文件中給定的字符串常量 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章