Android 代码混淆

来源:互联网 发布:织梦58公司 编辑:程序博客网 时间:2024/05/16 15:53

1) 前言

  ProGuard是一个开源的Java代码混淆器。它可以混淆Android项目里面的java代码,对的,你没看错,仅仅是java代码。它是无法混淆Native代码,资源文件drawable、xml等。

2) ProGuard作用

  • 压缩: 移除无效的类、属性、方法等

  • 优化: 优化字节码,并删除未使用的结构

  • 混淆: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c等。

3) 混淆注意事项

1. 不能混淆

  • 在AndroidManifest中配置的类,比如四大组件

  • JNI调用的方法

  • 反射用到的类

  • WebView中JavaScript调用的方法

  • Layout文件引用到的自定义View

  • 一些引入的第三方库(一般都会有混淆说明的)

不难理解,混淆之后,类名会变成a,b,c这种,通过包名+类名自然就会找不到该类了,自然就会出现ClassNotFoundException异常。这里推荐一篇文章:
http://www.itnose.net/detail/6043297.html


2. Log处理

我们都知道,使用Log的时候,需要用到TAG,然而TAG我们一般都会写成:  
private static final String TAG = MainActivity.class.getSimpleName()

这时候MainActivity如何被混淆的话,log输出信息就会变成V/a:xxxxxxx,所以为了让log输出信息维持原状,可以将TAG处理成固定的字符串:  
private static final String TAG = "MainActivity"

4)ProGuard使用

1. 常用语法

保留

  • -keep {Modifier} {class_specification} 保护指定的类文件和类的成员

  • -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好

  • -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

  • -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

  • -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

  • -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

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

压缩

  • -dontshrink 不压缩输入的类文件

  • -printusage {filename}

  • -whyareyoukeeping {class_specification}

优化

  • -dontoptimize 不优化输入的类文件

  • -assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用

  • -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

混淆

  • -dontobfuscate 不混淆输入的类文件

  • -obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

  • -overloadaggressively 混淆时应用侵入式重载

  • -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

  • -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

  • -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

  • -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

  • -keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

  • -renamesourcefileattribute {string} 设置源文件中给定的字符串常量

通配符匹配规则

通配符规则?匹配单个字符*匹配类名中的任何部分,但不包含额外的包名**匹配类名中的任何部分,并且可以包含额外的包名%匹配任何基础类型的类型名*匹配任意类型名 ,包含基础类型/非基础类型...匹配任意数量、任意类型的参数<init>匹配任何构造器<ifield>匹配任何字段名<imethod>匹配任何方法*(当用在类内部时)匹配任何字段和方法$指内部类

更详细的语法请戳:http://proguard.sourceforge.net/manual/usage.html#classspecification



通常不需混淆的Android类

-keep public class * extends android.app.Fragment-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.preference.Preference-keep public class * extends android.content.ContentProvider-keep public class * extends android.support.v4.**-keep public class * extends android.support.annotation.**-keep public class * extends android.support.v7.**

Butter Knife

-keep class butterknife.** { *; }-dontwarn butterknife.internal.**-keep class **$$ViewBinder { *; }-keepclasseswithmembernames class * {    @butterknife.* <fields>;}-keepclasseswithmembernames class * {    @butterknife.* <methods>;}

Retrofit

-dontwarn retrofit2.**-keep class retrofit2.** { *; }-keepattributes Signature-keepattributes Exceptions

RxJava RxAndroid

-dontwarn sun.misc.**-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {   long producerIndex;   long consumerIndex;}-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {    rx.internal.util.atomic.LinkedQueueNode producerNode;}-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {    rx.internal.util.atomic.LinkedQueueNode consumerNode;}

Gson

-keepattributes Signature-keepattributes *Annotation*-keep class sun.misc.Unsafe { *; }-keep class com.google.gson.stream.** { *; }# Application classes that will be serialized/deserialized over Gson 下面替换成自己的实体类-keep class com.example.bean.** { *; }

OkHttp3

-dontwarn com.squareup.okhttp3.**-keep class com.squareup.okhttp3.** { *;}-dontwarn okio.**

Glide

-keep public class * implements com.bumptech.glide.module.GlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {   **[] $VALUES;  public *;}

友盟统计

-keepclassmembers class * {   public <init> (org.json.JSONObject);}-keep public class [您的应用包名].R$*{  public static final int *;}-keepclassmembers enum * {  public static **[] values(); public static ** valueOf(java.lang.String);}


文章摘自:

1、https://segmentfault.com/a/1190000004461614

0 0