Android的代码混淆(ProGuard)

时间:2021-07-28 04:38:32
ProGuard(Program Guard)是一个Java代码混淆的工具。
在2.3版本以前只能通过手动添加ProGuard来实现代码混淆。

在2.3版本以上的sdk中,我们可以看到在android-sdk-windows/tools/下面多了一个proguard文件夹,

google已经把proguard技术放在了android sdk里面,可以通过正常的编译方式也能实现代码混淆了。
新建Android工程时,在其根目录下,会自动生成两个文件:proguard-project.txt和project.properties;

其中proguard-project.txt即为ProGuard配置文件,如果要使其生效,可以在project.properties最后添加一句:

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-19
android.library=false
proguard.config=proguard-project.txt
ProGuard配置文件的编写,可以查看其官方手册(点击打开链接),其下的Manual -> Usage里有详细说明。
如下为我在用的一个配置,我加了些注释,方面大家的阅读。

# 优化的遍数,遍数越多,优化的越厉害;默认优化1遍;
-optimizationpasses 5
# 不要忽略lib库中的非公开类;4.5以后,这是默认设置;
-dontskipnonpubliclibraryclasses
# 不进行预先校验;Android不需要,指定它可节省时间;
-dontpreverify
# 不压缩;默认是进行压缩的;
#-dontshrink
# 不警告;不警告可能很危险;
#-dontwarn
# 处理过程中,输出详细信息
-verbose
# 指定优化项;
-optimizations !class/*,!field/*,!method/*,!code/*
# 保留如下类;不被删除或重命名;
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Service
-keep public class * extends android.app.Application
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.content.BroadcastReceiver
-keep public class com.android.vending.licensing.ILicensingService
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留如下属性;
-keepattributes *Annotation*
# 保留如下类和成员名称;不被重命名;
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留如下类和成员;不被删除或重命名;
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保留如下类的成员;不被删除或重命名;
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# 假定无影响;
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
}