当你的jar包需要给第三方开发者使用或者是app要发布的时候,java的混淆技术可以隐藏一定的技术细节。通过适当的配置文件可以把jar包需要开放的接口或者公开API暴露出来,从而不影响正常的使用。
无论是使用eclipse的集成环境还是直接使用proguard命令行进行混淆,都需要一个配置文件,在eclipse中是project根目录下的proguard-project.txt。下边是一个非常简单的例子:
# bring in libs: 如果没有引入android.jar这个库的话会报找不到java.utils.String,java.io.*等错误,这个库的路径可以在eclipse project的Android X.Y.Z里面看到。
# 如果你的项目里还用到了其他第三方jar库也要一样的引入。
-libraryjars "/home/gundam/work/tools/adt-bundle-linux-x86_64-20140702/sdk/platforms/android-10/android.jar"
# these classed may be export to other component in system
# 这些需要与系统中其他组件交互的类也不能混淆,例如你的Activity子类名称都变了的话,安卓就找不到AndroidManifest.xml里面定义好的activity了。
-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
# 对于jar包暴露给用户的工具类,
以及其pubic成员不能进行混淆
-keep public class com.
mywork.demo.Worker
{
public <fields>;
public <methods>;
}
-keep public class com.mywork.
demo.data.MessageParser
{
public <fields>;
public <methods>;
}
# 需要用户实现的接口,以及其pubic成员也不能进行混淆
-keep public interface com.
mywork.
demo.DownloadListener
{
public <fields>;
public <methods>;
}
写好配置文件之后,就可以使用工具进行混淆了。下边先介绍android sdk提供的一个图形化工具:sdk/tools/proguard/bin/proguardgui.sh
第一步,点load configuration把刚才我们写好的配置文件导入,然后next:
第二步,“add input”导入需要转换的jar包,"add output"填上输出的jar包名称(不填的话后续处理之后没有jar包输出),这一步之后,如果你导入的配置文件是非常齐全的,就可以一路next直接到第三步。否则的话,在每次next中都可以适当的修改配置,完成后还可以save当前配置,直至到第三步的界面出现。
第三步,点击process,成功的话如图所示,否则按照错误提示修改配置。建议不要忽略warning信息,否则生成的jar包放到其他project中有可能编译出错。
============================================================================
下边是使用命令行进行proguard的方法,基本命令:
java -jar proguard.jar @myconfig.pro
或者你需要看到详细运行输出的话:
java -jar proguard.jar @myconfig.pro -verbose
这里的myconfig.pro里面写的是混淆时用到的参数文件。
常用的方法是指定injas, outjars指定输入输出,然后用-includes或者@引入带有-keep的单独配置文件。
全部可用参数可以看proguard的文档,在安卓SDK的这个目录下:
/<sdk-dir>/tools/proguard/docs