【Bluecoffee原創】轉載請註明出處哦!java
要想打出混淆包,總共分幾步:android
第一步:將安卓項目中的Java代碼導出爲Jar包。apache
導出方式:src下的目錄,右鍵選擇Export,以下圖選擇導出jar包app
next下一步,注意src下面的文件夾要都勾選上,以下圖,ide
finish,導出jar包成功,若是不放心jar包裏面的類是否完整,能夠使用jd-gui工具反編譯來查看。工具
第二步:copy一個一樣的項目(能夠copy到另外一個工做空間),把src下面的java類所有刪掉,把第一步導出jar包放到lib下面,運行一下app,看功能是否正常。若是正常,那麼請進入第三步,若是不正常,請回退到第一步檢查是否有類沒有導出成功。測試
第三步:重頭戲來了,使用proguard混淆第一步導出的jar包。ui
proguard在哪裏呢?請見「Your sdk 路徑\tools\proguard」,sdk中已經有proguard工具了,不須要另外下載。 在proguard\bin下,運行proguardgui.bat,見下圖:google
點擊Load Configuration,load進去一個文件,裏面能夠寫好須要keep的類,下面,我給出一個例子:code
-injars 第一步的jar包.jar -outjars 導出的jar包.jar -libraryjars '你的項目路徑\libs\android-support-v4.jar' -libraryjars '你的jdk路徑\jdk1.6.0_37' -libraryjars '你的sdk路徑\platforms\android-21' -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -optimizationpasses 5 -printmapping mapping.txt -dontusemixedcaseclassnames -keepattributes *Annotation*,Signature -dontpreverify -verbose -dontwarn com.alipay.android.phone.mrpc.core**,com.alipay.apmobilesecuritysdk.face**,cn.jpush**,com.lidroid**,com.sinovoice**,com.baidu**,com.android.volley.toolbox**,com.google.gson**,org.apache.http**,com.handmark.pulltorefresh**,com.squareup.picasso**,com.cheweishi.android.entity** -keep class * extends java.lang.annotation.Annotation { <fields>; <methods>; } -keep public class * extends android.app.Fragment -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.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep class com.alipay.android.phone.mrpc.core.** { <fields>; <methods>; } -keep class com.alipay.apmobilesecuritysdk.face.** { <fields>; <methods>; } -keep class cn.jpush.** { <fields>; <methods>; } -keep class com.lidroid.** { <fields>; <methods>; } # 自定義控件不須要混淆 -keep class com.cheweishi.android.widget.** { <fields>; <methods>; } -keep class com.sinovoice.** { <fields>; <methods>; } -keep class com.baidu.** { <fields>; <methods>; } -keep class vi.com.gdi.bgl.android.** { <fields>; <methods>; } -keep class com.android.volley.toolbox { <fields>; <methods>; } -keep class com.google.gson.** { <fields>; <methods>; } -keep class org.apache.http.** { <fields>; <methods>; } -keep class com.handmark.pulltorefresh.** { <fields>; <methods>; } -keep class com.squareup.picasso.** { <fields>; <methods>; } -keep class com.cheweishi.android.entity.** { <fields>; <methods>; } -keep class com.cheweishi.android.response.BaseResponse -keep public class com.android.vending.licensing.ILicensingService -keep class * extends android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclasseswithmembers,allowshrinking class * { public <init>(android.content.Context,android.util.AttributeSet); } -keepclasseswithmembers,allowshrinking class * { public <init>(android.content.Context,android.util.AttributeSet,int); } # Also keep - Enumerations. Keep the special static methods that are required in # enumeration classes. -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # Keep names - Native method names. Keep all native class/method names. -keepclasseswithmembers,allowshrinking class * { native <methods>; }
漢字路徑請先自行替換,若是文件都更改正確,接下來能夠一路next按鈕就能夠,假若有些地方須要修改,能夠逐個next修改配置,舉個栗子:
在第二個選項卡input、output就能夠修改導入導出的jar路徑,及依賴的類庫路徑,接下來還能夠配置須要keep的路徑,再也不贅述。
最後,來到process標籤頁,點擊Process!,就開始混淆啦,通過一堆log以後,混淆結束。 注意:在log中,Note級別沒有問題,存在warn,error一類的log那麼就是有問題了,請根據錯誤提示,修改配置便可。
第四步:接近成功了!將混淆過導出的jar包放到第二步的copy項目中,不要忘記把原來測試的jar包刪掉。
接下來運行app,看看混淆後的app是否正常工做。在用jd-gui看看混淆事後的jar包可讀性如何,必定看起來很想哭吧,那就對了,大功告成!