在project.properties文件中有这样一段话:
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
把#号去掉,打开文件,在sdk根目录中找到proguard-android.txt文件拷贝到工程根目录上。
把上面那段话缩减成:
proguard.config=proguard-android.txt
这样混淆配置就完成了。
如果工程中有第三方jar包(如有米,友盟之类的),混淆后生成apk会报错,因为它们已经混淆过了。需要在proguard-android.txt中加入以下信息。
-dontwarn net.youmi.android.** //不要警告我和有米相关的一些信息, .**表示后面是一个包
-dontwarn net.youmi.android.*.* //*.*表示是所有的包
-keep class net.youmi.android.**{ //保留有米相关的class
*;
}
混淆时,什么报错,就把什么保存下来。
打包apk后,在工程目录的proguard目录中有混淆的配置信息
在mapping.txt中,一看就明白。因为混淆后会把方法明变短,所以apk体积会变小。
四大组件不会被混淆(在清单文件AndroidManifest.xml中出现的不会被混淆)。
注意:混淆成功后的 apk不一定能用。
如果项目里有一些特殊逻辑,可能会出问题。比如代码里用到了反射数据库的逻辑,根据业务bean反射数据库,因为混淆后bean里的字段会改变,
则业务bean不能被混淆。
Android下的默认混淆配置文件:proguard-android.txt
-dontusemixedcaseclassnames //不要使用混合大小写的类名
java严格区分大小写,windows下不区分
-dontskipnonpubliclibraryclasses //不要跳过非公有的函数库里的字节码
-verbose //混淆后打印日志输出,proguard里的四个文件就用这个控件的
mapping.txt是混淆排错的依据。很重要,不要弄丢,更不要泄露。
-dontoptimize
-dontpreverify
对混淆代码的优化,如果不加,就会把相同的静态字符串合并,或者删除工程中没有用到的方法。但工程中有的方法是回调函数,不应该被删除。
所以默认用这两句话。
-keepattributes *Annotation* //保留代码中的注解
如果没有,工程可能会出错。比如用了xUtils的注解获取id,如果去掉,会出错。
-keepclasseswithmembernames class * {
native <methods>;
} //保留jni的native方法映射
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}//保留枚举类型
-keepclassmembers class **.R$* {
public static <fields>;
}//保留进程间通信的.R文件
以上的文件都不用改。根据项目需要在后面加东西,比如bean文件 MobileInfo 需要保留,则在后面写上
-keep class com.haha.bean.MobileInfo // -keep class 全类名
要保留jar包则参照
-dontwarn net.youmi.android.** //不要警告我和有米相关的一些信息, .**表示后面是一个包
-dontwarn net.youmi.android.*.* //*.*表示是所有的包
-keep class net.youmi.android.**{ //保留有米相关的class
*;
}