Android 混淆详解

混淆是什么
        混淆并不是使代码无法进行反编译,只是将代码中的类、方法等重命名,把它们改成a.b.c.d等毫无意义的名词,就算得到源码也不知道方法有任何意思,但是对于计算机而言,它只会按照原先的执行顺序执行代码,而且Android的混淆过程中,会自动识别程序中的引用,去除代码中未被引用的方法以及未使用到的资源,换句话说,它也可以减少我们apk的大小。

怎样混淆
        现在大部分的开发都使用的Android studio,在这里只讲解Android Studio的混淆的方法。使项目支持混淆只需要android->buildType->release的minifyEnabled设置为true即可(自动生成的是false),如以下:

 buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

这样的话就使这个项目支持混淆了,但是混淆只会在Generate Signed apk的时候进行混淆,直接build apk是不会进行混淆的,并且在生成apk时选择V1(Jar Signature),本人测试选择V2的时候,安装会提示安装包已损坏。
混淆配置
        以上介绍了如何使项目支持混淆,但是在实际的项目开发中有些代码是不需要混淆,在这里就需要对这些代码进行配置了,常见的有第三方jar包、第三方库、与JS的交互类等。
        下面举几个简单的例子,首先是对第三方jar的混淆,在现在的版本系统默认是会把jar给进行libraryjars的,如果一直提示错误,最好是进行libraryjars。下面看具体的代码。这里以fastjson举例,在fastjson进行数据解析时,是需要与数据对上字段名的,所以实际的项目中你的model不要混淆或者说使用注解让字段与数据绑定。

#fastjson的混淆
-libraryjars /libs/fastjson-1.2.7.jar #如果提示重复应用的话,删除这句话即可
-dontwarn com.alibaba.fastjson.**  #不检查com.alibaba.fastjson的类
-keep class com.alibaba.fastjson.** { *; } #对com.alibaba.fastjson下的类不进行混淆

#okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}

#okio
-dontwarn okio.**
-keep class okio.**{*;}

#litepal
-keep class org.litepal.** {
    *;
}
-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    native <methods>;
}
-keepclasseswithmembers class * {   # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆
    public void *(android.view.View);
}
-keepclassmembers enum * {     # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
}

-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

#高德jar混淆
-dontwarn com.amap.api.**
-dontwarn com.amap.apis.**
-dontwarn com.a.a.**
-dontwarn com.autonavi.**

-keep class com.amap.api.**  {*;}
-keep class com.amap.apis.**  {*;}
-keep class com.autonavi.**  {*;}
-keep class com.a.a.**  {*;}

#下方是与JS进行交互的类,交互的model以及交互实体都需要不混淆
-keepclassmembers class fqcn.of.javascript.listener.for.webview {
   public *;
}
-keepclassmembers class com.wshuttle.trailerplatform.controller.activity.order.OrderAct$OrderJsHelper {
  public *;
}
-keepclassmembers class com.wshuttle.trailerplatform.controller.activity.dispatch.RescueDispatchAct$RescueDispatchJsHelper {
  public *;
}
-keepclassmembers class com.wshuttle.trailerplatform.model.bean.BaseJsHelperInfo {
  public *;
}

-keepattributes *Annotation*
-keepattributes *JavascriptInterface*

-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.webView, jav.lang.String);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值