android程式的代碼混淆打包

來源:互聯網
上載者:User

混淆前提

1.首先是你項目起碼已經有幾個包(指不同路徑的),別以為可以在MainActivity中寫個Helloworld就能看出效果。。。

自己用已經完成小demo來試。。。應該也很快的。。。

2.一定一定要用打包的形式,產生那個apk檔案。。。不然dug產生的apk不帶有混淆功能(起碼我試的時候eclipse死活產生的是沒有。不知其他人)。

切記:以上面兩點下面的代碼混淆才有用。。。

下面的都是轉載於:http://www.th7.cn/Program/Android/201301/122409.shtml

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-keep class com.badlogic.gdx.backends.android.**{ *;} 

像這樣的只是不混淆:這個包下的類(不包括子包裡的東西),用到一個第三文的類就要把這個類所在的包,像上面加上 還要注意的是android-support-v4.jar這個包問題,這裡加上了對這個jar包的處理 第三方jar的混淆, -optimizationpasses 5 -dontusemixedcaseclassnames  -dontskipnonpubliclibraryclasses  -dontpreverify  -verbose  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  -keep public class * extends android.app.Activity                          // 繼承activity,application,service,broadcastReceiver,contentprovider....不進行混淆-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                                                                                                                       // 這裡處理第三方的jar包,第三方JAR包處理開始-libraryjars /libs/android-support-v4.jar-libraryjars /libs/gdx-backend-android.jar-libraryjars /libs/gdx.jar                                                                                                                         // 這裡不對第三方的jar包的提出WARN     -dontwarn com.badlogic.**-dontwarn android.support.v4.**-dontwarn android.support.v4.view.**                                                                                                                         // 這裡對第三方jar包的類不進行混淆-keep class com.badlogic.gdx.backends.android.**{ *;} -keep class com.badlogic.gdx.**{ *;}-keep class com.badlogic.gdx.graphics.g2d.**{ *;}-keep class com.badlogic.gdx.graphics.**{ *;}-keep class android.support.v4.view.**{ *;}                                                                                                                             // 這裡第三方JAR包處理結束 -keepclasseswithmembernames class * {                                                           // natvie 方法不混淆    native <methods>;  }  -keepclasseswithmembers class * {                                                                    // 對於所有類,有這個建構函式不進行混淆,主要是為了在layout中的,自訂的view    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 {                                   // 這個主要是在layout 中寫的onclick方法android:onclick="onClick",不進行混淆   public void *(android.view.View);  }  -keepclassmembers enum * {      public static **[] values();      public static ** valueOf(java.lang.String);  }  -keep class * implements android.os.Parcelable {    public static final android.os.Parcelable$Creator *;  } ------------------------------------------------------1上面是解析哪些操作----------------------------------------------------------------------------如果工程引入了Android-support-v4的jar類庫,那麼在工程打包混淆時,就會出現報錯提示。例如提示你:You may need to specify additional library jars (using '-libraryjars')。 這裡先給出解決方案,稍後我們再來解釋如何處理類似情況: 在proguard.cfg裡的後面,添加如下內容: 1.-libraryjars /android-support-v4.jar   2.-dontwarn android.support.v4.**   3.-keep class android.support.v4.** { *; }   4.-keep public class * extends android.support.v4.**   5.-keep public class * extends android.app.Fragment   然後你再打包看看,應該可以正常產生apk安裝包了。 打包出錯:情況一: "類1 can't find referenced class 類2" 字面上的意思就是類1找不到類2的引用;它會建議你:"You may need to specify additional library jars (using '-libraryjars').";需要使用-libraryjars加上項目中使用到的第三方庫就OK了。例如:-libraryjars /android-support-v4.jar注意:這裡引用方式是當前工程的根目錄(也可以配置其他目錄),也就是說,你要把第三方jar放到目前的目錄下,否則就會警告說找不到jar檔案! 情況二:例如: can't find superclass or interface android.os.Parcelable$ClassLoaderCreator,碰到這樣的情況,可以使用-dontwarn com.xx.yy.**,不對錯誤提出警告。注意:使用這個方式的話,要確保自己沒有用到這個庫裡面的類!否則就會拋ClassNotFoundException! 情況三:在工程中確實用到了該類,採用上面方式還是不行。這個時候就要再增加一項:-keep class com.xx.yy.** { *;},讓當前類不混淆。 小結:對於引用第三方包的情況,可以採用下面方式避免打包出錯:-libraryjars /aaa.jar-dontwarn com.xx.yy.**-keep class com.xx.yy.** { *;} -----------------------------------------------------------------------------------2-------------------------------------------------------------------- proguard.cfg配置 稍微深入想一下混淆後的結果,你就會發現,如果一些提供給外部的類、方法、變數等名字被改變了,那麼程式本身的功能就無法正常實現。那麼Proguard如何知道哪些東西是可以改名,而哪些是不能改變的呢? 這個是靠proguard.cfg檔案來進行配置的。Android工程中預設自動產生的proguard.cfg已經針對Android的一般情況進行了配置,我們開啟這個設定檔。內容大概如下: 1.-optimizationpasses 5  2.-dontusemixedcaseclassnames  3.-dontskipnonpubliclibraryclasses  4.-dontpreverify  5.-verbose  6.-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  7.  8.-keep public class * extends android.app.Activity  9.-keep public class * extends android.app.Application  10.-keep public class * extends android.app.Service  11.-keep public class * extends android.content.BroadcastReceiver  12.-keep public class * extends android.content.ContentProvider  13.-keep public class * extends android.app.backup.BackupAgentHelper  14.-keep public class * extends android.preference.Preference  15.-keep public class com.android.vending.licensing.ILicensingService  16.  17.-keepclasseswithmembernames class * {  18.    native <methods>;  19.}  20.  21.-keepclasseswithmembers class * {  22.    public <init>(android.content.Context, android.util.AttributeSet);  23.}  24.  25.-keepclasseswithmembers class * {  26.    public <init>(android.content.Context, android.util.AttributeSet, int);  27.}  28.  29.-keepclassmembers class * extends android.app.Activity {  30.   public void *(android.view.View);  31.}  32.  33.-keepclassmembers enum * {  34.    public static **[] values();  35.    public static ** valueOf(java.lang.String);  36.}  37.  38.-keep class * implements android.os.Parcelable {  39.  public static final android.os.Parcelable$Creator *;  40.}   它主要保留了繼承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子類。因為這些子類,都是可能被外部調用的。 另外,它還保留了含有native方法的類、建構函式從xml構造的類(一般為View的子類)、枚舉類型中的values和valueOf靜態方法、繼承Parcelable的跨進程資料類。 在實際的一個工程項目中,可能Google自動產生的配置不能勝任我們的混淆工作。所以,我們往往需要自己編寫一些ProGuard配置。這方面的資料在官網的Manual -> Usage裡有詳細說明,大家可以研究一下  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.