Android代码混淆

作者: Ezea | 来源:发表于2018-06-07 09:44 被阅读9次

什么是代码混淆

删除无用代码,将代码中的各种元素,如包名、类名、函数名、变量名等改成无意义的符号,使得反编译你apk的人无法根据名字猜测代码的用途,这是一种加密手段

为什么要进行代码混淆

如果代码没经过混淆,发布出去后,别人只需要反编译即可查看你的源码,这是一种知识产权的保护手段

代码混淆是否能保证代码的绝对安全

混淆的目的是为了加大反编译的成本,但是并不能彻底防止反编译

怎么进行代码混淆

使用Android Studio创建项目时会在项目根目录下生成一个proguard-rules.pro文件,该文件便是指定项目混淆规则的文件,使用的时候只需要在里面加入相应的混淆规则即可。也就是说,你在这个文件里面指定 哪些代码需要混淆,哪些不需要

keep相关语法

1.keep [,modifier,...] class_specification 不混淆指定的类文件和类的成员 
例如:
(1).保留某个包下面的类以及子包 -keep public class com.droidyue.com.widget.** 
(2).-keep class com.czy.**//不混淆所有com.czy包下的类,** 换成具体的类名则表示不混淆某个具体的类 
(3).-keep class com.clock.**{*;}//不混淆所有com.clock包下的类和类中的所有成员变量,**可以换成具体类名,*可以换成具体的字段,可参照Serialzable的混淆 

2.keepclassmembers [,modifier,...] class_specification 不混淆指定类的成员,如果此类受到保护他们会被保护得更好 
例如:
(1).保留所有类中使用otto的public方法: 
-keepclassmembers class ** { 
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *; 
} 
(2).保留Contants类的BOOK_NAME属性: 
-keepclassmembers class com.example.admin.proguardsample.Constants {
  public static java.lang.String BOOK_NAME; 
} 

3.keepclasseswithmembers [,modifier,...] class_specification 不混淆指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

4.keepnames class_specification 不混淆指定的类和类的成员的 名称(如果他们不会压缩步骤中删除) 

5.keepclassmembernames class_specification 不混淆指定的类的 成员的名称 (如果他们不会压缩步骤中删除)   

6.keepclasseswithmembernames class_specification 不混淆指定的类和类的成员 的名称,如果所有指定的类成员出席(在压缩步骤之后)   

7.printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件 

混淆的基本命令

keep 保留,例如keepattributes:表示保留属性 dont 不要,例如dontwarn:表示不要提示警告 ignore 忽略,例如ignorewarning:表示忽略警告

两个常用的混淆命令,注意一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆;两颗星表示把本包和所含子包下的类名都保持;

  • keep class com.jiyun.demo**
  • keep class com.jiyun.demo.*
  • dontusemixedcaseclassnames表示混淆时不使用大小写混合类名。
  • dontskipnonpubliclibraryclasses表示不跳过library中的非public的类。
  • verbose表示打印混淆的详细信息。
  • dontoptimize表示不进行优化,建议使用此选项,因为根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。
  • dontpreverify表示不进行预校验。这个预校验是作用在JAVA平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度。
  • keepattributes Annotation表示对注解中的参数进行保留。

注意事项

保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用。

  • 使用了自定义控件那么要保证它们不参与混淆
  • 使用了枚举要保证枚举不被混淆
  • 对第三方库中的类不进行混淆
  • 运用了反射的类也不进行混淆
  • 使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆
  • 在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找
  • 有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样
  • Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常

相关文章

  • 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/fhmwsftx.html