2024年Android 代码混淆语法讲解及常用模板,2024年最新面试必问的几大问题

结语

  • 现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。
  • 音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。
  • 要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
  • OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

-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

总结

【Android 详细知识点思维脑图(技能树)】

我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

最后,赠与大家一句话,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

place();

java.lang.Object readResolve();

}

-keep public class * implements java.io.Serializable {*;}

support-v4

总结

【Android 详细知识点思维脑图(技能树)】

[外链图片转存中…(img-wiP8KjHO-1715583003825)]

我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-d5DtZpNW-1715583003826)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

最后,赠与大家一句话,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值