Android鬼点子-代码混淆


       给App打包真是一个愉快又痛苦的过程,其中代码混淆就是痛中之痛啊,特别是各种依赖很多的时候,加之Android Studio 2.0之后,各种检查更加严格。这篇就是我的入坑指南。

1、开启混淆

       eclipse

在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:

target=android-8
proguard.config=proguard.cfg

Eclipse会通过此配置在工程目录生成proguard.cfg文件,集成的ADT现在创建一个新的Android工程时,在工程目录的根路径下、会有一个proguard-project.txt。其实这个文件跟proguard.cfg是一样的。

       AndroidStudio

buildTypes {
       release {
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
       }
   }

proguard-rules.pro是As中配置混淆规则的文件,这里有个要注意的地方。minifyEnabled代表是否开启混淆,如果是关闭混淆就设置成false,还要把下面的getDefaultProguardFile这一行删掉,才会关闭混淆。

2、混淆规则

proguard-rules.pro文件中则定义了项目的混淆选项,定义如下:

#指定代码的压缩级别
-optimizationpasses 5

#包明不混合大小写
-dontusemixedcaseclassnames

#不去忽略非公共的库类
-dontskipnonpubliclibraryclasses

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

 #预校验
-dontpreverify

 #混淆时是否记录日志
-verbose

 # 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

 #保护注解
-keepattributes *Annotation*

 #保护异常,内部类等
-keepattributes Exceptions,InnerClasses,Signature  
-keepattributes SourceFile,LineNumberTable 

 #保持哪些类不被混淆
-keep public class * extends android.app.Fragment

 #忽略警告
-ignorewarning

 #忽略单独警告
-dontwarn in.srain.cube.**

 #保护固定包结构下面的类及接口  
-keep class in.srain.cube.** { *; }
-keep interface android.support.v4.** { *; } 

 #保护某些类中的某些方法
-keepclassmembers class * extends android.app.Activity {   
    public void *(android.view.View);  
}

-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

3、判断是否需要混淆

       混淆可以一定程度上保护代码,防止被阅读,但是不会防止被反编译。可以减小APK的大小。混淆主要是把类名,方法明,变量名使用一些没有语义的字母进行替换(字符串变量的内容是不会被混淆的)。一般情况下,JNI,或者使用反射的地方不可以被混淆(使用到类名,方法名),GSON的序列化与反序列化,枚举,Constants等。如果使用的第三方的依赖已经被混淆过,就不可以再被混淆。

       使用EventBus,有Subscriber的类。使用butterknife,用到注解的地方。Rxjava和Retrofit相关要保护 rx.** 包下面的类。

4、打包APP时遇到的坑

①遇到下面的问题,说明上面有很多的警告。只要使用 -ignorewarning 或者-dontwarn in.srain.cube.**来忽略警告就可以了。

 Error:Execution failed for task :transformClassesAndResourcesWithProguardForRelease'.
> java.io.IOException: Please correct the above warnings first.

②下面的错误很有可能是重复依赖造成的,只要去掉重复的依赖就可以了。如何去掉?这里挖个坑,下一篇中会主要记录一下第三方依赖的那些事。

Error: Can't write [xxxx/xxxx.jar] (Can't read [xxxx/\libs\xxxx.jar] (Duplicate zip entry [umeng_sdk.jar:com/umeng/analytics/a.class]))

③代码混淆后,出现下面的异常,说明有些不能被混淆的参数被混淆了,只要在混淆规则中加上这些的保护就可以了。类似的还有NoSuchFiledException或者NoSuchMethodException等。

java.lang.RuntimeException: Missing type parameter
文章目录
|