http://blog.163.com/android_robot/blog/static/211625311201282181832687/
http://blog.163.com/android_robot/blog/static/211625311201282181832687/
http://blog.163.com/android_robot/blog/static/211625311201282181832687/
http://blog.163.com/android_robot/blog/static/211625311201282181832687/
Android 编程下引入第三方jar包进行代码混淆时的问题解决
2012-09-21 20:26:26| 分类: 错误收集 | 标签:问题 |举报|字号 订阅
许多安卓开发者在完成 Android 项目后,启用代码混淆功能并且尝试导出签名的 APK 安装包时经常会遇到 "Proguard returned with error code 1. See console" 的弹窗提示,如下图所示:
同时在查看控制台的时候也会发现 “You may need to specify additional library jars (using '-libraryjars').” 的报错提示,如下图所示:
出现此错误提示是因为使用了 Proguard 代码混淆器,同时在项目中引用了第三方 jar 包,但却没有在 Proguard 的配置文件中标明引用了的 jar 包所致。解决方法如下:
- 在项目的目录下找到 proguard-project.txt 文件,将其打开后在任一空行中使用 -libraryjars 标明所有引用的第三方 jar 包。如下图所示:
- 然后在 project.properties 文件的空白行加入 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 即可进行代码混淆的文件导出,配置信息如下图所示:
【注意】使用
-libraryjars 标明引用的第三方 jar 包时需要填写正确的相对路径,如果按照形如 (
-libraryjars activation.jar)的格式进行标明,则控制台中会报类似如下的错误:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[2012-09-21 20:51:06 - SMSReceiver] Proguard returned with error code 1. See console
[2012-09-21 20:51:06 - SMSReceiver] java.io.IOException: Can't read [D:\workspace\SMSReceiver\activation.jar] (No such file or directory)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.InputReader.readInput(InputReader.java:230)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.InputReader.readInput(InputReader.java:200)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.InputReader.readInput(InputReader.java:178)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.InputReader.execute(InputReader.java:100)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.ProGuard.readInput(ProGuard.java:196)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.ProGuard.execute(ProGuard.java:78)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.ProGuard.main(ProGuard.java:492)
[2012-09-21 20:51:06 - SMSReceiver] Caused by: java.io.IOException: No such file or directory
[2012-09-21 20:51:06 - SMSReceiver] at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:50)
[2012-09-21 20:51:06 - SMSReceiver] at proguard.InputReader.readInput(InputReader.java:226)
[2012-09-21 20:51:06 - SMSReceiver] ... 6 more
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
仔细看这里的报错
Can't read [D:\workspace\SMSReceiver\activation.jar] ,从这句报错中我们可以发现进行代码混淆的过程中程序会去D:\workspace\SMSReceiver\ 目录
下寻找名为 activation.jar
的第三方 jar 包,但是这些第三方 jar 包的真实路径却是在我们自己在将 jar 包引入的过程中新建的 lib 目录中,也就是说,我们在标明第三方 jar 包的时候需要在包名前添加 lib 目录,这样程序才能找到相应的资源。第三方 jar 包真实路径如下图所示:
按照解决方法进行操作后即可将混淆后的 APK 文件进行导出,以下截图是将导出的 APK 文件反编译后看到的代码混淆效果: