Android 代码混淆语法讲解及常用模板

-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.**

-keep public class com.ikoding.app.biz.dataobject.** { *;}

-keepattributes Annotation

#log4j

-dontwarn org.apache.log4j.**

-keep class org.apache.log4j.** { *;}

#下面几行 是环信即时通信的代码混淆

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

-keep class org.jivesoftware.** {*;}

-dontwarn com.easemob.**

#融云

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

public *;

}

-keepattributes Exceptions,InnerClasses

-keep class io.rong.** {*;}

-keep class * implements io.rong.imlib.model.MessageContent{*;}

-keepattributes Signature

-keepattributes Annotation

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

-keep class com.google.gson.examples.android.model.** { *; }

-keepclassmembers class * extends com.sea_monster.dao.AbstractDao {

public static java.lang.String TABLENAME;

}

-keep class **$Properties

-dontwarn org.eclipse.jdt.annotation.**

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

#高徳地图

-dontwarn com.amap.api.**

-dontwarn com.a.a.**

-dontwarn com.autonavi.**

-keep class com.amap.api.** {*;}

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

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

#---------------------------------反射相关的类和方法-----------------------

在这下面写反射相关的类和方法,没有就不用写!

#---------------------------------与js互相调用的类------------------------

在这下面写与js互相调用的类,没有就去掉这句话!

#---------------------------------自定义View的类------------------------

在这下面写自定义View的类的类,没有就去掉这句话!

#SuperID

#由郭宇翔贡献混淆代码

#作者Github地址:https://github.com/yourtion

-keep class *.R$ {*;}

-keep class com.isnc.facesdk.aty.**{*;}

-keep class com.isnc.facesdk.**{*;}

-keep class com.isnc.facesdk.common.**{*;}

-keep class com.isnc.facesdk.net.**{*;}

-keep class com.isnc.facesdk.view.**{*;}

-keep class com.isnc.facesdk.viewmodel.**{*;}

-keep class com.matrixcv.androidapi.face.**{*;}

#retrofit2.x

-dontwarn retrofit2.**

-keep class retrofit2.** { *; }

-keepattributes Signature

-keepattributes Exceptions

#Rxjava RxAndroid

-dontwarn rx.*

-dontwarn sun.misc.**

-keepclassmembers class rx.internal.util.unsafe.ArrayQueueField* {

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;

}

#litepal

-dontwarn org.litepal.

-keep class org.litepal.* { ; }

-keep enum org.litepal.*

-keep interface org.litepal. { ; }

-keep public class extends org.litepal.

-keepattributes Annotation

-keepclassmembers class * extends org.litepal.crud.DataSupport{*;}

#fastJson

-dontwarn com.alibaba.fastjson.**

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

Okio

-dontwarn com.squareup.**

-dontwarn okio.**

-keep public class org.codehaus.* { *; }

-keep public class java.nio.* { *; }

Retrolambda

-dontwarn java.lang.invoke.*

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

Android高级技术大纲

面试资料整理

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

中…(img-WCCstRLb-1713732089400)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

[外链图片转存中…(img-PvTeODWJ-1713732089402)]

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

[外链图片转存中…(img-lGEmTTZO-1713732089403)]

[外链图片转存中…(img-nqC6uRNX-1713732089404)]

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值