使用Proguard混淆Android 源代码

使用 ProGuard 混淆 Android 源代码

1. APK文件混淆方法

请参考:

《Android:Develop/Tools/ProGuard》

《Android 2.3 代码混淆proguard技术介绍 》

2. Jar包的混淆方法

我们在做项目的时候会把一些公共的东西打成 Jar 包,让程序去调用。通过反编译工具,别人可以轻松的获取我们 Jar 包的源代码。为了不让别人轻松的获取我们的劳动果实,我们可以使用 ProGuard 对我们的 Jar 包进行混淆。

在你的 Android SDK 目录下找到 tools\proguard\bin 文件夹,下面有三个文件,我们找到 proguardgui 文件,我们通过它来对我们的 Jar 包进行混淆

首先,双击 proguardgui 文件,出现如下对话框

使用Proguard混淆Android 源代码_第1张图片

我们编写我们的配置项

我们先来看一下 Android 标准的 proguard.cfg (android 工程自动生成,路径为 <project_root>/proguard.cfg)配置项

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-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 class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}



我们需要编辑如下

-injars test.jar 
# test.jar 为你要混淆的 jar 包,可以输入路径,没有路径默认为和 proguard 在同一个目录下
-outjars test_out.jar
# test_out.jar 为你混淆后的 jar包,可以输入路径,没有路径默认为和 proguard 在同一个目录下

-libraryjars libs\env.jar
#libs\env.jar 为支持的库包,可能有很多(类似于该语句一句一句的加),这里用一个做演示

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-dontshrink
#不压缩,有时候不设置可能会混淆不通过
-ignorewarnings
#忽略warnings,自己根据需求设置

#这里只说这两个配置项,还有很多配置项,有时间可以去研究
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep class com.test.OpenClass
# 假设 com.test.OpenClass 为我们开放给别人调用的类,我们 keep 它不被混淆,这里做演示
-keep public class com.android.vending.licensing.ILicensingService

-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 class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class com.test.* {
    public <fields>; 
    public <methods>;
    *** set*(***);
    *** get*();
}
#这里我们 keep com.test 包里面所有类的公共 fields 和 methods 以及 set 和 get 方法

#更多的keep 方法可以多加研究
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
保存该文件为 xx.pro,然后 通过 Load Configuration 

使用Proguard混淆Android 源代码_第2张图片

导入,然后一路 Next 直到结束,如果没有成功,就根据提示找出错误,然后修改配置信息,ReStart

2013-4-30 11:47 亲测成功!

参考资料:

《一步步教你用ProGuard混淆Java源代码》

《ProGuard用法》

《ProGuard使用指南》

----------------------------------------------------------------update------------------------------------------------------------------

1.关于配置文件中的 -libraryjars ** 选项,刚开始我test的时候一直在犹豫加还是不加。直到今天出问题了,如果不加的话会出现这样的情况:

一些 @Override 方法的方法名也会被混淆,这样有可能在执行的过程中找不到某些回调的方法,就会出现错误,所以,以后还是要加这个东西。

2013-05-13

你可能感兴趣的:(ProGuard,代码混淆)