最近、アプリの更新を展開したところ、翌日、ユーザーが Google Play レポート機能を介してクラッシュを報告しました。スタック ダンプは LoadApk() のもので、エラーは Application クラスの読み込みにありました。そのダンプは次のとおりです。
java.lang.RuntimeException: アプリケーション com.goalstate.WordGames.FullBoard.library.FullBoardApplication をインスタンス化できません: java.lang.ClassNotFoundException: パスにクラス "com.goalstate.WordGames.FullBoard.library.FullBoardApplication" が見つかりませんでした: DexPathList [[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] android.app.LoadedApk.makeApplication(LoadedApk.java:516) で android.app.ActivityThread.handleBindApplication(ActivityThread.java:4703) で android .app.ActivityThread.access$1600(ActivityThread.java:175) で android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) で android.os.Handler.dispatchMessage(Handler.java:102) で android.os .Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5602) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) での invoke(Method.java:515) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) での dalvik .system.NativeStart.main(Native Method) 原因: java.lang.ClassNotFoundException: パスにクラス "com.goalstate.WordGames.FullBoard.library.FullBoardApplication" が見つかりませんでした: DexPathList[[],nativeLibraryDirectories=[/vendor /lib、/system/lib]] dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67) で java.lang.ClassLoader.loadClass(ClassLoader.java:497) で java.lang.ClassLoader.loadClass(ClassLoader. java:457) で android.app.Instrumentation.newApplication(Instrumentation.java:981) で android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 詳細run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) 原因: java.lang.ClassNotFoundException: ませんでしたt パスでクラス "com.goalstate.WordGames.FullBoard.library.FullBoardApplication" を見つけます: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java :67) Android で java.lang.ClassLoader.loadClass(ClassLoader.java:497) で Android.app.Instrumentation.newApplication(Instrumentation.java:981) で java.lang.ClassLoader.loadClass(ClassLoader.java:457) で.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 もっと見るrun(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) 原因: java.lang.ClassNotFoundException: ませんでしたt パスでクラス "com.goalstate.WordGames.FullBoard.library.FullBoardApplication" を見つけます: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java :67) Android で java.lang.ClassLoader.loadClass(ClassLoader.java:497) で Android.app.Instrumentation.newApplication(Instrumentation.java:981) で java.lang.ClassLoader.loadClass(ClassLoader.java:457) で.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 もっと見るClassNotFoundException: パスにクラス "com.goalstate.WordGames.FullBoard.library.FullBoardApplication" が見つかりませんでした: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:67) で java.lang.ClassLoader.loadClass(ClassLoader.java:497) で java.lang.ClassLoader.loadClass(ClassLoader.java:457) で android.app.Instrumentation.newApplication(Instrumentation.java: 981) at android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 もっと見るClassNotFoundException: パスにクラス "com.goalstate.WordGames.FullBoard.library.FullBoardApplication" が見つかりませんでした: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:67) で java.lang.ClassLoader.loadClass(ClassLoader.java:497) で java.lang.ClassLoader.loadClass(ClassLoader.java:457) で android.app.Instrumentation.newApplication(Instrumentation.java: 981) at android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 もっと見るClassLoader.loadClass(ClassLoader.java:457) at android.app.Instrumentation.newApplication(Instrumentation.java:981) at android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 もっと見るClassLoader.loadClass(ClassLoader.java:457) at android.app.Instrumentation.newApplication(Instrumentation.java:981) at android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 もっと見る
ライブラリがあり、Application クラスはそのライブラリで定義されています。私のアプリ (ライブラリを使用した) のマニフェストは、そのライブラリ内のクラスをフル パスで参照していました。独自のアプリケーション クラスはありませんでした。
社内で行ったすべてのテストではこの問題は再現されず、同じデバイス (実際には 4.3 を実行するデバイスと 4.4.4 を実行するデバイスの 2 つ) で (Samsung Remote Test Lab を使用して) テストした場合でも、クラッシュが報告されました。 (Galaxy Note II、Android 4.4)、問題ありませんでした。
これに関する情報を検索したところ、デバイスによってクラス参照を解決するアプローチがわずかに異なる可能性があるという事実についての言及が見つかりました。これがおそらく、ほとんどのデバイスが私の APK で問題を起こさなかった理由ですが、この特定のデバイス (私のテストデバイスとは異なります) 、Sprint によってその Android フレーバーが提供されました) でした。同様に、ほとんどの顧客が問題を抱えていなかったのに、自社の顧客の 1% だけが問題を抱えていたのはこのためかもしれません。
最善の方法は、洗練されていないデバイスでも、マニフェスト ファイルから参照されたクラスをできるだけ簡単に見つけられるようにすることであると判断しました。そのため、(ライブラリではなく) アプリ自体のパッケージ内に新しいアプリケーション クラスを定義し、ライブラリ内のアプリケーション クラスからそのクラスを継承させました。それ以外の場合、新しいクラスは空でした。
次に、ライブラリ内のアプリケーション クラスへのフル パス参照を、アプリ自体で作成した新しいクラスへの相対参照に置き換えました。したがって、次の代わりに:
<application android:name="com.goalstate.WordGames.FullBoard.library.FullBoardApplication"
私のマニフェストには、次のものがありました。
<application android:name=".FullBoardWordChumsApplication"
これにより (このトピックに関する民間伝承によると)、あまり洗練されていない解決プロセスが成功しやすくなるはずです。
また、既にローカルなアクティビティ クラスに名前を付けるためにマニフェストで使用していたフル パスを取得し、相対パスにしました (最後のドットの前にあるものをすべて削除するだけです)。
オンラインで見つかった追加の民間伝承によると、Eclipse でプロジェクトの「自動ビルド」をオフにしてから、Eclipse を終了し、Eclipse を再起動してから、再ビルド後に直接 Android ツールに移動して、署名付き APK をエクスポートします (ビルドを自動的にオンにする)。そこで、左肩に塩を投げかけ、断片化パラノイアの神々に祈りを捧げ、APK のリリースを準備する際に、この迷信に順応しました。
これは本当に役に立ちますか?時間が経てばわかりますが、これまでのところ、更新されたリリースで追加のクラッシュは発生していません。