Android 代码混淆语法讲解及常用模板(1),程序员35岁真的是分水岭吗

本文详细介绍了Android代码混淆的语法和常用模板,包括如何保留注解、native方法、View的set和get方法、Activity的方法、枚举类、Parcelable实现类等。还提到了一些常见的第三方库如OkHttp、Volley、Picasso的混淆配置。同时,分享了一个Github上的混淆插件AndroidProguardPlugin,它提供了许多常用的混淆模板。
摘要由CSDN通过智能技术生成

-dontpreverify 表示不进行预校验。这个预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度。

-keepattributes *Annotation* 表示对注解中的参数进行保留

-keepclasseswithmembernames class * {

native <method

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

s>;

}

保持所有类的 native 方法不被混淆

-keepclassmembers public class * extends android.view.View {

void set*(***);

*** get*();

}

表示不混淆 View 的子类中的 set 和 get 方法,因为 View 中的属性动画需要 setter 和 getter,混淆了就无法工作了。

-keepclassmembers class * extends android.app.Activity {

public void *(android.view.View);

}

表示不混淆 Activity 及 Activity 子类中方法参数是 (android.view.View) 的方法。因为我们平时在 xml 文件里面可以这样写 onClick=”onButtonClick”,这样点击 Button 的时候会自动到 Activity 里面查找是否有 onButtonClick (android.view.View),有的话,该方法会响应,没有找到的话会报错。因此,一般也不混淆。

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

表示不对美剧类中的 calues 和 valueOf(java.lang.String) 进行混淆

-keepclassmembers class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator CREATOR;

}

表示不混淆 Parcelable 的实现类中的 CREATOR,我们知道序列化与反序列化的过程都需要 CREATOR, 混淆了就无法工作了。

-keepclassmembers class *.R$ {

public static ;

}

表示不混淆 R 类中 的 static 变量,在 R 类中。这些资源 ID 是系统自动帮我们生成的,混淆了就无法找到相应的资源。

-dontwarn android.support.**

表示混略 android.support 包下代码的警告。因为 android.support 包下,许多类都是在高版本中才能使用的,不过你不用担心低版本使用了会报错,因为在 support 包里面的类都已经对版本进行判断,所有直接忽略即可。

-keep class android.support.annotation.Keep

表示不混淆 Keep 类

-keep @android.support.annotation.Keep class * {*;}

表示不混淆 以下形式的代码

@Keep *{

}

-keepclasseswithmembers class * {

@android.support.annotation.Keep ;

}

表示不混淆所有类中用 @Keep 注解的方法

-keepclasseswithmembers class * {

@android.support.annotation.Keep ;

}

表示不混淆所有类中用 @Keep 的变量

-keepclasseswithmembers class * {

@android.support.annotation.Keep (…);

}

表示不混淆所有类中用 @Keep 注解的构造方法


Android 混淆代码示例


如上图,假如我们的项目中的配置是这样的,如果我们想保持项目中 xj.progurddemo.been 包下的类都不被混淆,我们可以这样写

-keep class xj.progurddemo.been.**

而 -keep class xj.progurddemo.been.* 只能保证 People,Test 类不被混淆。Debug 包下的 Debug 类还是会被混淆。

到这里,相信你已经明白 ** 和 * 之间的区别了。 ** 包含目录下的所有子目录,而 * 只包含 目录下的直接目录。

假如我们有以下类 Test,

public class Test {

String name;

public void test(){

}

public abstract String test(String name)

}

我们不想 test 类中的 test 方法不被混淆,而 name 字段可以被混淆,我们可以这样配置

