web-dev-qa-db-ja.com

Android:アクティビティをインスタンス化できません/ ClassNotFoundException

最近、市場にアプリを公開しましたが、一部のユーザーからエラーが表示されるようになりました。おそらく、アプリは起動時にクラッシュします。残念ながら、直接彼に連絡することはできず、アプリはエミュレーターと私の電話(および一部の友人の電話)で正常に動作します。
編集:市場で「開始時のクラッシュ」や「機能しない」などのコメントを受け取ったときに、これは複数のユーザーに起こると思います。このスタックトレースは1つしか受け取りませんでしたが、構成、デバイス、Androidバージョンなどに関する情報はありません。

このアプリはシンプルなサウンドボードなので、魔法はまったく関係ありませんが、一部の携帯電話で失敗する理由はわかりません。ここに私が得ているスタックトレースがあります、私は誰でも私を助けてくれることを願っています:

Java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.app/com.my.app.SoundMachine}: Java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2585)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2679)
at Android.app.ActivityThread.access$2300(ActivityThread.Java:125)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2033)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:123)
at Android.app.ActivityThread.main(ActivityThread.Java:4627)
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:876)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:634)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-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.newActivity(Instrumentation.Java:1021)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2577)
... 11 more

これらは私の活動の最初の数行です。

public class SoundMachine extends Activity {
  private SoundManager mSoundManager;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

編集:これは(ほぼ)完全なonCreateです:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSoundManager = new SoundManager();
    mSoundManager.initSounds(getBaseContext());

    int counter = 0;
    for (Integer soundFile : soundFiles) {
      counter++;
      mSoundManager.addSound(counter, soundFile);
    }

    ImageButton SoundButton1 = (ImageButton) findViewById(R.id.sound1);
    SoundButton1.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.playSound(1);
      }
    });
    SoundButton1.setOnLongClickListener(new OnLongClickListener() {
      public boolean onLongClick(View v) {
        saveSoundChoice(soundFiles[0], soundNames[0]);
        return true;
      }
    });

(...more of this...)

    Button StopButton = (Button) findViewById(R.id.stopbutton);
    StopButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.stopAll();
      }
    });
  }

そしてここに私のマニフェストがあります:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.my.app" Android:installLocation="preferExternal"
    Android:versionCode="9" Android:versionName="1.2">
    <application Android:icon="@drawable/icon" Android:label="@string/app_name">
        <activity Android:name=".SoundMachine" Android:label="@string/app_name"
            Android:screenOrientation="portrait">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-sdk Android:minSdkVersion="3" Android:targetSdkVersion="8" />
</manifest>

したがって、私がここで読んだ可能性のあるすべてのエラーは、一部のフォーラムで私のアプリには適用されません。

  • アクティビティはマニフェストに存在します。
  • スーパーメソッドは、オーバーライドされたメソッドで呼び出されます。
  • ContentViewは、ビュー内の要素にアクセスする前に設定されます。

エラーの原因を特定することは、それを再現することなく特定するのが難しいことを知っていますが、誰かが素晴らしいアイデアを持っており、私を助けることができるかもしれません。

いくつかの質問:

  • マニフェストに「意図」部分が必要ですか?プロジェクトの作成時にEclipseが作成しました。 (はい、メイラによると)
  • スーパーメソッドは、それがどこにあるときに呼び出されるべきですか? (はい、メイラによると)

編集:現在残っている主な質問は次のとおりです。PathClassLoaderのパスがパッケージ名と異なるのはなぜですか? John J Smithが投稿したページは同じ問題を扱っているようですが、そこで適用された修正がわかりません。

ありがとう、Select0r

68
Select0r

ADTはリビジョン22(2013年5月)に更新されているため、Project-> Properties-> Java Build Path- >古いプロジェクトがこの例外を取り除くためにEclipseでOrder and Export...

38
Milan Doubek

Project-> properties-> order and exportを選択してこの問題を解決しました

すべての外部jarファイルを選択します。きれいにしてビルドして問題を解決しました

38
user1219096

