每次我尝试导出已签名的apk时,ADT都会排除一堆类

时间:2014-01-14 20:57:19

标签: android eclipse adt

最近,每当我尝试使用Eclipse中的导出向导为我的应用程序导出已签名的apk时,ADT就会从签名的apk中排除一堆类。

我可以毫无问题地构建和调试应用程序,并且 unsigned apk在我的Android设备上运行没有问题,但是如果我安装了已签名的apk,应用程序会在打开后立即崩溃,给我一个java.lang.ClassNotFoundException。

我解压缩了apk然后使用dex2jar将classes.dex文件转换为jar文件。

unzip my_app.apk
./d2j-dex2jar.sh classes.dex

检查jar文件的内容(我使用JD-GUI)显示它确实缺少一堆类。但他们为什么失踪? Eclipse在导出过程中没有给我任何错误...如何创建一个可以工作的签名apk?

3 个答案:

答案 0 :(得分:3)

导出已签名的应用程序时,构建系统将运行ProGuard。这将消除ProGuard认为未使用的所有类,方法和字段。请查看您的proguard-project.txt文件,了解有关如何修改ProGuard设置的说明,以保留可能丢弃的内容。

如果您发布有关已删除类的详细信息(具体来说,它们在代码中的使用方式),我们可以提供有关要更改的设置的具体指导。

答案 1 :(得分:1)

目前,我通过避免Eclipse中的导出向导并手动签名/对齐(instructions on android.com)解决了这个问题。

那些不喜欢阅读长篇指令的人的步骤:

  1. 导出未签名的apk(右键单击您的项目并选择 Android工具>导出未签名的应用程序包
  2. 使用jarsigner签名应用程序:

      

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore /path/to/same/keystore/used/by/export/wizard.keystore my_app.apk key_alias

    (key_alias与导出向导提示的别名相同)

  3. 对齐包裹:

      

    zipalign -v 4 your_project_name-unaligned.apk   your_project_name-aligned.apk

  4. 我仍然很想知道导出向导出了什么问题,以及如何让它再次运行。

答案 2 :(得分:0)

您使用的是ProGuard吗?如果是这样,请尝试禁用它并再次导出已签名的应用。 也许您的ProGuard配置已损坏。