Android应用程序在导出时崩溃

时间:2012-07-18 04:46:11

标签: android android-ndk apk

我的Android应用程序是酷读者的自定义版本。当我从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运行时工作正常,但导出的版本自行关闭。

1 个答案:

答案 0 :(得分:5)

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

  1. 禁用ProGuard
  2. 告诉ProGuard保留它(错误地)消除的类/方法/变量。
  3. 要尝试的一件事是将以下规则添加到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错误删除的其他线索。