同じエラーが発生しました(アクティビティをインスタンス化できません...)Opera Mini。Opera MiniはSDカードにありましたエラーは、昨日SDカードを交換したという事実に関連しているようです。デバイスをシャットダウンし、古いカードからすべてのデータを(cp -aで)新しいカードにコピーしてから、新しいカードを挿入しましたすべて正常に機能しているように見えますが、SDカード上のすべてのアプリが同じエラーでクラッシュすることがわかりました。

  • デバイス:HTC Desire HD(Android 2.2)
  • 古いSDHCカード:SanDisk 8GBクラス4
  • 新しいSDHCカード:Kingston 16GBクラス4

だから、これはAndroidバグであり、アプリ開発者が修正できるものではないということです。

参照: http://Android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html

AndroidデバイスでSDカードを交換する場合、古いカードの内容を新しいカードに物理的にコピーすると、システムは新しいカードのデータを使用します何も変わっていないかのようにカード。これは、SDカードにインストールされたアプリにも当てはまります。」

これは間違っているようです。

20
perja

これは、パッケージ名の1つをリファクタリングし、リファクタリングツールが先頭の「。」を削除したときに起こりました。すべてのアクティビティ名から。 AndroidManifest.xmlで、Android:name = "MyActivity"をAndroid:name = "。MyActivity"に変更する必要がありました

これが誰かを助けることを願って、私はちょうど時間を無駄にしたo

7
Bob

これはOPの質問には当てはまりませんが、それは私のものであり、それを理解するのにかなり時間がかかりました。GoogleMaps APIを使用する場合は、アプリケーションマニフェストにライブラリ宣言を含めたことを確認してください。

例えば:

public class MyActivity extends MapActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

}

AndroidManifest.xml

<application>
    <uses-library Android:name="com.google.Android.maps" />
    <activity Android:name="MyActivity" Android:label="@string/app_name">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
6
Paul Lammertsma

Manifiestファイルの上部で定義されているパッケージを見て、クラスが定義されているパッケージと一致することを確認します。

私の問題は、一致するパッケージ名がなかったことです。

また、「s」が付いた「libs」という名前のフォルダーがあることもわかります。追加したすべてのjarファイルをその中に入れて、ビルドパスに追加します。

4
eliteslayer

私はあなたと同じ問題を抱えていて、何時間も検索した後、私は何か面白いものを発見しました。それをできるだけ明確に公開するようにします。

  • アクティビティを含む「myapp.sound」という名前のパッケージでプロジェクトを作成しました。プログラムは正常に実行されました。
  • 「app.soundapp」という名前のパッケージの名前を変更しても、プログラムは正常に実行されました。

ただし、プログラムのmanifest.xmlファイルには奇妙なことがありました。パッケージの名前は古い「myapp.sound」でした。マニフェストを正しい新しい名前に変更し、その瞬間からエラーが発生しました。理由はわかりませんが、Eclipseの「パッケージ名チェンジャー」がすべての依存関係を更新するわけではないようです。厳密に必要でない場合は、アクティビティを含むパッケージの名前を変更しないでください。たぶん、問題を解決するには、新しいプロジェクトを作成し、その中にすべてのJavaクラスをコピーする必要があります。

4
superpuccio

PathClassLoaderのパスがパッケージ名と異なる理由はわかりませんが、エミュレータでテストするときは、このように強制的に閉じてからもう一度実行してください link

4
John J Smith

アプリを簡単にアップグレードした後、同じエラーメッセージが表示されました。これを行うことで修正しました:

Project->Build automatically OFF
Project->Clean->Selcting my project

次に、署名済みアプリの新しいエクスポートを実行しましたが、うまくいきました。

3
Jbruntt

Bobf Caliと同様に、ベースパッケージの名前を変更して "example"セクションを変更した後、最初にこのエラーが発生しました。修正するには、genおよびbinディレクトリを削除し、プロジェクトをクリーンアップして、再構築する必要がありました。

