转载于:http://www.higis.org/2012/05/15/android-proguard-sign/
写的android应用想提交审核,提交前就得开始准备发布了,要不然不签名别人可装不上,另也需考虑proguard进行混淆,减小文件大小。Eclipse上默认android sdk已提供关于签名的工具,在项目上右键,android tools->Export Signed Application Package….,后续的就是建立密匙并导出了,签名过程还是挺简单的,一路按照操作下去就可以,这里主要记录下关于ProGuard混淆的几个注意问题。
需要进行ProGuard混淆需要进行几个步骤:
(1)project.properties中添加:
proguard.config=proguard.cfg
(2) 在proguard.cfg中进行设置(默认已经生成该文件,有需要的时候需要进行添加相关规则设置)
(3)通过android tools进行签名导出
碰到几个问题,记录下:
1、关于第三方jar包不混淆
(1)添加-libraryjars 标签,代表为第三方jar包。如:-libraryjars lib/wmqtt.jar
(2)添加-keep标签,将第三方包里面的类设置为不混淆,如:-keep class com.ibm.**{*;}
(3) 当在导出时,发现很多could not reference class之类的warning问题,如果确认实际系统运行和那些引用没有什么问题的话,可以添加-dontwarn 标签,就将不再提示后续包的warning.如:-dontwarn org.apache.**
(4)尽量不要写全部忽视所有warn的那个标签,这样可以自己根据console输出的信息再调整。
2、关于webview中注册JavaScriptInterface调用java类中方法时需要不混淆
在混淆后,放到机器中跑,发现webview中的方法一直无法调用,通过反编译,发现java类中的方法已经被混淆。如调用方法如下:
String load=
"javascript:window.JSMethod.getPin('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>')"
;
|
实际上getPin方法已经被混淆成a,或之类的了。所以需要将该方法进行设置-keep.另如果写成这样:
-keep class yourpack.JavaScriptInterface
|
这样也是不行的,里面的方法还是会被混淆掉, 需要详细指定对应的方法名称及参数,需注意是全路径名称。
-keep class yourpack.JavaScriptInterface{
public void getPin(java.lang.String);
}
|
这样再签名导出后,通过反编译,我们可以看到该类中的这个方法就没有被混淆掉,而里面其它的变量之类的就已经被混淆了。
更加详细的proguard文档可以去官网查看。http://proguard.sourceforge.net/