Android混淆和加固详解

我项目中添加的混淆

一、混淆

  # 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数,在Android里面默认是5,这条指令也只有在可以优化时起作用。)
  -optimizationpasses 5
  # 混淆时不会产生形形色色的类名(混淆时不使用大小写混合类名)
  -dontusemixedcaseclassnames
  # 指定不去忽略非公共的库类(不跳过library中的非public的类)
  -dontskipnonpubliclibraryclasses
  # 指定不去忽略包可见的库类的成员
  -dontskipnonpubliclibraryclassmembers
  #不进行优化,建议使用此选项,
  -dontoptimize
   # 不进行预校验,Android不需要,可加快混淆速度。
   -dontpreverify
   # 屏蔽警告
   -ignorewarnings
   # 指定混淆是采用的算法,后面的参数是一个过滤器
   # 这个过滤器是谷歌推荐的算法,一般不做更改
   -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
   # 保护代码中的Annotation不被混淆
   -keepattributes *Annotation*
   # 避免混淆泛型, 这在JSON实体映射时非常重要
   -keepattributes Signature
   # 抛出异常时保留代码行号
   -keepattributes SourceFile,LineNumberTable
   #优化时允许访问并修改有修饰符的类和类的成员,这可以提高优化步骤的结果。
   # 比如,当内联一个公共的getter方法时,这也可能需要外地公共访问。
   # 虽然java二进制规范不需要这个,要不然有的虚拟机处理这些代码会有问题。当有优化和使用-repackageclasses时才适用。
   #指示语:不能用这个指令处理库中的代码,因为有的类和类成员没有设计成public ,而在api中可能变成public
   -allowaccessmodification
   #当有优化和使用-repackageclasses时才适用。 #
   -repackageclasses com.test
   # 混淆时记录日志(打印混淆的详细信息)
   # 这句话能够使我们的项目混淆后产生映射文件
   # 包含有类名->混淆后类名的映射关系
   -verbose

# ----------------------------- 默认保留 -----------------------------
# 保持哪些类不被混淆
#继承activity,application,service,broadcastReceiver,contentprovider....不进行混淆

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.view.View
-keep public class * extends android.app.Service
-keep class android.support.** {*;}## 保留support下的所有类及其内部类
#----------------------------------------------------
# 保留support下的所有类及其内部类
-keep class android.support.** {*;}
#----------------------------------------------------
# 保留继承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
#----------------------------------------------------

#这个主要是在layout 中写的onclick方法android:onclick="onClick",不进行混淆
#表示不混淆Activity中参数是View的方法,因为有这样一种用法,在XML中配置android:onClick=”buttonClick”属性,
 #当用户点击该按钮时就会调用Activity中的buttonClick(View view)方法,如果这个方法被混淆的话就找不到了

 -keepclassmembers class * extends android.app.Activity{
     public void *(android.view.View);
 }
 #----------------------------------------------------

 # 保留枚举类不被混淆
 -keepclassmembers enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
#----------------------------------------------------

 #表示不混淆任何一个View中的setXxx()和getXxx()方法,
 #因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。

 -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);
       }

#----------------------------------------------------

 # 这指定了继承Serizalizable的类的如下成员不被移除混淆
 -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();
    }
#----------------------------------------------------

   # 保留R下面的资源
   -keep class **.R$* {
    *;
   }
   #--------------------------6.0及以上--------------------------
   #butterknife
   -keep class butterknife.** { *; }
   -dontwarn butterknife.internal.**
   -keep class **$$ViewInjector{ *; }
   -keepclasseswithmembernames class * {
   @butterknife.* <fields>; }
   -keepclasseswithmembernames class * {
   @butterknife.* <methods>; }


#--------------------------------------------------------==
# support-design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
#----------------------------------------------------
#不混淆资源类下static的
-keepclassmembers class **.R$* {
    public static <fields>;
}
#----------------------------------------------------

#工具类不混淆
#-keep com.zhongyou.jiangxiplay.utils.** { *; }
#-keep com.zhongyou.jiangxiplay.util.** { *; }
#----------------------------------------------------

# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
-keepclassmembers class * {
    void *(**On*Event);
    void *(**On*Listener);
}
#----------------------------------------------------

 # 保留我们自定义控件(继承自View)不被混淆
 -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);
  }

#-------------------------阿里oss上传图片--------------------------------------
  -keep class com.alibaba.sdk.android.oss.** { *; }
  -dontwarn okio.**
  -dontwarn org.apache.commons.codec.binary.**

#---------------------------------实体类---------------------------
#--------(实体Model不能混淆,否则找不到对应的属性获取不到值)-----
 -dontwarn com.zhongyou.jiangxiplay.entity.**
 #对含有反射类的处理
  -keep class com.zhongyou.jiangxiplay.entity.** { *; }

  #--------(实体Model不能混淆,否则找不到对应的属性获取不到值)-----
   -dontwarn com.aliyun.vodplayerview.entity.**
   #对含有反射类的处理
    -keep class com.aliyun.vodplayerview.entity.** { *; }
#----------------------------------------------------
# Fresco
-keep class com.facebook.** {*;}
-keep interface com.facebook.** {*;}
-keep enum com.facebook.** {*;}
#----------------------------------------------------
# Glide specific rules #
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
}

#----------------------------------------------------
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
# ----------------------------- 第三方库、框架、SDK -----------------------------
-dontwarn com.google.gson.**
-keep class com.google.gson.**{*;}

#====okhttputils====
#-libraryjars libs/okhttputils.jar
-dontwarn com.zhy.http.**
-keep class com.zhy.http.**{*;}
-keep interface com.zhy.http.**{*;}

# OkHttp3
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;}
-dontwarn okio.**
# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
#-keepattributes Signature-keepattributes Exceptions
# 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;
}

# -----------------------------阿里云视频播放器-----------------------------
 -keep class com.alivc.player.**{*;}
    -keep class com.aliyun.clientinforeport.**{*;}
    -keep class com.aliyun.vodplayer.**{*;}
    -dontwarn com.alivc.player.**

#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

二、对抗apk重打包

1、获取apk的签名信息

    public int getSignature(String packageName){
        PackageManager pm=this.getPackageManager();
        PackageInfo packageInfo=null;
        int sig=0;
        try {
            packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
            android.content.pm.Signature[] signatures = packageInfo.signatures;
            sig=signatures[0].hashCode();
        } catch (PackageManager.NameNotFoundException e) {
            sig=0;
            e.printStackTrace();
        }
        return  sig;
    }

2、验证签名,签名不一致退出程序

private static final  String TAG="signature";
if (getSignature("com.zhongyou.jiangxiplay")!=3417684655){
    android.os.Process.killProcess(android.os.Process.myPid());
}

三、判断是否是在模拟器上运行,如果在模拟器上运行退出应用

    private void isPhone() {

        if (IsMoNiQi.notHasBlueTooth()||IsMoNiQi.notHasLightSensorManager(this)||
                IsMoNiQi.isFeatures()||IsMoNiQi.checkIsNotRealPhone()){
//            ToastUtils.showToast(this,"检查到您的设备违规,将限制您的所有功能使用!");
            android.os.Process.killProcess(android.os.Process.myPid());
            return;
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_26554909

有您的支持,我们将做的更好

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

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

打赏作者

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

抵扣说明:

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

余额充值