android程序的ProGuard混淆及签名发布

写的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/

本文固定链接: http://www.higis.org/2012/05/15/android-proguard-sign/ | Hi,GIS


该日志由 H.J 于2012年05月15日发表在 程序 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: android程序的ProGuard混淆及签名发布 | Hi,GIS
关键字: , , , ,

android程序的ProGuard混淆及签名发布:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter