我项目中添加的混淆
一、混淆
# 指定代码的压缩级别 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;
}
}