Android 混淆

来源:互联网 发布:网络歌手安小沫 编辑:程序博客网 时间:2024/06/05 05:14

虽然做了几年开发,但混淆在前两个公司还真没有接触过,被领导一问,“没做过?”感觉耳朵都红了,⊙﹏⊙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
在CODE上查看代码片派生到我的代码片
  1. [proguard] Warning: com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient  
  2. [proguard] Warning: com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient  
  3. [proguard] Warning: com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient  
  4. [proguard] Warning: demo.Pinyin4jAppletDemo: can't find referenced class javax.swing.JTextField  
  5. [proguard] Warning: demo.Pinyin4jAppletDemo: can't find referenced class javax.swing.JTextField  
报错处是因为那些类不能混淆或者已经混效果,导致can't find,解决如下
[java] view plain copy
在CODE上查看代码片派生到我的代码片
  1. <pre name="code" class="java">-libraryjars libs/pinyin4j-2.5.0.jar  
  2.   
  3. -dontwarn demo.**  
  4. -keep class demo.**{*;}  
  5.    
  6. -dontwarn net.sourceforge.pinyin4j.**    
  7. -keep class net.sourceforge.pinyin4j.**{*;}  
  8. -keep class net.sourceforge.pinyin4j.format.**{*;}  
  9. -keep class net.sourceforge.pinyin4j.format.exception.**{*;}  
[java] view plain copy
在CODE上查看代码片派生到我的代码片
  1. -libraryjars libs/pinyin4j-2.5.0.jar  
  2. #毕加索使用  
  3. <pre name="code" class="java">-keep public class com.squareup.okhttp.OkUrlFactory  
  4. -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


好了,以上就是我自己的一些积累,如果有不足或者错误的地方,希望大家帮忙指出

0 0
原创粉丝点击