Eclipseのバージョンに応じてAndroid使用しているプラ​​グイン(存在する場合)、AndroidManifest.xmlのアクティビティ名も更新する必要がある場合があります

3
J M Rossy

Java Android JavaSE-1.7を対象とするプロジェクトのビルドパスにプロジェクトを含めると、この問題に遭遇しました。

何らかの理由で、含まれていたJavaプロジェクトがJavaSE-1.6をターゲットとして最初に作成された場合、エミュレータはクラスを見つけられません。Eclipseは「ビルドパスは実行環境JavaSE 1.6。この環境と完全に互換性のあるJREがワークスペースにインストールされていません。 "しかし、Androidエミュレーターが起動し、classnotfoundexceptionが表示されません

したがって、JavaSE-1.7を対象とするプロジェクトを含める場合は、JavaSE-1.6を対象とするプロジェクトを再作成すると、問題が解決する場合があります。

がんばろう!

3
Mentos

この問題は、アクティビティクラスに1つ以上のパラメーターを持つコンストラクターがある場合にも発生する可能性があります。

3

この問題は、クラスの名前を変更してマニフェストファイルを更新し、マニフェストファイルがエミュレーターで更新されない場合に発生する可能性があります。エミュレータからアプリケーションをアンインストールしてから、再インストールしてください。これは動作します。

3
Balaji

この記事をご覧ください: http://www.androidguys.com/2010/05/22/storing-apps-sd-froyo/ SDカードにアプリを保存する際の制限について説明しています。ユーザーがコンピューターにSDカードをマウントしている場合、SoundMachineクラスが見えなくなる可能性があります。そして、アプリのユーザーIDとファイルの所有権が一致しないようにファイルの所有権を変更する可能性があるため、cpコマンドが失敗するかどうか(perjaの修正の試み).

2
Dave MacLean

/ srcディレクトリがプロジェクト>プロパティ> Javaビルドパス>ソースにリストされていることを確認してください

2
AnnaM

パッケージ名は一意ですか?ユーザーが同じパッケージ名を使用する別のアプリを持っている場合はどうなるかわかりませんが、このような奇妙なエラーが発生する可能性があります。

編集: このページ を見たところ、Androidマーケットからアプリをダウンロードするときにこの問題があったことを覚えています。起動時にアプリがクラッシュしました。何度も何度も同じ結果で終わりましたが、その後、アプリをアンインストールして再インストールしましたが、すべて正常に機能しました。

私のリンクでは、アプリを到達不能(SDのマウント解除)にすることでエラーが再現されていることもわかります。したがって、コードに問題はありません。

2
Dalmas

このエラーは、(プロジェクトレベルで)誤ってImport> Android> Existing Android Eclipse経由でワークスペースにコードを挿入します。私の場合、これは空の「src」フォルダーになりましたが、ルートの「Java」で始まり、パッケージパス(com/zyzcorp/...)に続く新しいフォルダーに気づき、MainActivity.Javaファイルに至りました。

問題を解決できると思ったことをテストするために、com。*。MainActivity.Javaファイルをsrcフォルダーにコピーし、Eclipseを更新、クリーン、および再始動しました。ターゲットデバイスでアプリをビルドして実行できました。

2
Tope Oluwole

私はこれを解決し、原因を突き止めることができました:-マニフェストが破損します。パッケージ構造が正しく、すべてのデータが正しく書き込まれていても、アクティビティは見つかりません。 -Rは、名前を変更する前に最初に宣言されたパッケージ構造になります。 -Rの間違ったパッケージを使用して実行構成がセットアップされているため、アクティビティが見つかりません。

試したこと:-エクスポート/インポートを介して手動でrun-configsを編集する-手動でパッケージ構造の名前を変更する-手動でR-package-structureの名前を変更する-run-configを削除する(アプリを起動しようとすると再構築されます) )

解決策:マニフェストを再利用せずに新しいプロジェクトをセットアップしてください。私はそれを再利用しようとしましたが、同じ問題を繰り返しました。したがって、主な原因は破損したマニフェストでなければなりません。これがお役に立てば幸いです!

