虽然做了几年开发,但混淆在前两个公司还真没有接触过,被领导一问,“没做过?”感觉耳朵都红了,⊙﹏⊙b汗,赶紧补习了下,再此做个记录,希望遇到对混淆同样不了解的人能有所帮助。
不经混淆的代码,apk反编译就会将代码全部暴露出来,所以为了自己的劳动成果不被窃取,混淆代码是一定要做的。
新建项目,项目目录下面的proguard-project.txt ,这个文件很重要,用来存放混淆配置,如果不小心删掉,从其他地方拷贝或者自己新建都可以
-keepattributes *Annotation*
-dontobfuscate #不混淆(混淆时,此项不能添加,我就在改错的时候加了,还傻缺的以为错误都改好了,混淆搞定了)
-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
(以下可以直接拷贝到你的配置文件):
-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里面的类,最好都要避免混淆
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-dontwarn com.baidu.**
-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 {*;}
-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 {*;}
-keep class com.goole.gson.example.android.moel.**{*;}
同时,通过gson解析使用的bean类也能混淆,为了避免一个类一个类的申明,我直接将所有bean类存放的包进行keep,如下:
-keep class com.android.test.bean.**{*;}
-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$* {*;}
-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$* { *; }
最后只需要在project.properties文件中加上你的混淆文件申明了,(现在新建项目已经填写完,只要打开注释即可)如下:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
为了调试方便,可以把应用调成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
好了,以上就是我自己的一些积累,如果有不足或者错误的地方,希望大家帮忙指出