-keepclassmembers public class xj.progurddemo.been.Test {

*** test*(***);

*** 表示匹配任意参数,这样 Test 类中的 test 方法都不会被混淆,不管该方法含有什么类型的参数和该方法的返回类型。


Android 混淆语法介绍


看完简单的代码示例,下面我们一起拉看一下混淆的语法。

首先我们先来看一下 keep 关键字

| 关键字 | 描述 |

| — | — |

| keep | 保留类和类中的成员,防止被混淆或者移除 |

| keepnames | 保留类和类中的成员,防止被混淆,但是当成员没有被引用时会被移除 |

| keepclassmembers | 只保留类中的成员,防止他们被混淆或者移除 |

| keepclassmembersnames | 只保留类中的成员,防止他们被混淆或者移除,但是当类中的成员没有被引用时还是会被移除 |

| keepclasseswithmembers | 保留类和类中的成员,前提是指明的类中必须含有该成员,没有的话还是会被混淆 |

| keepclasseswithmembersnames | 保留类和类中的成员,前提是指明的类中必须含有该成员,没有的话还是会被混淆。需要注意的是没有被引用的成员会被移除 |

接下来我们一起来看一下通配符

| 关键字 | 描述 |

| — | — |

| | 匹配类中的所有字段 |

| | 匹配类中的所有方法 |

| | 匹配类中的所有构造函数 |

| * | 匹配任意长度字符,但不含包名分隔符(.)。比如说我们的完整类名是com.example.test.MyActivity,使用com.*,或者com.exmaple.*都是无法匹配的,因为*无法匹配包名中的分隔符,正确的匹配方式是com.exmaple.*.*,或者com.exmaple.test.*,这些都是可以的。但如果你不写任何其它内容,只有一个*,那就表示匹配所有的东西。 |

| ** | 匹配任意长度字符,并且包含包名分隔符(.)。比如proguard-android.txt中使用的-dontwarn android.support.**就可以匹配android.support包下的所有内容,包括任意长度的子包。 |

| *** | 匹配任意参数类型。比如void set*(***)就能匹配任意传入的参数类型,*** get*()就能匹配任意返回值的类型。 |

| … | 匹配任意长度的任意类型参数。比如void test(…)就能匹配任意void test(String a)或者是void test(int a, String b)这些方法。 |

Android 混淆插件推荐及常用的混淆模板


Github 上面的混淆插件

Github 上有这样一个插件,AndroidProguardPlugin,他帮我们收集了常用的混淆模板,基本能满足我们的大部分需求。详情大家可以自己点击查看,这里就不教大家怎样使用了,该链接已经讲解地很清楚了。AndroidProguardPlugin

Android 常用混淆模板

copyright zhonghanwen

#-------------------------------------------基本不用动区域--------------------------------------------

#---------------------------------基本指令区----------------------------------

-optimizationpasses 5

-dontskipnonpubliclibraryclassmembers

-printmapping proguardMapping.txt

-optimizations !code/simplification/cast,!field/,!class/merging/

-keepattributes Annotation,InnerClasses

-keepattributes Signature

-keepattributes SourceFile,LineNumberTable

#----------------------------------------------------------------------------

#---------------------------------默认保留区---------------------------------

#继承activity,application,service,broadcastReceiver,contentprovider…不进行混淆

-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.** {*;}

-keep public class * extends android.view.View{

*** get*();

void set*(***);

public (android.content.Context);

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

-keepclasseswithmembers class * {

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

#这个主要是在layout 中写的onclick方法android:οnclick=“onClick”,不进行混淆

-keepclassmembers class * extends android.app.Activity {

public void *(android.view.View);

}

-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 class *.R$ {

*;

}

-keepclassmembers class * {

void *(*Event);

}

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

#// natvie 方法不混淆

-keepclasseswithmembernames class * {

native ;

}

#保持 Parcelable 不被混淆

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

#----------------------------------------------------------------------------

#---------------------------------webview------------------------------------

-keepclassmembers class fqcn.of.javascript.interface.for.Webview {

public *;

}

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

}

#----------------------------------------------------------------------------

#---------------------------------------------------------------------------------------------------

#---------------------------------实体类---------------------------------

修改成你对应的包名

-keep class [your_pkg].** { *; }

#---------------------------------第三方包-------------------------------

#支付宝支付

-keep class com.alipay.android.app.IAlixPay{*;}

-keep class com.alipay.android.app.IAlixPay$Stub{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}

-keep class com.alipay.sdk.app.PayTask{ public *;}

-keep class com.alipay.sdk.app.AuthTask{ public *;}

-keep public class * extends android.os.IInterface

#微信支付

-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}

-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}

