给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
本人具有8年android开发经验,android技术支持、培训和小项目开发,联系qq:1157464105,价格保证最优惠