Android 混淆
Posted Session__csdn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 混淆相关的知识,希望对你有一定的参考价值。
虽然做了几年开发,但混淆在前两个公司还真没有接触过,被领导一问,“没做过?”感觉耳朵都红了,⊙﹏⊙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最好全部处理。像我第一次混淆遇到了很多如下错误
[java] view plain copy报错处是因为那些类不能混淆或者已经混效果,导致can't find,解决如下
- [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
[java] view plain copy[java] view plain copy
- <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.***;
-dontwarn com.squareup.picasso.**
- -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
当然具体情况具体对待,但如果代码本身没有问题,如果混淆报错,大都是报错出为进行keep(dontwarn,不能混淆),以上就是混淆的全部工作,打签名包测试既可以,如果有问题,查看Log,有些类是不能混淆的,需要根据报错的类或者包keep到progrard-project.txt中。
如果代码本身没有问题,混淆后程序运行报错,百分百是混淆文件问题,根据报错的位置查看即可,大多报错都是不能混淆,注意一下第三方库自己的混淆配置。在根据log查看错误是,报错可能是....a.b....包名你自己肯定不认识,根据混淆完成后,
bin/proguard/mapping.txt 文件进行查看,mapping.txt里面描述了混淆完成后文件的对应路径名称,方便查询。
不混淆时keep和dowtwarn的使用:
如果你的类就在你的项目或包里,但是被你混淆了,就keep
如果这个类不在你的包里,但实际运行的时候会有就dowtwarn
好了,以上就是我自己的一些积累,如果有不足或者错误的地方,希望大家帮忙指出
以上是关于Android 混淆的主要内容,如果未能解决你的问题,请参考以下文章