Android代码混淆与反编译

1.混淆的目的

用于保护APP不被破解和逆向分析。

2.混淆的意义

proguard通过移除没有用到的代码以及通过特定规则重命名类、变量、方法来压缩、优化、混淆你的代码。这样做可以让你的apk更小,更难被逆向分析。由于可以提高被逆向分析的难度,对相关功能安全敏感的应用使用它是十分必要的。混淆本质上是不能阻止反编译的,只能增加反编译以后阅读理解的难度罢了。

3.混淆在代码优化方面

1.删除冗余代码,记录代码和元数据,未使用的资源和本机库
2.Dex文件的自动分割超过Dex格式强加的大小限制
3.资源和代码优化

4.在build.grandle添加

buildTypes {
    release {
        signingConfig signingConfigs.release
        shrinkResources true // 移出无用的res文件
        minifyEnabled true // 是否需要使用下面的混淆文件进行代码混淆
        zipAlignEnabled true // Zipalign优化
        proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
    }
}

注意:工程中出现多个module时,只需要修改app底下build.gradle中的minifyEnabled true即可。

5.在proguard-rules.pro中加入混淆规则

# ============================================= 基础规则 =============================================
# 指定代码的压缩级别
-optimizationpasses 5
# 混淆后类名都为小写
 -dontusemixedcaseclassnames
# 指定不去忽略非公共的库的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers
# 不做预校验的操作
-dontpreverify
# 混淆时是否记录日志
-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# 不混淆Annotation
-keepattributes *Annotation*,InnerClasses
# 不混淆泛型
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
# 列出没有被混淆的类
-printseeds seeds.txt
# 列出从APK中移除的代码
-printusage unused.txt
# 混淆前后命名的变化
-printmapping mapping.text
# 这些资源为api资源,保持不被混淆
-dontwarn android.support.**
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
-keep public class * extends android.app.Application
-keep public class * extends android.view.View
-keep public class * extends android.app.Service
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-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.app.backup.BackupAgentHelper
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {
    *;
}
-keep class android.support.v4.** {
    <fields>;
    <methods>;
}
-keep interface android.support.v4.app.** {
    <fields>;
    <methods>;
}
-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclassmembers public class * extends android.view.View {
    void set*(***);
    *** get*();
}
-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}

-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
# R文件 
-keep class **.R$* {
    *;
}
#  WebView
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
    public *;
}
-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);
}
# ============================================= 自定义混淆 =============================================
# ......

6.jar混淆

默认已经将lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加,否则会出现“java.io.IOException: The same input jar is specified twice” 错误。

7.常见的第三方库混淆代码

友盟
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep class com.android.dingtalk.share.ddsharemodule.** {
    *;
}
-keep public class com.umeng.socialize.* {
    *;
}
-keep class com.facebook.**
-keep class com.facebook.** {
    *;
}
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {
    *;
}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.umeng.weixin.handler.**
-keep class com.umeng.weixin.handler.*
-keep class com.umeng.qq.handler.**
-keep class com.umeng.qq.handler.*
-keep class UMMoreHandler{
    *;
}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {
    *;
}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {
    *;
}
-keep class im.yixin.sdk.api.YXMessage {
    *;
}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{
    *;
}
-keep class com.tencent.mm.sdk.** {
    *;
}
-keep class com.tencent.mm.opensdk.** {
    *;
}
-dontwarn twitter4j.**
-keep class twitter4j.** {
    *;
}
-keep class com.tencent.** {
    *;
}
-dontwarn com.tencent.**
-keep public class com.umeng.com.umeng.soexample.R$*{
    public static final int *;
}
-keep public class com.linkedin.android.mobilesdk.R$*{
    public static final int *;
}
-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.sina.** {
    *;
}
-dontwarn com.sina.**
-keep class  com.alipay.share.sdk.** {
    *;
}
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}
-keep class com.linkedin.** {
    *;
}
极光推送
-dontwarn cn.jpush.**
-keep class cn.jpush.** {
    *;
}
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver {
    *;
}
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** {
    *;
}
OkHttp
-dontwarn okio.**
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.** {
    *;
}
-dontwarn javax.annotation.**
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** {
    *;
}
RxJava,RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
Gson
-dontwarn com.google.**
-keep class com.google.gson.** {
    *;
}
-keep class com.google.gson.stream.** {
    *;
}
-keep class com.google.protobuf.** {
    *;
}
Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 
  **[] $VALUES;
  public *;
}
# Glide自定义(ImageLoaderModule)缓存时添加如下混淆
-keepnames class com.common.imageloader.ImageLoaderModule
Glide v4.0
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
# Glide自定义(ImageLoaderModule)缓存时添加如下混淆
-keepnames class com.common.imageloader.ImageLoaderModule

8.通过反编译检测混淆是否成功

注:反编译是不道德的行为,可根据需求反编译自己的工程即可。切勿编译他人工程。
反编译有多种方式,这里使用dex2jar进行反编译。

  • 下载反编译工具
点击下载dex2jar
点击下载jd-gui-windows


  • 解压后将你的apk后缀改为zip格式。
    如:sample-app.apk改为sample-app.zip
  • 将sample-app.zip进行解压。得到classes.dex文件,将classes.dex复制到与dex2jar解压后同目录下。
    classes.dex
  • 调用Dos命令,输入如下命令进行转换,(AndroidTools为我自己常用工具目录下,可根据自己的目录地址调用)

Dex2jar是将Android的.dex文件转换成Java的.class格式的文件,这仅是将一种二进制格式转换成另外一种二进制格式,并不是转换Java源代码。

    dex2jar.bat classes.dex
  • 命令执行成功后会生成一个对应的classes_dex2jar.jar文件,用jd-gui-windows打开classes_dex2jar.jar文件便可看到包名和类型都变成了小写abcd…..等就代表着要混淆的文件已经混淆成功。
    混淆成功示例
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒙同學

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值