Android(安卓)混淆 以及 java代码方式实现混淆配置
16lz
2021-01-26
第一步 : 在build.gradle中做如下配置
注 : 可以分别配置debug与release的混淆配置
android { buildTypes { debug { minifyEnabled true //混淆 zipAlignEnabled true //zipalign优化 shrinkResources true //移除无用的resource文件 //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled true //混淆 zipAlignEnabled true //zipalign优化 shrinkResources true //移除无用的resource文件 //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}
第二步 : 配置proguard-rules.pro文件
以下是根据本人实际项目中做出的配置,可以参考
# Add project specific ProGuard rules here.# You can control the set of applied configuration files using the# proguardFiles setting in build.gradle.## For more details, see# http://developer.android.com/guide/developing/tools/proguard.html# If your project uses WebView with JS, uncomment the following# and specify the fully qualified class name to the JavaScript interface# class:#-keepclassmembers class fqcn.of.javascript.interface.for.webview {# public *;#}# Uncomment this to preserve the line number information for# debugging stack traces.#-keepattributes SourceFile,LineNumberTable# If you keep the line number information, uncomment this to# hide the original source file name.#-renamesourcefileattribute SourceFile# * 混淆日志生成目录:app.build.outputs.mapping下,打包时请拷贝此日志,用于错误日志还原分析.#--------------------------------------------- 公共配置 ----------------------------------------#-optimizationpasses 5 # 代码混淆压缩比-dontusemixedcaseclassnames # 混合时不使用大小写混合,混合后的类名为小写-dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库类。-dontskipnonpubliclibraryclassmembers # 指定不去忽略非公共库的类成员-dontpreverify # 混淆时不做预校验-verbose # 使我们的项目混淆后产生映射文件 : 包含有类名->混淆后类名的映射关系-ignorewarnings # 忽略所有警告-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*# 指定混淆是采用的算法,后面的参数是一个过滤器(谷歌推荐的算法,一般不做更改)-keepattributes *Annotation*,InnerClasses #保留注解不混淆-keepattributes Signature # 避免混淆泛型-keepattributes SourceFile,LineNumberTable# 抛出异常时保留代码行号#--------------------------------------------- 公共配置 End ----------------------------------------##--------------------------------------------- Java ----------------------------------------#-keepclasseswithmembernames class * { # 保留本地native方法不被混淆 native ;}-keepclassmembers enum * {# 保留枚举类不被混淆 public static **[] values(); public static ** valueOf(java.lang.String);}-keepclassmembers class * {# 保留JsonObject不被混淆 public (org.json.JSONObject);}-keep class * implements android.os.Parcelable {# 保留Parcelable序列化类不被混淆 public static final android.os.Parcelable$Creator *;}-keepnames class * implements java.io.Serializable-keepclassmembers class * implements java.io.Serializable {# 保留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();}#--------------------------------------------- Java End ----------------------------------------##--------------------------------------------- Android 系统 ----------------------------------------#-keep public class * extends android.view.View-keep public class * extends android.app.Fragment-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 com.android.vending.licensing.ILicensingService-keep class **.R$* { *; }# 保留R下面的资源-keep class android.support.** { *; }# 保留support下的所有类及其内部类-keep public class * extends android.support.v4.**-keep public class * extends android.support.v7.**-keep public class * extends android.support.annotation.**-keepclassmembers class * extends android.app.Activity{#保留在Activity中的方法参数是view的方法(这样以来我们在layout中写的onClick就不会被影响) public void *(android.view.View);}-keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int);}-keepclassmembers class * {# 对于带有回调函数的**on*Event、**On*Listener 不被混淆 void *(**On*Event); void *(**On*Listener);}#--------------------------------------------- Android 系统 End ----------------------------------------##--------------------------------------------- 继承类混淆配置 ----------------------------------------#-keep interface com.acmenxd.frame.utils.proguard.** { *; }-keep class * implements com.acmenxd.frame.utils.proguard.IKeepClass-keepnames class * implements com.acmenxd.frame.utils.proguard.IKeepClassName-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepFieldName { ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicFieldName { public ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepMethodName { ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicMethodName { public ;}#--------------------------------------------- 继承类混淆配置 End ----------------------------------------##--------------------------------------------- 依赖库混淆配置 ----------------------------------------##libs#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;}#okhttp3-dontwarn okio.**-dontwarn okhttp3.**-dontwarn com.squareup.okhttp3.**#retrofit2-dontwarn retrofit2.**-keep class retrofit2.** { *; }-keepattributes Signature-keepattributes Exceptions#FrescoView-dontwarn okio.**-dontwarn okhttp3.**-dontwarn com.squareup.okhttp3.**-dontwarn javax.annotation.**-dontwarn com.android.volley.toolbox.**-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip-keep @com.facebook.common.internal.DoNotStrip class *-keepclassmembers class * { @com.facebook.common.internal.DoNotStrip *;}-keepclassmembers class * { native ;}#Glide-keep public class * implements com.bumptech.glide.module.GlideModule-keep class com.bumptech.glide.** { *;}#greenDAO 3.2.0#-keep class * extends org.greenrobot.greendao.AbstractDao{ *; }-keep class org.greenrobot.greendao.**{*;}-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { public static java.lang.String TABLENAME;}-keep class **$Properties#eventbus 3.0.0-keepattributes *Annotation*-keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe ;}-keep enum org.greenrobot.eventbus.ThreadMode { *; }-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { (java.lang.Throwable);}#--------------------------------------------- 项目混淆 处理 ----------------------------------------#-keep class com.acmenxd.core.model.**{ *; } # 实体类-keep class com.acmenxd.mvp.model.**{ *; } # 实体类#--------------------------------------------- 反射类 处理 ----------------------------------------##--------------------------------------------- WebView 处理 ----------------------------------------##--------------------------------------------- js交互 处理 ----------------------------------------#
解释部分 -> 继承混淆类配置
其作用是避免 在实际项目中N多个类或包 需要做混淆配置, 导致proguard-rules.pro文件过于混乱
其实现方式是 :
一. 在项目中定义接口,如下 :
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持整个类都不混淆 */public interface IKeepClass extends IKeepFieldName, IKeepMethodName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名不混淆 */public interface IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和成员变量都不混淆 */public interface IKeepFieldName extends IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和方法名都不混淆 */public interface IKeepMethodName extends IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和public成员变量都不混淆 */public interface IKeepPublicFieldName extends IKeepClassName {}
/** * @author AcmenXD * @version v1.0 * @github https://github.com/AcmenXD * @date 2017/2/21 18:00 * @detail 实现此接口的类 -> 将保持类名和public方法名都不混淆 */public interface IKeepPublicMethodName extends IKeepClassName {}
二. 在proguard-rules.pro文件添加如下内容
#--------------------------------------------- 继承类混淆配置 ----------------------------------------#-keep interface com.acmenxd.frame.utils.proguard.** { *; }-keep class * implements com.acmenxd.frame.utils.proguard.IKeepClass-keepnames class * implements com.acmenxd.frame.utils.proguard.IKeepClassName-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepFieldName { ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicFieldName { public ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepMethodName { ;}-keepclassmembers class * implements com.acmenxd.frame.utils.proguard.IKeepPublicMethodName { public ;}#--------------------------------------------- 继承类混淆配置 End ----------------------------------------#
三. 使用
/** 实现IKeepClass类,所以TestA整个类都不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepClass{}
/** 实现IKeepClassName类,所以TestA类名不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepClassName{}
/** 实现IKeepFieldName类,所以TestA类名和成员变量都不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepFieldName{}
/** 实现IKeepMethodName类,所以TestA类名和方法名都不混淆,并且无需再proguard-rules.pro配置 */public class TestA implements IKeepMethodName{}
End
更多相关文章
- 1. NDK Android(安卓)jni开发 2种so库编译 cmake(相机图片美化)
- Android积累之《Android(安卓)strings.xml文件定义字符串中的标
- Android应用开发相关下载资源(2014/12/14更新) 【转】
- Android(安卓)NDK r8b 和 FFmpeg 0.11.2 移植
- android去权限反编译,签名,zipalign优化
- android使用ant自动打包(更改java文件中的属性值,批量自动生成)
- Android(安卓)将Activity设为Dialog样式,并铺满全屏
- uevent拔插事件分析--基于imx8
- fragment和radiobutton做出类tabhost效果