Android 混淆打包
Android Studio和Eclipse虽然是两个不同的工具,混淆的使用虽然不同,但规则相同。
Eclipse混淆
在eclipse中,文件根目录中有如下两个文件projiect.properties
和proguard-project.txt
。
开启混淆打包只需要在projiect.properties
中,被注释的有如下一句话
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
把他注释去掉即可。
Android Studio 开启混淆
在build.gradle中修改minifyEnabled
改为true
即可
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
规则研究
在开启混淆中,eclipse
和androidStudio
中都有一个文件proguard-android.txt
,这是混淆的一个默认文件,该默认文件为android 提供的一个默认规则,如果我们的工程没有引入第三方库等,那么很简单的就能混淆了。
该文件的位置位于sdk\tools\proguard\proguard-android
看一下这个文件的一些配置属性。
-dontusemixedcaseclassnames
:不使用大小写形式的混淆名-dontskipnonpubliclibraryclasses
:不跳过library的非public的类-dontoptimize
:不进行优化,优化可能会在某些手机上无法运行。-dontpreverify
:不净行预校验,该校验是java平台上的,对android没啥用处-keepattributes *Annotation*
:对注解中的参数进行保留-keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService
:不混淆上面两个类,接入google服务中是使用。
-keepclasseswithmembernames class * {
native <methods>;
}
- 不混淆包含native方法的类的类名以及native方法名
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
- 不混淆任何view子类的get和set方法。
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-保留Activity中的返回值为void,传入参数为view的方法。因为在xml中存在的onClick属性
-keepclassmembers enum * {
public static **[] values();