Android proguard(混淆)模板

时间:2021-01-25 04:38:48

不能混淆

  • 在AndroidManifest中配置的类,比如四大组件
  • JNI调用的方法
  • 反射用到的类
  • WebView中JavaScript调用的方法
  • Layout文件引用到的自定义View
  • 一些引入的第三方库(一般都会有混淆说明的)(没说明就把整个包不混淆或自己根据不能混淆的规则去写)
    推荐两个开源项目,里面收集了一些第三方库的混淆规则
    android-proguard-snippets
    android-proguard-cn

app.gradle里面打开proguard

buildTypes{
        release{
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug{
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

模板

#指定压缩级别
-optimizationpasses 5 
#不跳过非公共的库的类成员
-dontskipnonpubliclibraryclassmembers 
#打印混淆时的详细信息
-verbose 
#混淆时采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
#把混淆类中的方法名也混淆了
-useuniqueclassmembernames 
#优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification 
#将文件来源重命名为“SourceFile”字符串
-renamesourcefileattribute SourceFile 
#保留行号
-keepattributes SourceFile,LineNumberTable 
#保持泛型
-keepattributes Signature 
#保持所有实现 Serializable 接口的类成员
-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();
}

#Fragment不需要在AndroidManifest.xml中注册,需要额外保护下
-keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment 
# 保持测试相关的代码
-dontnote junit.framework.** -dontnote junit.runner.** -dontwarn android.test.** -dontwarn android.support.test.** -dontwarn org.junit.** 
-keep class com.hs.map.shunloc.util.beanutil.**{*;} 
-keep class * extends android.app.Application 
-keep class org.apache.** { *; } -dontwarn org.apache.** 
-keep class com.sun.mail.** { *; } -dontwarn com.sun.mail.** 
-keep class java.beans.** { *; } -dontwarn java.beans.** 
-keep class org.json.** { *; } -dontwarn org.json.** 
-keep class java.lang.invoke.** { *; } -dontwarn java.lang.invoke.** 
-keep class sun.misc.Unsafe { *; } -dontwarn sun.misc.Unsafe 
-keep interface android.support.v7.** { *; } -keep class android.support.v7.** { *; } -keep interface android.support.v4.** { *; } -keep class android.support.v4.** { *; } -dontwarn android.app.Notification

常用第三方

百度地图(jar包换成自己的版本,记得签名要匹配)

-keep class com.baidu.** {*;} -keep class vi.com.** {*;} -keep class com.sinovoice.** {*;} -keep class pvi.com.** {*;} -dontwarn com.baidu.** -dontwarn pvi.com.** -dontwarn vi.com.**

pinyin4j

-dontwarn net.sourceforge.pinyin4j.** -keep class net.sourceforge.pinyin4j.**{*;} -keep class net.sourceforge.pinyin4j.format.**{*;} -keep class net.sourceforge.pinyin4j.format.exception.**{*;}

glide proguard

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

for DexGuard only

#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

Retain generated class which implement Unbinder.

-keep public class * implements butterknife.Unbinder { public <init>(...); }

butterknife

-keep class butterknife.* -keepclasseswithmembernames class * { @butterknife.* <methods>; } -keepclasseswithmembernames class * { @butterknife.* <fields>; }

—————Begin: proguard configuration for Gson ———-

# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }

#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.reflect{*;}
-keep class com.google.gson.**{*;}

# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

##---------------End: proguard configuration for Gson ----------

xUtils3.0

-keepattributes Signature,Annotation
-keep public class org.xutils.** {
public protected *;
}
-keep public interface org.xutils.** {
public protected *;
}
-keepclassmembers class * extends org.xutils.** {
public protected *;
}
-keepclassmembers @org.xutils.db.annotation.* class * {*;}
-keepclassmembers @org.xutils.http.annotation.* class * {*;}
-keepclassmembers class * {
@org.xutils.view.annotation.Event *;
}

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

Retrofit

-dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions

Retrolambda

-dontwarn java.lang.invoke.*

OkHttp

-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**

OkHttp3

-dontwarn com.squareup.okhttp3.** -keep class com.squareup.okhttp3.** { *;} -keep class okhttp3.**{*;} -dontwarn okio.** -dontwarn okhttp3.**