-keep class com.tencent.wxop.** { *; }

-dontwarn com.tencent.mm.**

-keep class com.tencent.mm.**{*;}

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

-keep class com.taobao.** {*;}

-keep class com.alibaba.** {*;}

-keep class com.alipay.** {*;}

-dontwarn com.taobao.**

-dontwarn com.alibaba.**

-dontwarn com.alipay.**

-keep class com.ut.** {*;}

-dontwarn com.ut.**

-keep class com.ta.** {*;}

-dontwarn com.ta.**

-keep class anet.**{*;}

-keep class org.android.spdy.**{*;}

-keep class org.android.agoo.**{*;}

-dontwarn anet.**

-dontwarn org.android.spdy.**

-dontwarn org.android.agoo.**

-keepclasseswithmembernames class com.xiaomi.**{*;}

-keep public class * extends com.xiaomi.mipush.sdk.PushMessageReceiver

-dontwarn com.xiaomi.push.service.b

-keep class org.apache.http.**

-keep interface org.apache.http.**

-dontwarn org.apache.**

#okhttp3.x

-dontwarn com.squareup.okhttp3.**

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

-dontwarn okio.**

#sharesdk

-keep class cn.sharesdk.**{*;}

-keep class com.sina.**{*;}

-keep class *.R$ {*;}

-keep class **.R{*;}

-keep class com.mob.**{*;}

-dontwarn com.mob.**

-dontwarn cn.sharesdk.**

-dontwarn *.R$

nineoldandroids-2.4.0.jar

-keep public class com.nineoldandroids.** {*;}

####################zxing#####################

-keep class com.google.zxing.** {*;}

-dontwarn com.google.zxing.**

##百度定位

-keep class com.baidu.** {*;}

-keep class vi.com.** {*;}

-dontwarn com.baidu.**

okhttp

-dontwarn com.squareup.okhttp.**

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

#retrofit

-dontwarn retrofit.**

-keep class retrofit.** { *; }

-keepattributes Signature

-keepattributes Exceptions

-dontwarn okio.**

#recyclerview-animators

-keep class jp.wasabeef.** {*;}

-dontwarn jp.wasabeef.*

#multistateview

-keep class com.kennyc.view.** { *; }

-dontwarn com.kennyc.view.*

universal-image-loader 混淆

-dontwarn com.nostra13.universalimageloader.**

-keep class com.nostra13.universalimageloader.** { *; }

#ormlite

-keep class com.j256.**

-keepclassmembers class com.j256.** { *; }

-keep enum com.j256.**

-keepclassmembers enum com.j256.** { *; }

-keep interface com.j256.**

-keepclassmembers interface com.j256.** { *; }

#umeng

========= 友盟 =================

-dontshrink

-dontoptimize

-dontwarn com.google.android.maps.**

-dontwarn android.webkit.WebView

-dontwarn com.umeng.**

-dontwarn com.tencent.weibo.sdk.**

-dontwarn com.facebook.**

-keep enum com.facebook.**

-keepattributes Exceptions,InnerClasses,Signature

-keepattributes Annotation

-keepattributes SourceFile,LineNumberTable

-keep public interface com.facebook.**

-keep public interface com.tencent.**

-keep public interface com.umeng.socialize.**

-keep public interface com.umeng.socialize.sensor.**

-keep public interface com.umeng.scrshot.**

-keep public class com.umeng.socialize.* {*;}

-keep public class javax.**

-keep public class android.webkit.**

-keep class com.facebook.**

-keep class com.umeng.scrshot.**

-keep public class com.tencent.** {*;}

