Gradle 资源压缩器只会移除未被应用引用的资源,这意味着它不会移除用于不同设备配置的备用资源。必要时,我们可以使用 Android Gradle 插件的 resConfigs 属性来移除您的应用不需要的备用资源文件(常见的有用于国际化支持的 strings.xml,适配用的 layout.xml 等):
- android {
- defaultConfig {
- ...
- //保留中文和英文国际化支持
- resConfigs "en", "zh"
- }
- }
自定义混淆规则
品尝完了以上"配菜",下面让我们来品味一下本文的"主菜":自定义混淆规则。首先,我们来了解一下常见的混淆命令。
keep 命令
这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。以下是常见的 -keep 命令:
-keep
作用:保留指定的类和成员,防止被混淆处理。例如:
- # 保留包:com.moos.media.entity 下面的类以及类成员
- -keep public class com.moos.media.entity.**
- # 保留类:NumberProgressBar
- -keep public class com.moos.media.widget.NumberProgressBar {*;}
-keepclassmembers
作用:保留指定的类的成员(变量/方法),它们将不会被混淆。如:
- # 保留类的成员:MediaUtils类中的特定成员方法
- -keepclassmembers class com.moos.media.MediaUtils {
- public static *** getLocalVideos(android.content.Context);
- public static *** getLocalPictures(android.content.Context);
- }
-keepclasseswithmembers
作用:保留指定的类和其成员(变量/方法),前提是它们在压缩阶段没有被删除。与-keep 使用方式类似:
- # 保留类:BaseMediaEntity 的子类
- -keepclasseswithmembers public class * extends com.moos.media.entity.BaseMediaEntity{*;}
- # 保留类:OnProgressBarListener接口的实现类
- -keep public class * implements com.moos.media.widget.OnProgressBarListener {*;}
@Keep
除了以上方式,你也可以选择使用 @Keep 注解来保留期望代码,防止它们被混淆处理。比如,我们通过 @Keep 修饰一个类来保留它不被混淆:
- @Keep
- data class CloudMusicBean(var createDate: String,
- var id: Long,
- var name: String,
- var url: String,
- val imgUrl: String)
同样地,我们也可以让 @Keep 来修饰方法或者字段进而保留它们。
其他命令
dontwarn
-dontwarn 命令一般在我们引入新的 library 时会使用到,常用于处理 library 中无法解决的警告。如:
- -keep class twitter4j.** { *; }
- -dontwarn twitter4j.**
其他的命令用法可参考 Android 系统提供的默认混淆规则:
- #混淆时不生成大小写混合的类名
- -dontusemixedcaseclassnames
- #不跳过非公共的库的类
- -dontskipnonpubliclibraryclasses
- #混淆过程中记录日志
- -verbose
- #关闭预校验
- -dontpreverify
- #关闭优化
- -dontoptimize
- #保留注解
- -keepattributes *Annotation*
- #保留所有拥有本地方法的类名及本地方法名
- -keepclasseswithmembernames class * {
- native <methods>;
- }
- #保留自定义View的get和set方法
- -keepclassmembers public class * extends android.view.View {
- void set*(***);
- *** get*();
- }
- #保留Activity中View及其子类入参的方法,如: onClick(android.view.View)
- -keepclassmembers class * extends android.app.Activity {
- public void *(android.view.View);
- }
- #保留枚举
- -keepclassmembers enum * {
- **[] $VALUES;
- public *;
- }
- #保留序列化的类
- -keepclassmembers class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator CREATOR;
- }
- #保留R文件的静态成员
- -keepclassmembers class **.R$* {
- public static <fields>;
- }
- -dontwarn android.support.**
- -keep class android.support.annotation.Keep
- -keep @android.support.annotation.Keep class * {*;}
- -keepclasseswithmembers class * {
- @android.support.annotation.Keep <methods>;
- }
- -keepclasseswithmembers class * {
- @android.support.annotation.Keep <fields>;
- }
- -keepclasseswithmembers class * {
- @android.support.annotation.Keep <init>(...);
- }
混淆"黑名单" (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|