天天看點

Android 混淆  1.proguard-project.txt   2.為proguard-project.txt添加混淆申明3 以上混淆申明檔案配置完成,4.混淆編譯問題及注意

雖然做了幾年開發,但混淆在前兩個公司還真沒有接觸過,被上司一問,“沒做過?”感覺耳朵都紅了,⊙﹏⊙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

好了,以上就是我自己的一些積累,如果有不足或者錯誤的地方,希望大家幫忙指出