2. 对内部类的处理
如果项目中使用了内部类,要对其进行保留。
1.保留写在某个类里面的所有内部类。下面表示写在类A里面的内部类都会被保留($符号是用来分割内部类与其母体的标志),什么意思呢,比如类A里面有一个内部类B,而B里面也有个内部类C,这时,B和C都会被保留,以此类推,对多重嵌套的情况,都会被保留(当然我们写代码也不会写出这么深层级的内部类出来),这里的内部类包含静态内部类,非静态内部类,不包含匿名内部类,如果是匿名内部类,只会保留其方法和成员变量(其继承的类或实现的接口的名字会被混淆),另外如果对应的类被保留,在该类里面定义的接口也会被保留,{*;}匹配该类里面的所有部分。
-keep class com.dev.example.A$* { *; }
2.保留写在某个内部类里面所有的内部类,这话听着有点绕口,举个例子,类A里面有个内部类B,下面表示写在类B里面的内部类都会被保留。此时,类B像上面第一点所举得类A一样,有点递归意思在里面。还有就是此时类B的名字不会被混淆,但里面的方法和成员变量会被混淆,如果其它地方没有对类B的方法和成员变量进行保留的话。
-keep class com.dev.example.A B B B* { *; }
3. 对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);
}
4. 保留js调用的原生方法
如果我们的app中涉及到和h5交互,需要保留js调用的原生方法。
Keep JavascriptInterface
-keepclassmembers class ** {
@android.webkit.JavascriptInterface public *;
}
5. 对含有反射类的处理
有时候项目中有些类不是实体类,但仍然用到反射功能,如Class.forName(“xxx”),这是我们需要保留的。比如这些类在com.dev.example包下,可以通过下面的配置进行保留。
-keep class com.dev.example.* { *; }
另外上面只是保留了该包下的类,如果该包下还有子包,则子包的类仍然会被混淆, 如果想保留该包下子包的类,我们可以如下配置(**能匹配本包和所含子包,其中子包也可以含有子包)
-keep class com.dev.example.**{ *; }
6. 常见的自定义的配置
1.保留某个特定的类
#保留Test类
-keep public class com.dev.example.Test { *; }
2.保留某个类的子类
#保留继承了AbstractClass的子类
-keep class * extends com.dev.example.AbstractClass{*;}
3.保留接口的实现类
#保留实现了Callable接口的类
-keep class * implements Callable{*;}
4.保留类的特定部分 保留TaskRepository类的所有构造方法,变量和普通方法。
-keep class com.dev.example.TaskRepository{
; //匹配所有构造器
; //匹配所有域
; //匹配所有方法
}
还可以保留的更具体一点,如下所示
-keepclassmembers com.dev.example.TaskRepository{
// 保留该类的修饰符是public且有一个参数(类型是String)的构造方法
public (java.lang.String);
// 保留该类的所有修饰符是public且返回类型void的方法
public void *(**);
// 保留该类的具体某一个方法
public String getUserName();
}
7. 对于第三方依赖库的处理
下面给出几个例子,用到具体第三发依赖库的时候,对应的文档会给出相应配置的。
#okhttp
-dontwarn com.squareup.okhttp.**
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { ;}
-dontwarn okio.*
#retroift
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
fresco SDK
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.common.internal.DoNotStrip *;
}
#rx
-dontwarn rx.**
-keep class rx.** { *;}
#keep GSON stuff
-keep class sun.misc.Unsafe { ; }
-keep class com.google.gson.* { *; }
#ButterKnife
-keep class butterknife.** { ; }
-dontwarn butterknife.internal.*
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* ;
}
-keepclasseswithmembernames class * {
@butterknife.* ;
}
#enventbus
-keep class org.greenrobot.eventbus.** { ;}
-dontwarn org.greenrobot.eventbus.*
-keepclassmembers class ** {另外说一下
public void onEvent*(**);
}
Bugly
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
aliyun push
-keepclasseswithmembernames class ** {
native ;
}
QQ share SDK
-dontwarn com.tencent.**
-keepnames class com.tencent.** {*;}
sina share SDK
-dontwarn com.sina.**
-keepnames class com.sina.** {*;}
umeng SDK
-keep public class * extends com.umeng.**
-dontwarn com.umeng.**
-keep class com.umeng.** { *; }
其它
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件,需要的小伙伴可以私信我【面试】免费领取或者点击GitHub免费获取!
所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件,需要的小伙伴可以私信我【面试】免费领取或者点击GitHub免费获取!
[外链图片转存中…(img-u98TrbDF-1710765857461)]
[外链图片转存中…(img-ZlgAeOSO-1710765857462)]