Eclipse导出的APK崩溃问题

3
我需要发布我的应用程序,我运行了Eclipse导出向导并导出了一个带自签名证书的已签名APK文件,我也运行了zipalign工具。问题在于,在设备上安装并运行此软件包时,它会直接崩溃,尽管我可以直接从eclipse运行应用程序而没有任何问题。 这个问题是否与Proguard配置或其他内容有关?! 更新:问题来自于Proguard配置文件,以下是异常的堆栈跟踪信息:
    01-28 17:49:03.510: E/AndroidRuntime(14897): FATAL EXCEPTION: main
    01-28 17:49:03.510: E/AndroidRuntime(14897): java.lang.ExceptionInInitializerError
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at com.actionbarsherlock.app.SherlockActivity.c(Unknown Source)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at com.actionbarsherlock.app.SherlockActivity.onPostCreate(Unknown Source)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1115)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1950)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.os.Handler.dispatchMessage(Handler.java:99)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.os.Looper.loop(Looper.java:137)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at android.app.ActivityThread.main(ActivityThread.java:4511)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at java.lang.reflect.Method.invokeNative(Native Method)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at java.lang.reflect.Method.invoke(Method.java:511)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at dalvik.system.NativeStart.main(Native Method)
    01-28 17:49:03.510: E/AndroidRuntime(14897): Caused by: java.lang.IllegalArgumentException: Class a is not annotated with @Implementation
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at com.actionbarsherlock.a.a(Unknown Source)
    01-28 17:49:03.510: E/AndroidRuntime(14897):    at com.actionbarsherlock.a.<clinit>(Unknown Source)

1
你能贴出堆栈跟踪吗? - Royi
@Royi,我刚刚发布了堆栈跟踪。 - Sohayb Hassoun
8个回答

5
有时候Eclipse会出现故障。 您可以采取以下措施进行解决,通常会有所帮助:
  1. 清理您的项目
  2. 清除您的Eclipse工作台设置
如何确切地执行步骤#2取决于您的操作系统,但在Mac上是这样的:
  1. 进入您的工作区
  2. 打开.metadata(您需要能够看到隐藏的文件夹)
  3. 打开.plugins
  4. 打开org.eclipse.e4.workbench
  5. 删除workbench.xmi
这将清除您的基本工作台设置,其中包括您的视图设置。
在重新进行工作台设置之前,请尝试打包您的应用程序。 通常对我有用。

2
我通过在actionbarsherlock和support库的类和接口中添加-keep解决了这个问题。
    -keep class android.support.v4.app.** { *; }
    -keep interface android.support.v4.app.** { *; }
    -keep class com.actionbarsherlock.** { *; }
    -keep interface com.actionbarsherlock.** { *; }

通过使用“-libraryjars”关键字添加相应的库JAR包

我知道这很老了,但你能添加一下你指定的“-libraryjars”吗? - whitfin

2

1
生成签名APK时,必须排除任何外部JAR文件和库,如下所示。
-libraryjars libs

# The official support library.
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }

# Library JARs.
-keep class de.greenrobot.dao.** { *; }
-keep interface de.greenrobot.dao.** { *; }
-keep class org.joda.** { *; }
-keep interface org.joda.** { *; }
-keep class com.loopj.android.http.** { *; }
-keep interface com.loopj.android.http.** { *; }

# Library projects. 
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }
-keep class com.viewpagerindicator.** { *; }
-keep interface com.viewpagerindicator.** { *; }

1

这在使用eclipse时偶尔会发生。我建议你在上传到应用商店之前,总是先在真实设备上试用apk文件。

问题可以通过清理项目,然后重新导出解决。


好的建议,谢谢。可惜它不太可靠,因为我曾经对发布非正式的冲刺演示版本感到自信,而无需执行邮件-apk-to-self-deinstall-old-install-new-and-run-smoke-test步骤。 - William T. Mallard
@WilliamT.Mallard 我以前会将应用程序上传到我的服务器,然后在Bluestacks上下载并安装它... 幸运的是,我找到了一个更好的替代方案 - Geanymotion。你可以将apk文件拖放到模拟器中。试试看吧。 - Bilbo Baggins

0
也许您没有正确执行zipalign,我不相信eclipse会为您执行此操作。
正确的语法是:
zipalign -v 4 /location/to/eclipse/exported/apk /location/of/where/to/output/aligned/apk

虽然堆栈跟踪也很有用,但是。 - Boardy

0

我相信Eclipse会为您运行zipalign,因此您不需要自己操作。也许可以尝试一下这个方法?

是的,从Eclipse运行时处于调试模式,Proguard被忽略。导出将是一个发布版本,如果在project.properties中配置了Proguard,则可能会生效。


0

取消Proguard优化。不使用Zipalign。测试导出的软件包。如果可以正常运行,那就很好,重新检查Zipalign/Proguard参数。如果不能正常运行,则检查其他问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接