美文网首页高级UIAndroid
Android Proguard 混淆规则

Android Proguard 混淆规则

作者: raywalker | 来源:发表于2019-10-17 17:55 被阅读0次

1 工具介绍 和 应用

Proguard 是一种对Java 字节码的优化工具,可以使得Java 或是 Android app 应用文件更小以及运行更快。通过混淆类名,字段名以及方法名,它也提供了一种对逆向工程的有限防护手段。Android的开发人员对它一定不陌生,它本身已是Google Android SDK的默认工具 🔧。

2 常见使用场景

混淆的本意是防止app被逆向工程破解,但特定的场景下我们往往并不希望启用混淆机制。主要常见于一些动态化或是有特殊约定的的场景。一般来看主要包括:

  • 序列化/反序列化相关的对象(e.g. JSON data models, Serializables, Parcelables)
  • 有按规则约定的方法名 (e.g. JavaScriptInterface )
  • 动态加载的class
  • 需要保留的平台相关的部分
  • 特定Annotation修饰的方法

3 注意事项⚠️

  • Android library project 需要特别的指定其自身相关的proguard文件
    consumerProguardFiles 'your-proguard-rules.pro'
    
  • Support library 中有 Keep 注解的class
    -keep @android.support.annotation.Keep class * {*;}
    -keepclassmembers class * {
        @android.support.annotation.Keep *;
    }
    
  • androidx 中有 Keep注解的class
    -keep @androidx.annotation.Keep class * {*;}
    -keepclassmembers class * {
         @androidx.annotation.Keep *;
     }
    

4 典型的 Proguard 文件

-repackageclasses

-dontwarn org.springframework.**
-dontwarn com.google.common.**
-dontwarn sun.misc.Unsafe

# Keep Options:

-keepattributes *Annotation*,EnclosingMethod
-keepattributes JavascriptInterface
-keepattributes Exceptions
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable

-keep class sun.misc.Unsafe{*;}

-keep class com.google.gson.** {*;}
-keep class com.google.common.** {*;}
-keep class com.loopj.android.http.** {*;}
-keep class sun.misc.Unsafe{*;}

-keep public class * extends android.app.Activity
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.app.Service
-keep public class * extends android.view.View
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.Application
-keep public class * extends android.app.Dialog
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.app.Fragment
-keep public class com.android.vending.licensing.ILicensingService
-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

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

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

-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

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

# Android support libs
-dontwarn android.support.v4.**
-dontwarn android.support.design.**
-dontwarn android.support.v13.**

# JavaScript interface
-keepclassmembers class {your.javascript.interface.for.webview} {
   public *;
}

# 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, jav.lang.String);
}

# Butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

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

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

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

# GreenDao
-keep class de.greenrobot.dao.** {*;}
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
    public static java.lang.String TABLENAME;
}
-keep class **$Properties

# Retrofit
-dontwarn retrofit.**
-keep class retrofit.** { *; }

# The 'Keep' annotation
-keep @android.support.annotation.Keep class * {*;}
-keep,allowobfuscation @interface android.support.annotation.Keep
-keepclassmembers class * {
    @android.support.annotation.Keep *;
}

# Data models in Your application
-keep class {your.data..model}.** { *;}

# EventBus from GreenRobot
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

4 其它可选项

DexGuard

R8

相关文章

网友评论

    本文标题:Android Proguard 混淆规则

    本文链接:https://www.haomeiwen.com/subject/nurvmctx.html