0

我的安卓应用是酷阅读器的定制版。当我从 Eclipse 运行应用程序或在手机上调试它时,它运行良好。但是当我签名、导出、安装并从手机运行它时,它崩溃了。

在 logcat 中,我在应用程序崩溃之前看到以下内容:

07-17 21:40:40.371: D/Zygote(1218): Process 3136 terminated by signal (11)
07-17 21:40:40.371: E/InputDispatcher(1331): channel '40b7d8a8 com.myCustomApp/org.coolreader.CoolReader (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
07-17 21:40:40.371: E/InputDispatcher(1331): channel '40b7d8a8 com.myCustomApp/org.coolreader.CoolReader (server)' ~ Channel is unrecoverably broken and will be disposed!
07-17 21:40:40.451: D/dalvikvm(1331): GC_FOR_MALLOC freed 758K, 35% free 9419K/14279K, external 2060K/2410K, paused 85ms
07-17 21:40:40.451: I/WindowManager(1331): WIN DEATH: Window{40b7d8a8 com.myCustomApp/org.coolreader.CoolReader paused=false}
07-17 21:40:40.451: I/ActivityManager(1331): Process com.myCustomApp (pid 3136) has died.
07-17 21:40:40.471: E/ActivityManager(1331): fail to set top app changed!

更新: 如果您不了解 CoolReader(我正在使用的开源项目),它是 jni 代码,具有 proGuard 配置,并使用 ndk。它也有普通的 Java 代码。我对 jni/ndk 或任何低级 c\c++ 代码没有太多经验,所以我不确定我能在那里做什么。

但同样,最重要的是它从 Eclipse 运行时运行良好,但导出的版本会自行关闭。

4

1 回答 1

5

由于删除 ProGuard 可以清除崩溃,因此有两种选择:

  1. 禁用 ProGuard
  2. 告诉 ProGuard 保留它正在(错误地)消除的类/方法/变量。

要尝试的一件事是将以下规则添加到您的 ProGuard 配置中:

-keepclasseswithmembers class * {
    native <methods>;
}

这将告诉 ProGuard 保留任何具有本机代码的内容。如果问题是 ProGuard 正在删除碰巧不是从 Java 调用的本机方法,那么这应该可以解决问题。

另一个问题可能是 ProGuard 正在删除仅从本机代码调用的 Java 回调方法。您可以通过首先使用标准命名模式(例如,<something>Callback)将它们全部命名,然后添加以下规则来保留所有这些:

-keepclasseswithmembers class * {
    *** *Callback(...);
}

如果问题是类变量被删除,你将不得不明确列举这些:

-keep class com.example.MyClass {
    *** aFieldName;
}

通过检查 ProGuard 在运行时生成的 usage.txt 文件,您可以找到有关 ProGuard 可能错误删除的其他线索。

于 2012-07-18T15:50:49.580 回答