美文网首页混淆
Android代码混淆

Android代码混淆

作者: 三天过去了 | 来源:发表于2019-09-26 16:01 被阅读0次

常用混淆规则

#不混淆某个类
-keep public class com.webi.demo.TestClass {*;}

#不混淆某个包的所有类
-keep class com.webi.demo.** {*;}

#不混淆某个类的子类
-keep public class * extends com.webi.demo.TestClass {*;}

#不混淆某个接口的实现
-keep class * implements com.webi.demo.TestInterface {*;}

#不混淆某个类的特定方法
-keepclassmembers class com.webi.demo.TestClass{
    public void test(java.lang.String);
}

#不混淆某个类的内部类
-keep class com.webi.demo.TestClass$* {*;}

什么是混淆

把代码中原来有具体含义的包名、类名、变量名、方法名等名称全部替换成无意义的字母a/b/c…

为什么要混淆

由于Android是基于Java语言的,而Java属于高层抽象语言,易于反编译,其编译后的程序包中包含了大量的源代码变量、方法名、数据结构等近乎源码的信息,等同于将源码拱手送人。因此为了保护自己的劳动成果以及项目私密问题,我们需要给自己的项目加上混淆。

混淆会出现什么问题

不难理解,由于混淆后,各种变量、方法、类等信息变成了无意义的字母a/b/c,所以会出现ClassNotFoundException的错误,为了避免出现这样的错误,我们需要添加一系列的规则,来标注出我们不希望混淆的地方。

常见的保持相关元素不参与混淆的几种指令

命令 作用
-keep 防止类和成员被移除和被重命名
-keepclassmembers 防止成员被移除和被重命名
-keepnames 防止类和成员被重命名
-keepclassmembernames 防止成员被重命名
-keepclasseswithmembers 防止拥有该成员的类和成员被移除或重命名
-keepclasseswithmembernames 防止拥有该成员的类和成员被重命名

没有规则

none.png

默认值,如果你没有指定任何类型的keep指令,那么它会压缩(删除未使用的代码)并对类和类成员进行模糊处理(即重命名)

-keep

keep.png

-keep为不压缩、不混淆。

-keepclassmembers

keepclassmembers.png

使用这个规则,如果一个类未被使用,则会被删除。如果一个类被使用了,则会重命名这个的类的名字,它所有的成员都还在,并且还是原来的名字。

-keepnames

keepnames.png

允许类和成员压缩,但不能混淆。也就是说,任何未使用的代码都将被删除,但保留下来的代码将保留其原始名称。

-keepclassmembernames

keepclassmembernames.png

删除未使用的类和成员变量,混淆类名,保留成员的原始名称。

-keepclasseswithmembers

与-keep相同,不同之处在于它仅适用于具有类规范中所有成员的类。

-keepclasseswithmembernames

此规则与-keepnames相同。不同的是,它仅适用于具有类规范中所有成员的类。

更多详细的请到官网

保持元素不参与混淆的规则

[保持命令] [类] {
    [成员]
}

[类]表示类相关的限定条件,它将最终定位到某些符合该限定条件的类。它的内容可以使用:

  • 具体的类
  • 访问修饰符(public、protected、private)
  • 通配符*,匹配任意长度字符,但不含包名分隔符.
  • 通配符**,匹配任意长度字符,并且包含包名分隔符.
  • extends,即可以指定类的基类
  • implement,匹配实现了某接口的类
  • $,内部类

[成员]代表类成员相关的限定条件,它将最终定位到某些符合该限定条件的类成员。它的内容可以使用:

  • <init>匹配所有构造器
  • <methods>匹配所有方法
  • 通配符*,匹配任意长度字符,但不含包名分隔符.
  • 通配符**,匹配任意长度字符,并且包含包名分隔符.
  • 通配符***,匹配任意参数类型
  • ...,匹配任意长度的任意类型参数。比如void test(...)就能匹配任意void test(String a)或者是void test(int a, int b)这些方法
  • 访问修饰符(public、protected、private)
    例如,需要将com.demo.test包下所有继承Activity的public类及其构造函数都保持住,可以这么写:
-keep public class com.webi.mixdemo.*** extends Android.app.Avtivty{
    <init>
}

相关文章

  • ProGuard详解

    Android分享:代码混淆那些事Android代码混淆之混淆规则Android-Dev-Favorites An...

  • Android代码混淆

    待整理。。。 参考: Android混淆从入门到精通 Android代码混淆之混淆规则 代码混淆规则配置文件:pr...

  • Android混淆

    Android 代码混淆零基础入门

  • 你混淆Android代码多吗?

    ProGuard是一个开源的Java代码混淆器。它可以混淆Android项目里面的java代码,但是不能混淆资源,...

  • Android app代码混淆完整解决方案

    Android app代码混淆完整解决方案

  • Android代码混淆

    什么是代码混淆 删除无用代码,将代码中的各种元素,如包名、类名、函数名、变量名等改成无意义的符号,使得反编译你ap...

  • Android代码混淆

    作为Android开发者,如果你不想开源你的应用,那么在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使被...

  • Android 代码混淆

    代码混淆的作用代码混淆,就是把java文件在生成class文件是,类名,方法名等JAVA元素修改成没有意义的名称,...

  • Android 代码混淆

  • Android代码混淆

    keep 资源文件或者配置文件引用到的类(自定义View,四大组件等等) 反射类 模板

网友评论

    本文标题:Android代码混淆

    本文链接:https://www.haomeiwen.com/subject/jubructx.html