Android代码混淆总结

来源:互联网 发布:深圳牛掰seo 编辑:程序博客网 时间:2024/06/16 11:01

        最近研究了一下代码的混淆,总结如下:

       1.build文件中minifyEnabled设置为true,然后开始配置proguard-rules.pro文件中的内容,分为三部分吧

       1)可以直接复制粘贴的,不需要做任何修改的固定内容

#压缩等级,一般选择中间级别5-optimizationpasses 5#包名不混合大小写-dontusemixedcaseclassnames#不去忽略非公共的库类-dontskipnonpubliclibraryclasses#优化  不优化输入的类文件-dontoptimize#预校验-dontpreverify#混淆时采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#保护注解-keepattributes *Annotation*#保持下面的类不被混淆(没有用到的可以删除掉,比如没有用到service则可以把service行删除)-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.preference.Preference-keep public class * extends android.support.v4.app.FragmentActivity-keep public class * extends android.support.** { *;}#如果引用了v4或者v7包-dontwarn android.support.*#忽略警告(开始应该注释掉,让他报错误解决,最后再打开,警告要尽量少)-ignorewarnings#####################记录生成的日志数据,gradle build时在本项目根目录输出#################混淆时是否记录日志-verbose#apk 包内所有class 的内部结构-dump class_files.txt#为混淆的类和成员-printseeds seeds.txt#列粗从 apk 中删除的代码-printusage unused.txt#混淆前后的映射-printmapping mapping.txt#####################记录生成的日志数据,gradle build时在本项目根目录输出结束#################本地的R类不要被混淆,不然就找不到相应的资源-keep class **.R$*{ public static final int *; }#保持内部类,异常类-keepattributes Exceptions, InnerClasses#保持泛型、注解、源代码之类的不被混淆-keepattributes Signature, Deprecated, SourceFile-keepattributes LineNumberTable, *Annotation*, EnclosingMethod#保持自定义控件不被混淆(没有就不需要)-keepclasseswithmembers class * extends android.app.Activity{    public void *(android.view.View);}-keepclasseswithmembers class * extends android.supprot.v4.app.Fragment{    public void *(android.view.View);}#保持 Parcelable 不被混淆(没有就不需要)-keep class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator *;}#保持 Serializable 不被混淆(没有就不需要)-keepnames class * implements java.io.Serializable-keepclassmembers class * {    public void *ButtonClicked(android.view.View);}
-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}


2)第三方的jar包,需要去相应的官网查询混淆规则,举几个例子如下

# gson工具不需要混淆-dontwarn com.google.gson**-keep class com.google.gson.**{*;}# volley-dontwarn com.android.volley.jar.**-keep class com.android.volley.**{*;}#友盟混淆配置start-keepclassmembers class * {   public <init> (org.json.JSONObject);}-keep public class com.hawk.android.hicamera.R$*{*;}#友盟混淆配置end#极光推送混淆配置-dontoptimize-dontpreverify-dontwarn cn.jpush.**-keep class cn.jpush.** { *; }

    3)混淆过程中肯定会有警告,有问题,根据提示解决问题,我遇到的问题就是有的jar包不能混淆,而我给混淆了,所以我加了如下代码:

-dontwarn com.tencent.**-keep class com.tencent.**{*;}# apache-dontwarn org.apache.http.**-keep class org.apache.http.** { *;}

2.代码混淆成功了还有一个地方要配置一下,很有用的:

buildTypes {        release {            // 如果没有提供混淆规则文件,则设置默认的混淆规则文件(SDK/tools/proguard/proguard-android.txt)            pseudoLocalesEnabled true            // 不显示Log            buildConfigField "boolean", "LOG_DEBUG", "false"            //混淆            minifyEnabled true            //Zipalign优化            zipAlignEnabled true            // 移除无用的resource文件            shrinkResources true            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }



0 0