0

私のAndroidアプリケーションは、Coolリーダーのカスタマイズバージョンです。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を削除するとクラッシュが解消されるため、次の2つのオプションがあります。

  1. ProGuardを無効にする
  2. ProGuardに、(誤って)削除しているクラス/メソッド/変数を保持するように指示します。

試してみる1つのことは、ProGuard構成に次のルールを追加することです。

-keepclasseswithmembers class * {
    native <methods>;
}

これにより、ProGuardはネイティブコードを持つものをすべて保持するようになります。問題が、ProGuardがJavaから呼び出されないネイティブメソッドを削除していることである場合、これで問題が解決するはずです。

もう1つの問題は、ProGuardがネイティブコードからのみ呼び出されるJavaコールバックメソッドを削除していることです。最初に標準の命名パターン(たとえば<something>Callback)を使用してすべてに名前を付け、次に次のルールを追加することで、これらすべてを保持できます。

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

問題がクラス変数の削除にある場合は、それらを明示的に列挙する必要があります。

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

ProGuardの実行時に生成されるusage.txtファイルを調べることで、ProGuardが誤って削除している可能性のあるものに関する他の手がかりを見つけることができる場合があります。

于 2012-07-18T15:50:49.580 に答える