-keep class com.umeng.socialize.sensor.**

-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}

-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}

-keep class im.yixin.sdk.api.YXMessage {*;}

-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}

下面中括号的地方需要要填你的包名

-keep public class [your_pkg].R$*{

public static final int *;

}

-keepclassmembers class * {

public (org.json.JSONObject);

}

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

#友盟自动更新

-keep public class com.umeng.fb.ui.ThreadView {

}

-keep public class * extends com.umeng.**

以下包不进行过滤

-keep class com.umeng.** { *; }

#-ButterKnife 7.0

-keep class butterknife.** { *; }

-dontwarn butterknife.internal.**

-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {

@butterknife.* ;

}

-keepclasseswithmembernames class * {

@butterknife.* ;

}

#AndFix

-keep class * extends java.lang.annotation.Annotation

-keepclasseswithmembernames class * {

native ;

}

#eventbus 3.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);

}

#EventBus

-keepclassmembers class ** {

public void onEvent*(**);

}

-keepclassmembers class ** {

public void xxxxxx(**);

}

################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.** { *; }

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

support-v4

#https://stackoverflow.com/questions/18978706/obfuscate-android-support-v7-widget-gridlayout-issue

-dontwarn android.support.v4.**

-keep class android.support.v4.app.** { *; }

-keep interface android.support.v4.app.** { *; }

-keep class android.support.v4.** { *; }

support-v7

-dontwarn android.support.v7.**

-keep class android.support.v7.internal.** { *; }

-keep interface android.support.v7.internal.** { *; }

-keep class android.support.v7.** { *; }

support design

#@link http://stackoverflow.com/a/31028536

-dontwarn android.support.design.**

-keep class android.support.design.** { *; }

-keep interface android.support.design.** { *; }

-keep public class android.support.design.R$* { *; }

#-------------------------------------------------------------------------

picasso

-keep class com.squareup.picasso.** {*; }

-dontwarn com.squareup.picasso.**

#glide

-keep public class * implements com.bumptech.glide.module.GlideModule

-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {

**[] $VALUES;

public *;

}

# ######## greenDao混淆

# -------------------------------------------

-keep class de.greenrobot.dao.** {*;}

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {

public static Java.lang.String TABLENAME;

}

-keep class **$Properties

# ############### volley混淆

# -------------------------------------------

-keep class com.android.volley.** {*;}

-keep class com.android.volley.toolbox.** {*;}

-keep class com.android.volley.Response$* { *; }

-keep class com.android.volley.Request$* { *; }

-keep class com.android.volley.RequestQueue$* { *; }

-keep class com.android.volley.toolbox.HurlStack$* { *; }

-keep class com.android.volley.toolbox.ImageLoader$* { *; }

#jpush极光推送

-dontwarn cn.jpush.**

-keep class cn.jpush.** { *; }

#activeandroid

-keep class com.activeandroid.** { *; }

-dontwarn com.ikoding.app.biz.dataobject.**

umptech.glide.load.resource.bitmap.ImageHeaderParser$** {

**[] $VALUES;

public *;

}

# ######## greenDao混淆

# -------------------------------------------

-keep class de.greenrobot.dao.** {*;}

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {

public static Java.lang.String TABLENAME;

}

-keep class **$Properties

# ############### volley混淆

# -------------------------------------------

-keep class com.android.volley.** {*;}

-keep class com.android.volley.toolbox.** {*;}

-keep class com.android.volley.Response$* { *; }

-keep class com.android.volley.Request$* { *; }

-keep class com.android.volley.RequestQueue$* { *; }

-keep class com.android.volley.toolbox.HurlStack$* { *; }

-keep class com.android.volley.toolbox.ImageLoader$* { *; }

#jpush极光推送

-dontwarn cn.jpush.**

-keep class cn.jpush.** { *; }

#activeandroid

-keep class com.activeandroid.** { *; }

-dontwarn com.ikoding.app.biz.dataobject.**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值