加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长资讯 > 评论 > 正文

请你吃一顿史上最全的Android混淆大餐

发布时间:2019-08-21 05:14:09 所属栏目:评论 来源:hardwork
导读:在 Android 日常开发过程中,混淆是我们开发 App 的一项必不可少的技能。只要是我们亲身经历过 App 打包上线的过程,或多或少都需要了解一些代码混淆的基本操作。那么,混淆到底是什么?它的好处有哪些?具体效果如何?别急,下面我们来一一探索它的独特魅力

Gradle 资源压缩器只会移除未被应用引用的资源,这意味着它不会移除用于不同设备配置的备用资源。必要时,我们可以使用 Android Gradle 插件的 resConfigs 属性来移除您的应用不需要的备用资源文件(常见的有用于国际化支持的 strings.xml,适配用的 layout.xml 等):

  1. android { 
  2.  defaultConfig { 
  3.  ... 
  4.  //保留中文和英文国际化支持 
  5.  resConfigs "en", "zh" 
  6.  } 

自定义混淆规则

品尝完了以上"配菜",下面让我们来品味一下本文的"主菜":自定义混淆规则。首先,我们来了解一下常见的混淆命令。

keep 命令

这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。以下是常见的 -keep 命令:

-keep

作用:保留指定的类和成员,防止被混淆处理。例如:

  1. # 保留包:com.moos.media.entity 下面的类以及类成员 
  2. -keep public class com.moos.media.entity.** 
  3. # 保留类:NumberProgressBar 
  4. -keep public class com.moos.media.widget.NumberProgressBar {*;} 

-keepclassmembers

作用:保留指定的类的成员(变量/方法),它们将不会被混淆。如:

  1. # 保留类的成员:MediaUtils类中的特定成员方法 
  2. -keepclassmembers class com.moos.media.MediaUtils { 
  3.  public static *** getLocalVideos(android.content.Context); 
  4.  public static *** getLocalPictures(android.content.Context); 

-keepclasseswithmembers

作用:保留指定的类和其成员(变量/方法),前提是它们在压缩阶段没有被删除。与-keep 使用方式类似:

  1. # 保留类:BaseMediaEntity 的子类 
  2. -keepclasseswithmembers public class * extends com.moos.media.entity.BaseMediaEntity{*;} 
  3. # 保留类:OnProgressBarListener接口的实现类 
  4. -keep public class * implements com.moos.media.widget.OnProgressBarListener {*;} 

@Keep

除了以上方式,你也可以选择使用 @Keep 注解来保留期望代码,防止它们被混淆处理。比如,我们通过 @Keep 修饰一个类来保留它不被混淆:

  1. @Keep 
  2. data class CloudMusicBean(var createDate: String, 
  3.  var id: Long, 
  4.  var name: String, 
  5.  var url: String, 
  6.  val imgUrl: String) 

同样地,我们也可以让 @Keep 来修饰方法或者字段进而保留它们。

其他命令

dontwarn

-dontwarn 命令一般在我们引入新的 library 时会使用到,常用于处理 library 中无法解决的警告。如:

  1. -keep class twitter4j.** { *; } 
  2. -dontwarn twitter4j.** 

其他的命令用法可参考 Android 系统提供的默认混淆规则:

  1. #混淆时不生成大小写混合的类名 
  2. -dontusemixedcaseclassnames 
  3. #不跳过非公共的库的类 
  4. -dontskipnonpubliclibraryclasses 
  5. #混淆过程中记录日志 
  6. -verbose 
  7. #关闭预校验 
  8. -dontpreverify 
  9. #关闭优化 
  10. -dontoptimize 
  11. #保留注解 
  12. -keepattributes *Annotation* 
  13. #保留所有拥有本地方法的类名及本地方法名 
  14. -keepclasseswithmembernames class * { 
  15.  native <methods>; 
  16. #保留自定义View的get和set方法 
  17. -keepclassmembers public class * extends android.view.View { 
  18.  void set*(***); 
  19.  *** get*(); 
  20. #保留Activity中View及其子类入参的方法,如: onClick(android.view.View) 
  21. -keepclassmembers class * extends android.app.Activity { 
  22.  public void *(android.view.View); 
  23. #保留枚举 
  24. -keepclassmembers enum * { 
  25.  **[] $VALUES; 
  26.  public *; 
  27. #保留序列化的类 
  28. -keepclassmembers class * implements android.os.Parcelable { 
  29.  public static final android.os.Parcelable$Creator CREATOR; 
  30. #保留R文件的静态成员 
  31. -keepclassmembers class **.R$* { 
  32.  public static <fields>; 
  33. -dontwarn android.support.** 
  34. -keep class android.support.annotation.Keep 
  35. -keep @android.support.annotation.Keep class * {*;} 
  36. -keepclasseswithmembers class * { 
  37.  @android.support.annotation.Keep <methods>; 
  38. -keepclasseswithmembers class * { 
  39.  @android.support.annotation.Keep <fields>; 
  40. -keepclasseswithmembers class * { 
  41.  @android.support.annotation.Keep <init>(...); 

混淆"黑名单"

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读