Android 混淆之proguard
proguard 基本语法
// 保留native方法的方法的方法名和包含native方法的类的类名不变
-keepclasseswithmembernames class {
native<methods>;
}
// 保留继承与View的类中的set*和get*方法
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
// 保留继承与Activity的类中以View为参数的方法
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
// 保留实现了Parcelable 接口的类的类名以及实现了 Parcelanle$Creator 的内部类
-keep class * implemenets android.os.Parcelable {
public static final android.os.Parcelanle$Creator *;
}
// 保留 R$*类中静态字段的字段名
-keep class **.R$* {
public static <fields>;
}
也就是
类名不混淆 用keep
方法名不混淆 用keepclassmembers 或者 keepclasseswithmembernames(后者用于native不混淆)
不混淆的情况:
1 jni 调用java方法
2 四大组件
3 R文件
4 某些通过反射调用的类或方法
5 第三jar包(一般情况下不要混淆)
混淆去掉log
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String,int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
assumenosideeffects,proguard 配置文件里的参数。assume no side effects;假定无效;该属性也就是标识无效代码。我们就是通过这个参数来让proguard删除日志代码。