雖然做了幾年開發,但混淆在前兩個公司還真沒有接觸過,被上司一問,“沒做過?”感覺耳朵都紅了,⊙﹏⊙b汗,趕緊補習了下,再此做個記錄,希望遇到對混淆同樣不了解的人能有所幫助。
不經混淆的代碼,apk反編譯就會将代碼全部暴露出來,是以為了自己的勞動成果不被竊取,混淆代碼是一定要做的。
1.proguard-project.txt
建立項目,項目目錄下面的proguard-project.txt ,這個檔案很重要,用來存放混淆配置,如果不小心删掉,從其他地方拷貝或者自己建立都可以
2.為proguard-project.txt添加混淆申明
2.1 基本配置
-dontshrink
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-ignorewarnings#忽略警告 也可以用
-dontwarn
-allowaccessmodification
-dontskipnonpubliclibraryclassmembers
-keepattributes *Annotation*
-dontobfuscate #不混淆(混淆時,此項不能添加,我就在改錯的時候加了,還傻缺的以為錯誤都改好了,混淆搞定了)
2.2 把libs下面的jar包都進行申明(如果有.so檔案,無需處理)例如:
-libraryjars libs/android-support-v4.jar
-libraryjars libs/alipaysdk.jar
-libraryjars libs/alipaysecsdk.jar
-libraryjars libs/alipayutdid.jar
-libraryjars libs/androidvolley.jar
-libraryjars libs/baidumapapi_v3_4_0.jar
-libraryjars libs/easemobchat_2.1.6.jar
-libraryjars libs/gson-2.2.4.jar
-libraryjars libs/httpmime-4.1.1.jar
-libraryjars libs/jg_filter_sdk_1.1.jar
2.3 将不需要混淆的部分申明出來,因為這些類經過混淆會導緻程式編譯不通過,
(以下可以直接拷貝到你的配置檔案):
-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 com.android.vending.licensing.ILicensingService
以上都是API裡面的類,最好都要避免混淆
2.4 特殊混淆申明
2.3.1 百度地圖混淆申明
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-dontwarn com.baidu.**
2.3.2 信鴿消息推送混淆申明
-keep class com.tencent.android.tpush.** {* ;}
-keep class com.tencent.mid.** {* ;}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
2.3.3 環信客服混淆申明
-dont2.3.warn
-keep class org.xmlpull.** {*;}
-keep class com.baidu.** {*;}
-keep public class * extends com.umeng.**
-keep class com.umeng.** { *; }
-keep class com.squareup.picasso.* {*;}
-keep class com.easemob.* {*;}
-keep class com.easemob.chat.** {*;}
-keep class org.jivesoftware.** {*;}
-keep class org.apache.** {*;}
-keep class com.shouru.android.helpdesk.util.SmileUtils {*;}
2.3.4 gson 混淆
-keep class com.goole.gson.example.android.moel.**{*;}
同時,通過gson解析使用的bean類也能混淆,為了避免一個類一個類的申明,我直接将所有bean類存放的包進行keep,如下:
-keep class com.android.test.bean.**{*;}
2.3.5 QQ混淆
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}
2.3.6 volley 混淆
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }
3 以上混淆申明檔案配置完成,
最後隻需要在project.properties檔案中加上你的混淆檔案申明了,(現在建立項目已經填寫完,隻要打開注釋即可)如下:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
4.混淆編譯問題及注意
為了調試友善,可以把應用調成debug=true模式(應用釋出時,一定要關閉),檢視混淆報錯日志,根據報錯的地方,用keep進行申明。混淆過程中出現的note可以不處理,但warning最好全部處理。像我第一次混淆遇到了很多如下錯誤
[proguard] Warning: com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
[proguard] Warning: com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
[proguard] Warning: com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
[proguard] Warning: demo.Pinyin4jAppletDemo: can't find referenced class javax.swing.JTextField
[proguard] Warning: demo.Pinyin4jAppletDemo: can't find referenced class javax.swing.JTextField
報錯處是因為那些類不能混淆或者已經混效果,導緻can't find,解決如下
<pre name="code" class="java">-libraryjars libs/pinyin4j-2.5.0.jar
-dontwarn demo.**
-keep class demo.**{*;}
-dontwarn net.sourceforge.pinyin4j.**
-keep class net.sourceforge.pinyin4j.**{*;}
-keep class net.sourceforge.pinyin4j.format.**{*;}
-keep class net.sourceforge.pinyin4j.format.exception.**{*;}
-libraryjars libs/pinyin4j-2.5.0.jar
#畢加索使用
<pre name="code" class="java">-keep public class com.squareup.okhttp.OkUrlFactory
-keep public class com.squareup.okhttp.OkHttpClient
-dontwarn com.squareup.picasso.**
當然具體情況具體對待,但如果代碼本身沒有問題,如果混淆報錯,大都是報錯出為進行keep(dontwarn,不能混淆),以上就是混淆的全部工作,打簽名包測試既可以,如果有問題,檢視Log,有些類是不能混淆的,需要根據報錯的類或者包keep到progrard-project.txt中。
如果代碼本身沒有問題,混淆後程式運作報錯,百分百是混淆檔案問題,根據報錯的位置檢視即可,大多報錯都是不能混淆,注意一下第三方庫自己的混淆配置。在根據log檢視錯誤是,報錯可能是....a.b....包名你自己肯定不認識,根據混淆完成後,
bin/proguard/mapping.txt 檔案進行檢視,mapping.txt裡面描述了混淆完成後檔案的對應路徑名稱,友善查詢。
不混淆時keep和dowtwarn的使用:
如果你的類就在你的項目或包裡,但是被你混淆了,就keep
如果這個類不在你的包裡,但實際運作的時候會有就dowtwarn
好了,以上就是我自己的一些積累,如果有不足或者錯誤的地方,希望大家幫忙指出