android 代码 混淆

       代码混淆对于每个上线的应用来说,是安全方面最基本的操作。也是每个Android 开发者必备知识点,但是对于初学者来说这方面的内容很容易被忽略。毕竟不添加混淆 APP 也照样可以跑起来。当然这样的应用是很不安全的,利用 反编译工具 我们可以轻松 看到 工程的源码。很多信息就会直白的暴露别人面前。

  

上图是 我利用反编译工具 jadx-gui 查看的 我的一个 未经过 代码混淆打包 的apk  的文件。 是不是看完心慌慌的,自己信心苦苦写的代码 就这样完全的展示给别人看了。

如何 反编译 得到 apk 中的源码,可以查看这篇文章

https://blog.csdn.net/u010324235/article/details/83446655

接下来我们要介绍代码 混淆

我们先看一下经过代码混淆后的apk 反编译后的代码结构

  我们可以看到有些包名和类名都变成了abcd了 ,源码中 也有很多 abcd  这样一来 阅读起来就很难了,即使拿到这样的源码也很难 看懂代码中的内容,这就是代码混淆的作用。

在开启代码混淆之前首先要思考一下,哪些代码是不可以被混淆的,如上图中,我们看到百度地图中的内容就没有被混淆,都是原原本本的类名和方法名。

首先第一个就是在AndroidManifest.xml中静态注册的四大组件 ,当然也包括自定义的application。因为这些静态注册的组件如果被混淆了肯定就找不到了。

第二个 实现了 Serializable 的类不能被混淆,否则反序列化的时候要出错。

第三个 support v4 和v7 还有 design 里的内容不能被混淆,这是系统的内容。

第四个 自定义的view 不能被混淆, 不然我们在layout中使用view 的时候回找不到

第五个 泛型不能混淆

第六个 实体类不能被混淆,gson 会报错

滴七个 引入的module jar lib 不能被混淆 一般使用第三方 jar 包网站中会说明 如何进行代码混淆 

开启代码混淆 我们在 

build.gradle 文件中 设置minfyEnabled 为 true

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

然后在  proguard-rules.pro 文件中keep 住我们 不需要混淆的地方

首先是每个apk都需要用到的 

#1.基本指令区
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-ignorewarning
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable

#2.默认保留区
-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.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}

-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
-keep class **.R$* {
 *;
}

-keepclassmembers class * {
    void *(**On*Event);
}

#3.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);
}

然后是 第三方的 jar 官方文档中有介绍的我们直接加载里面就好

# 百度地图
-keep class com.baidu.** {*;}
-keep class mapsdkvi.com.** {*;}
-dontwarn com.baidu.**

#极光推送
-dontoptimize
-dontpreverify

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }

-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }

之后是 v4 v7 design

# support-v4
-dontwarn android.support.v4.**
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v4.** { *; }


# support-v7
-dontwarn android.support.v7.**
-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }

# support design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

还有项目中可能用到的 框架

#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
#arouter
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}

#Rxjava RxAndroid
-dontwarn rx.*
-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;
}

# okhttp
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.{*;}
#retrofit
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-dontwarn okio.**

#gson
-keep class com.google.gson.** {*;}
-keep class com.google.**{*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }

还有就是我们需要把我们项目中国的实体类keep住 我们可以吧 javabean 都放在一个文件夹下面,然后用下面的 语句 就可以使得整个文件夹下面的实体类都不被混淆

#实体类
-keep class 所在文件夹路径.** { *; }

还有就是一些引用的第三方jar并没有文档告诉我们怎么混淆。我们可以直接使用包名

#jar 包
-keep class 包名.** { *; }

差不多就是上面这些 需要注意的地方千万别漏掉 。欢迎补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值