2
DublinCore

問題を解決するには遅すぎるかもしれませんが、他の人の助けになることを願っています。
同様の問題が発生したため、何度も試行した後、R.Java.
それはトリックでした。

2
Bbb

いつでもパッケージの名前を変更しましたか?これは通常、作成後にパッケージの名前が変更された場合に発生します。その場合、次のリンクが役立つはずです http://code.google.com/p/Android/issues/detail?id=2824 。そうでない場合は、完全なマニフェストファイルを投稿してください。

1

「bin」と「gen」フォルダーを削除し、プロジェクトを再構築することでこの問題を修正します。

1
Tadas Valaitis

私は自分でこれに問題を抱えていたので、私に問題を引き起こしたものを持ち出したいと思います。拡張APKを設定する新しいライブラリをいくつか追加しました。ライブラリは相互に依存しており、プロパティの1つだけをライブラリに含めていました> Android> libraries。

そのため、ほとんどのユーザーが持っている携帯電話のライブラリがユーザーにない場合に、これが起こる可能性があります。

私のメインアクティビティでClassNotFoundExceptionが表示されたのは、見つからないライブラリにあるクラスを実装しているためです。

1
AC Arcana

5つの異なるパッケージがありました。そして、何らかの理由で、コンパイラは間違ったパッケージのアクティビティを探していました。

そのため、アクティビティと、アクティビティを継承するすべてのクラスを、対象のパッケージに切り替えました。

Logcatの最初に探していたパッケージの名前を取得しました。

1
khadkara

Android Projectからの依存関係->プロパティ-> Javaビルダーパス-> Android依存関係のチェックを外して、同じ問題を解決しました。

1
Imran Khan

最近のAndroidプロジェクトで同じ問題が発生しました。問題は非常に単純であることが判明しましたが、見つけるのは困難でした。これは私に起こりました。パッケージのリファクタリングが行われなかったため、これによりgen /.../ R.Javaファイルとの競合が発生しました。 。classNotFoundException ...

これから学んだ教訓:do ない メインアクティビティを保持するパッケージ名をリファクタリングします!

これがあなたやこのエラーで頭を壊した人に役立つことを願っています!

1
Warkst

私は同じ問題を抱えていますが、これはそれを修正しました。私のandroidmanifest.xmlには、Android:name = myappnameActivityと呼ばれるこの行がありました。クラス名は単にmyappnameでしたが。したがって、私はxmlファイルのアクティビティ部分を外し、すべてがうまくいきました。

1
CodeGeek123

明らかな間違いは見当たりません。私が言えることは、できるだけ多くの異なる構成でテストすることです。

可能なすべてのSDKレベルについてエミュレータでテストし、 さまざまなサイズの画面 でテストするためのガイドラインに従います(ただし、それは問題ではないようです)。

HTC Sense、Motoblurなどの友人がいる場合は、各主要プロバイダーの電話でテストしてみてください。

レポートが1つしか表示されない場合は、そのデバイスで厄介な問題が発生している可能性があります。より多くのデータを追加する他の同様のレポートを取得するかどうかを確認します。

1
Cheryl Simon

BINおよびGENフォルダーファイルを削除します。再構築、すべてが動作するはずです。 「インスタンス化できません」の下に別のエラーがあるかどうかを確認します。別のエラーがこれを起動している場合があります(クラスが見つかった場合でも、アクティビティが原因でロードできません)。

0
sagits

私がしなければならなかったことは、コードをまったく変更せずに、ビルド/エクスポートプロセスをやり直すだけです。それは私のために働いた、私はそれを2回エクスポートすることでした。最初のエクスポートでは、ビルドAPKのファイルサイズは小さく、2番目のエクスポート(コード/構成に変更を加えない)では、わずかに大きなファイルサイズ(約200KBの差分)が生成されました。

このビルドのバグは非常にコストがかかり、マネージャーの前であなたを殺してしまいます。Android/ Eclipseチームによって実際に修正されるはずです。種類の吸い込み

0
patrickjason91