上一篇介绍了Google官方的一些解释,这一篇主要介绍如何实战(Eclipse开发)使用Googel提供的这个工具.如对代码混淆的概念不是很了解的建议先看上一篇--Android日志:代码混淆,官方文档介绍-----来自Google最新文档
主要先简单的介绍三个主要文件,在sdk下的proguard里面: 我的SDK路径为H:\Android\android-sdk-windows\tools\proguard
proguard-android.txt//系统配置好一些默认选项,考虑的比较详细,最好不要修改
proguard-android-optimize.txt//系统配置好一些默认选项,考虑的比较详细,最好不要修改
proguard-project.txt//加入一些保持,或者说不希望被混淆的包、类或者方法等
如何使用:
每一个Eclipse项目生成都会生成两个文件,如果要混淆必须配置这两个:
proguard-project.txt
project.properties
里面的英文介绍就不多少了,直接操作
步骤一:打开project.properties
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard- project.txt
去掉这一句前面的#,就相当于一个开关,告诉编译器,我要混淆.如果没有用到以下内容,就可以直接打包.系统会自动帮你混淆.但是大部分程序都用到了第三方包,所以我们的自己配置 proguard-project.txt这个文件.请看步骤二.
注意: 只有在生成release版本的apk时,混淆配置才会起作用,debug版本的apk不会进行混淆。
需要自己配置的包括:
-
-
- 只在 AndroidManifest.xml 引用的类
- 从JNI调用的方法
- 动态引用的字段和方法
- 第三方包
-
默认的proguard.cfg
文件试图掩盖一般情况下,但你可能会遇到的异常,如ClassNotFoundException的
,这发生在ProGuard的除掉整个类,你的应用程序调用。
步骤二:配置proguard-project.txt,加入需要保持的.jar包和以上需要配置的内容
# Add any project specific keep options here:
在这一句话下面,添加配置内容
# If your project uses WebView with JS, uncomment the following
如果用到WebView with JS,打开一下五个#
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
步骤三:在步骤二中添加配置内容的地方,手动天骄配置,一般以"keep"开头.
添加第三方依赖包
例如:添加android-support-v4.jar依赖包
-libraryjars
libs/android-support-v4.jar
-dontwarn
android.support.v4.**{*;}
-keep
class
android.support.v4.**{*;}
-keep
interface
android.support.v4.**{*;}
不混淆某个类的子类,某个接口的实现
例如:不混淆com.example.Test类的子类
-keep
public
class
*
extends
com.example.Test
例如:不混淆com.example.TestInterface的实现
-keep
class
* implementscom.example.TestInterface {
public
static
final
com.example.TestInterface$Creator *;
}
不混淆某个类的特定的函数
-keepclassmembers
class
com.example.Test {
public
void
setTestString(java.lang.String);
}
不混淆某个包所有的类或指定的类
例如,不混淆package com.example下的所有类/接口
-keep
class
com.example.** { * ; }
例如,不混淆com.example.Test类:
-keep
class
com.example.Test { * ; }
如果希望不混淆某个接口,则把上述命令中的class替换为interface即可。
不混淆某个类的构造函数
例如:不混淆Test类的构造函数:
-keepclassmembers
class
com.example.Test {
public
<init>(
int
,
int
);
}
自己在混淆时遇到的问题解决方法(有点困了,就不多写了):
1.尽量不要去混淆实体Modle
2.用到反射的类和方法不要混淆
3.可以运用反编译检查混淆结果,也可以发现问题