Android 混淆配置

在安卓中,使用混淆是基本操作,当然横版一般也相对固定,下面放一套自己用的混淆横版

#---------------------------------基本配置----------------------------------
-optimizationpasses 5       # 指定代码的压缩级别
-dontusemixedcaseclassnames     # 是否使用大小写混合
-dontskipnonpubliclibraryclasses        # 指定不去忽略非公共的库类
-dontpreverify      # 混淆时是否做预校验
-verbose        # 混淆时是否记录日志
-optimizations !code/simplification/cast,!field/*,!class/merging/*      # 混淆时所采用的算法
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-dontshrink
-dontoptimize
#把混淆类中的方法名也混淆了
-useuniqueclassmembernames
# -dontobfuscate


# 指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers

#指示语:不能用这个指令处理库中的代码,因为有的类和类成员没有设计成public ,而在api中可能变成public
-allowaccessmodification

#----------------------------------------------------------------------------
-ignorewarnings     # 是否忽略检测,(是)
#---------------------------------默认保留区---------------------------------
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}

#这两个类我们基本也用不上,是接入Google原生的一些服务时使用的,配置上以防万一
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService


#如果有引用v4包可以添加下面这行
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**

# 新增Androidx配置
-keep class androidx.** { *; }
-keep public class * extends androidx.**

#这个主要是在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);
}

#表示不混淆任何一个View中的setXxx()和getXxx()方法,
#因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。
# 保留我们自定义控件(继承自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);
}


-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

# 序列化需要保留的部分
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-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$* {
    public static <fields>;
}

-keepclassmembers class * {
    void *(**On*Event);
}
#----------------------------------------------------------------------------

#---------------------------------webview------------------------------------
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String);
}

#-repackageclasses
#下面两个当有优化和使用-repackageclasses时才适用。
# 把所有类移动到此包下
#-repackageclasses cn.chronx.karo
# 所有的类名重命名为 Karo (自定义),防反编译看到原类名
#-renamesourcefileattribute Karo

# 以下三个是配置自定义混淆时使用的名字字典
# 类名
-classobfuscationdictionary proguard-socialism.txt
# 名名
-packageobfuscationdictionary proguard-socialism.txt
-obfuscationdictionary proguard-socialism.txt


# okhttp3
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.* { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**

# Okio
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }

# fast json
-keep class com.alibaba.fastjson.** {*;}
# retrofit2
-keep class retrofit2.** {*;}

# If you do NOT use SQLCipher:
-dontwarn net.sqlcipher.database.**
# If you do NOT use RxJava:
-dontwarn rx.**

其他就是自定义的部分了,可以参照上面的写,用法基本上都有。

如果我只想保留 public 的方法应该怎么写呢?

-keepclassmembers class cn.ido2.droid.karo.**{ public *;}

可以在后面添加限定符,如果想保留非 private

-keepclassmembers class cn.ido2.droid.karo.*{ !private;}

这样就可以保留类中所有非私有的方法名了。

欢迎补充!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引言 对于Android应用的混淆,网上有很多的资料,也有很多的相关案例和模板,相信大家也都比较熟悉。但是,对于一...
    AFinalDream阅读 13,765评论 0 11
  • 打开混淆: 在app下的build.gradle 文件中 设置minifyEnabled true 即可打开混淆。...
    simit阅读 4,850评论 0 0
  • Android打正式的release包混淆是必备的,避免APP被反编译,使项目中隐秘的技术或信息被别人查看。 Ec...
    大_大阅读 4,106评论 0 1
  • # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不...
    杰奎琳子阅读 7,639评论 0 11
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,471评论 2 59