28

Androidマーケットでホストされているアプリケーションに取り組んでいます。ときどき (月に 1 回) クラッシュ レポートを受け取りました。

アプリケーション java.lang.ClassNotFoundException をインスタンス化できません

アプリのダウンロード数は 10,000 ~ 50,000 です。一部のデバイスでこの例外が発生する理由がわかりません(3つの異なるデバイスでテストしましたが、最後に再現できませんでした)。

この問題に関するさまざまな Android フォーラムの記事や提案を読みましたが、解決できませんでした。誰かが同様の問題に直面していて、どうすればよいか教えてくれますか?

注: このようにアプリケーションクラスを拡張しています

public class MyApplication extends Application {

}

このようにmanifest.xmlに登録します

<application android:icon="@drawable/app_icon"
    android:label="@string/my_app_name" android:name="MyApplication">

スタックトレース :

java.lang.RuntimeException: Unable to instantiate application  com.xyz.MyApplication      java.lang.ClassNotFoundException: com.xyz.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.xyz-1/pkg.apk]
at android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:650)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4238)
at android.app.ActivityThread.access$3000(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2076)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4633)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.xyz.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.xyz-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
at android.app.Instrumentation.newApplication(Instrumentation.java:942)
at android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:645)

一部のデバイスでアプリケーションがクラッシュする理由はわかりません。

4

4 に答える 4

11

他のいくつかの同様の質問は、これがユーザーエラーである可能性があることを示しています。「/mnt/asec/...」は、アプリがSDカードから実行されていることを示します。SDカードを削除すると、このエラーが発生する可能性があります。サードパーティのアプリまたはルート化されたデバイスは、マニフェストで許可されていない場合でも、アプリをSDカードに移動できる可能性があります。

同様の質問

于 2013-01-18T08:21:56.720 に答える
6

問題は、10 の異なる場所で使用した getApplication() にあると思います。したがって、これを解決するためにシングルトンパターンを使用しました。

public class MyApplication extends Application {
    private static MyApplication me;

    @Override
    public void onCreate() {        
        super.onCreate();
        me = this ;

    }
    public static MyApplication getInstance() {
         return me;
    }
}

今、私はこのように getApplication() を使用しました

     MyApplication application = MyApplication.getInstance();

の代わりに

     MyApplication application = (MyApplication) getApplication();

修正済みバージョンを市場にアップロードしましたが、この種のクラッシュがもうないかどうかを待っています. すべてが完璧であれば (2 週間以内にクラッシュしなければ)、質問を閉じます。それまでの間、誰かがより良いアイデアを持っているか、解決策を知っている場合は、共有してください。
ありがとう、

于 2012-04-27T06:32:00.437 に答える
1

私の場合、Eclipse ADT でコンパイルして署名していましたが ([ファイル] > [エクスポート] > [Android アプリケーションのエクスポート...] を使用)、.apk を逆コンパイルするといくつかのクラスが失われました。それを解決するために、「署名されていない APK のエクスポート」を使用し、jarsigner と zipalign を使用して署名します。

于 2014-02-12T12:14:25.203 に答える
0
 android:name=".MyApplication"

フルパッケージの追加も検討してください

于 2012-04-25T07:53:57.177 に答える