赞
踩
开启混淆后Android会用自带的混淆进行代码混淆,如在安装Android SDK的目录下的proguard-android.txt或proguard-android-optimize.txt文件为默认混淆文件。对于自己定义的混淆需要在proguard-rules.pro文件中进行配置:
命令 | 作用 |
---|---|
-keep | 防止该类所有内容被移除或重命名 |
-keepnames | 防止类和成员被重命名 |
-keepclassmembers | 防止成员被移除或者被重命名 |
-keepclasseswithmembers | 防止拥有该成员的类和成员被移除或者被重命名 |
-keepclasseswithmembernames | 防止拥有该成员的类和成员被重命名 |
类:需要使用完全限定名;
*:通配符,任意字符串,不包含包名分隔符(.);
**:通配符,任意字符串,包含包名分隔符(.);
extends:继承某类的类;
implement:实现某接口的类;
$:内部类;
<init>:所有构造方法;
<fields>:所有成员变量;
<methods>:所有方法;
…:任意参数;
修饰符:public private protected
含义 | 指令语句 |
---|---|
不混淆某个类 | -keep public class packageName.className{ *; } |
不混淆某个包的所有类 | -keep class packageName.**{ *; } |
不混淆某个类的子类 | -keep public class * extends packageName.className{ *; } |
不混淆某个接口的子类 | -keep public class * implements packageName.className{ *; } |
不混淆某个类的构造方法 | -keepclassmembers class packageName.className{ public <init style="box-sizing: border-box;">(); }</init> |
不混淆某个类的某个方法 | -keepclassmembers class packageName.className{ public void methodName(…); } |
不混淆某个类的内部类 | -keep class packageName.className$*{ *; } |
将报错的或者自己不需要的删除即可,然后在最后添加自己不需要混淆的代码:
- #---------这里提供一份这个lib中最好不要混淆的地方,前边的配置都差不多,主要是第三方包以及其他不需要混淆的代码----
- #---------------------------------基本指令以及一些固定不混淆的代码--开始--------------------------------
-
- #<基本指令>
- -optimizationpasses 5
- -dontskipnonpubliclibraryclassmembers
- -optimizations !code/simplification/cast,!field/*,!class/merging/*
- -keepattributes *Annotation*,InnerClasses
- -keepattributes Signature
- -keepattributes SourceFile,LineNumberTable
- #忽略警告
- -ignorewarning
- #记录生成的日志数据,gradle build时在本项目根目录输出apk 包内所有 class 的内部结构
- -dump class_files.txt
- #未混淆的类和成员
- -printseeds seeds.txt
- #列出从 apk 中删除的代码
- -printusage unused.txt
- #混淆前后的映射
- -printmapping mapping.txt
- #</基本指令>
-
- #<基础>
- -keep public class * extends android.app.Activity
- -keep public class * extends android.app.Application
- -keep public class * extends android.support.multidex.MultiDexApplication
- -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.** {*;}
- #</基础>
-
- #<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);
- }
- -keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet);
- public <init>(android.content.Context, android.util.AttributeSet, int);
- }
- -keepclassmembers class * {
- public void *(android.view.View);
- }
- #</view相关>
-
- #<Serializable、Parcelable>
- -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 public class * implements java.io.Serializable {*;}
-
- -keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
- }
- #</Serializable、Parcelable>
-
- #<R文件>
- -keep class **.R$* {
- *;
- }
- #</R文件>
-
- #<enum>
- -keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
- }
- #</enum>
-
- #<natvie>
- -keepclasseswithmembernames class * {
- native <methods>;
- }
- #</natvie>
-
- #---------------------------------基本指令以及一些固定不混淆的代码--结束-----------
-
- #---------------------------------第三方包--开始-------------------------------
-
- #<okhttp3.x>
- -dontwarn com.squareup.okhttp3.**
- -keep class com.squareup.okhttp3.** { *;}
- -dontwarn okio.**
- #</okhttp3.x>
-
- #<retrofit2.x>
- -dontnote retrofit2.Platform
- -dontwarn retrofit2.Platform$Java8
- -keepattributes Signature
- -keepattributes Exceptions
- -dontwarn okio.**
- #</retrofit2.x>
-
- #</okhttp3.x>
-
- #<ButterKnife 7.0 以上>
- -keep class butterknife.** { *; }
- -dontwarn butterknife.internal.**
- -keep class **$$ViewBinder { *; }
- -keepclasseswithmembernames class * {
- @butterknife.* <fields>;
- }
- -keepclasseswithmembernames class * {
- @butterknife.* <methods>;
- }
- #</ButterKnife 7.0 以上>
-
- #<eventbus 3.0>
- -keepattributes *Annotation*
- -keepclassmembers class ** {
- @org.greenrobot.eventbus.Subscribe <methods>;
- }
- -keep enum org.greenrobot.eventbus.ThreadMode { *; }
- -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
- <init>(java.lang.Throwable);
- }
- #</eventbus 3.0>
-
- #<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.** { *; }
- #</Gson>
-
- #<glide>
- -keep public class * implements com.bumptech.glide.module.GlideModule
- -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
- **[] $VALUES;
- public *;
- }
- #</glide>
-
- #<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;
- }
- #</Rxjava RxAndroid>
-
- #----------------------------------第三方包--结束--------------------------
-
- #---------------------------------一些不要混淆的代码--开始-------------------
-
- -keep class net.arvin.afbaselibrary.nets.** { *; }
- -keep class net.arvin.afbaselibrary.data.** { *; }
-
- #<反射>
- -keep class net.arvin.afbaselibrary.nets.BaseNet{*;}
- #</反射>
-
- #<js>
-
- #</js>
-
- #<自定义View的类>
- -keep class net.arvin.afbaselibrary.ui.views.** {*;}
- #</自定义View的类>
-
- #---------------------------------一些不要混淆的代码--结束-------------------
因为我们提供给别人的一般都是release版本的库,所以要在build.gradle中开启release版代码混淆,配置好混淆规则后在Android studio的Terminal界面输入:gradlew assembleRelease回车进行编译打包,如果编译失败则检查配置的混淆规则。成功后即可得到混淆后的aar或apk文件:
混淆时对外暴露的接口层不能混淆,实体类不能混淆。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。