AndroidアクティビティClassNotFoundException-すべてを試しました


82

アプリをフレームワークライブラリとアプリケーションにリファクタリングしましたが、エミュレーターでアプリを起動しようとすると、次のエラースタックトレースが表示されます。

06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main
06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Looper.loop(Looper.java:123)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invokeNative(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invoke(Method.java:521)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.NativeStart.main(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
06-02 18:22:35.529: E/AndroidRuntime(586):  ... 11 more

通常、これはマニフェストファイルが何らかの形で間違っていることを意味しますが、私は考えられるすべてを再確認しました。

これが私のアクティビティクラスです:

package com.matthewrathbone.eastersays;

import android.os.Bundle;

import com.rathboma.simonsays.Assets.Season;
import com.rathboma.simonsays.SeasonPicker;
import com.rathboma.simonsays.SimonSaysActivity;

    public class EasterSimonSaysActivity extends SimonSaysActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      }

      @Override
      protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
      }

      @Override
      public SeasonPicker getSeasonPicker() {
       return new SeasonPicker(){
        @Override
        public Season getSeason() {
          // TODO Auto-generated method stub
          return Season.EASTER;
        }
       };
      }
    }

ご覧のとおり、マニフェストに正しくリストされています。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.matthewrathbone.eastersays"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".EasterSimonSaysActivity"
            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>

</manifest>

これを修正する方法がわかりません。助けていただければ幸いです。私は、この特定の動作を見ることなく、SOに関する多くの同様の質問をスキャンしました。

より詳しい情報:

  • 生成されたAPKの内部を確認しましたが、クラスのclasses.dexファイルにエントリがあります
  • Eclipseでプロジェクトをクリーニング/ビルドしてみました
  • APKのコピーがまだ含まれていないまったく新しいデバイスイメージを使用してみました
  • ライブラリプロジェクトを通常のJavaに変更してから、Androidプロジェクトに戻しましたが、違いはありません。
  • 抽象SimonSaysActivityをマニフェストに追加しても違いはありません。
  • 私はすべての依存関係をAndroidライブラリプロジェクトにしてみましたが、必要なAndroidバージョンを同期しましたが、役に立ちませんでした

解決策を見つけました(以下を参照)。回答/コメントを投稿したすべての人に:問題を解決するのを手伝ってくれてありがとう!

これはSDKツールのアップグレードによって導入されたようです。このリンクのコメントにある以下の@Nickに感謝します:http://iqadd.com/item/noclassdeffounderror-adt-fix


1
あなたの活動は図書館またはアプリケーションにありますか?
Jeshurun 2012年

それはアプリケーションにあります。これは、ライブラリプロジェクトの基本アクティビティを拡張します。
Matthew Rathbone 2012年

antまたはADTでビルドしますか?dexファイルにはライブラリクラスが含まれていないようです。
Tomasz Gawel 2012年

このエラーは、アクティビティの場所がcom.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivityであることを意味します-明らかに正しくありません。ライブラリに存在しないプロジェクトパッケージにパッケージレベルを追加してみてください(例:... eastersays.myapp.EasterSimonSaysActivity)。マニフェストのパッケージとしてcom.matthewrathbone.eastersays.myappを指定します。ただし、マニフェスト内のプロジェクトパスをライブラリフレームワークパスと区別するために、ライブラリに「myapp」レベルを追加しないでください。
Gunnar Karlsson 2012年

1
iqadd.com/item/noclassdeffounderror-adt-fix:リンクが壊れています:/

回答:


148

私は自分のプロジェクトでしばらく遊んでいましたが、メインプロジェクトを実行しようとすると、問題を再現してまったく同じ例外スタックトレースを取得できるので、これが原因である可能性があります。

私が思ったのと同じように、AndroidメインプロジェクトでAndroidライブラリプロジェクトを参照する方法、つまり単純なEclipse構成設定がすべてです。

間違った方法:
メインプロジェクトを右クリックし、を選択しますProperties -> Java Build Path -> Projects -> Add...。これにより、AndroidライブラリプロジェクトがAndroidメインプロジェクトのビルドパスの依存関係プロジェクトとして追加されます。これは機能しません。必要なAndroid関連のリソースがすべてメインプロジェクトで定義されている場合、コンパイル時にエラーは発生しませんが、アプリケーションを実行すると、質問で説明されている例外が発生します。

正しい方法:
メインプロジェクトを右クリックし、[Properties -> Androidライブラリ]セクションで、Androidライブラリプロジェクトをここに追加します。ライブラリプロジェクトを参照する公式開発ガイドをご覧ください。これですべての問題が解決するはずです。また、ライブラリプロジェクト-開発の考慮事項に記載されているように、実際のAndroidライブラリプロジェクトを参照する相対パスを使用する必要があることにも注意してください。

お役に立てれば。


1
あなたは私の友達は天才です。これについて興味深いのは、私が常に1つのライブラリを「間違った方法で」含めていて、それが機能したことです。したがって、2つのライブラリにリファクタリングしたとき、それは私が別の方法で行ったことだと思いました。あなたは私に何時間もの仕事を節約してくれました。
Matthew Rathbone 2012年

面白いことに、以前は機能していましたが、SDKツールをアップグレードすると動作が変わったと思います。それは非常に明白ではありませんでした。
Matthew Rathbone 2012年

3
はい、SDKツールを> ADT 17に更新すると、現在のADTバージョンがライブラリを処理する方法が変更されたため、このエラーが発生します。チェックアウト:iqadd.com/item/noclassdeffounderror-adt-fix
Nick

2
ADT 22に更新すると、同様の問題が発生しました:stackoverflow.com/questions/16596969/…–
Niels

7
誰かがどこで見つけることができるか教えてくれませんかProperties?どこにも見つからないようです。
jlively 2017

8

私はあなたが与えたコードをテストしました、そしてそれはうまく働きます。「extendsSimonSaysActivity」を単に「extendsActivity」に変更してみて、それが機能することを自分で確認してください。

それが機能しない理由は、SimonSaysActivityがActivityを拡張しないか(これはあなたがこの間違いを犯したとは思わない)、またはビルドパスの順序が間違っているためです。

ビルドパスの順序に移動するには、次の場所に移動します。

project->properties->Java build path->order and export .

私の基本的な順序は次のとおりです:project src、project gen、android 4.0.3、androidの依存関係。

この問題は通常、ライブラリを使用するときに発生します。


つまり、アクティビティを直接拡張すると機能します。私のビルド順序はあなたのものと一致するので、そのように修正する方法を見つけることができません。他のアイデアはありますか?
Matthew Rathbone 2012年

それは本当に奇妙です。SDK&adtを更新してみてください。また、アプリが使用するライブラリプロジェクト(またはjarファイル、あるいはその両方)が複数あるかどうかを教えてください。もしそうなら、ビルドパスの順序で少し遊んでみてください(私は前にライブラリを配置しようとします)。さらに、別の質問があります。「アクティビティ」というクラスを作成しましたか。Androidの代わりに拡張したのでしょうか。
Androidデベロッパー

2つのライブラリプロジェクトがあり、2番目(エンジン)はsimonSaysとandroidプロジェクトの両方に依存しています。SimonSaysからエンジンプロジェクトをエクスポートして、ビルド順序のすべての組み合わせを試しました。あなたの質問への答え:私はどこにもアクティビティと呼ばれるクラスを持っていません。
Matthew Rathbone 2012年

エンジンがコアです。他のプロジェクトはそれを使用する必要があり、反対ではありません。Androidプロジェクト(ライブラリプロジェクトではないことを意味する)であるプロジェクトのみが、すべてのアクティビティ、サービスなどのデクレレーションを含むマニフェストを持つ必要があります... Androidライブラリプロジェクトのマニフェスト(現在)には多くの目的がありません(詳細については、この参照:stackoverflow.com/a/10445630/878126を
Androidデベロッパー

1
彼らは持っている必要があります。マニフェストファイルが非常に短く、ほとんど何も含まれていない可能性があるだけです。また、(各プロジェクトの)project.propertiesファイルで、ターゲットSDKが15であることを確認します。これは、現在の最新バージョンであるためです。必要に応じて、私をPMできます。プロジェクトを修正します。
Androidデベロッパー

2

アプリをフレームワークライブラリとアプリケーションにリファクタリングしました。

あなたがここで何を言おうとしているのか完全にはわかりませんが、ここで「リファクタリング」という言葉を使用したという事実は、あなたが図書館プロジェクトの概念を誤解していると私に信じさせます。


図書館プロジェクトと

ライブラリプロジェクトは、共有ソースコードとリソースを含む開発プロジェクトです。他のAndroidプロジェクトは、ライブラリプロジェクトを参照し、コンパイル時にコンパイルされたソースを.apkファイルに含めることができます。

図書館プロジェクトではないもの

ライブラリプロジェクトは、単一の.apkファイルに直接コンパイルしてAndroidデバイスで実行できないという点で標準のAndroidプロジェクトとは異なります。Androidプロジェクトをライブラリプロジェクトとして使用してから、別のAndroidプロジェクトにライブラリプロジェクトを拡張させることはできません。それはそのようには機能しません。


そうは言っても、私はあなたのライブラリプロジェクトの構造を調査し、あなたがそれを正しく設定したことを確認します。ライブラリを使用して共有コード/リソースを保存することは.apk問題ありませんが、ライブラリがライブラリプロジェクト自体の中で別個のものであるかのように動作しようとしている場合は、おそらく何か問題があります。ClassNotFoundExceptionもしそうなら、がスローされると思います。この問題を解決するには、Androidプロジェクトをライブラリプロジェクトに変換するのではなく、ライブラリプロジェクトを最初から作成します。これにより、小さな迷惑なバグに遭遇するのを防ぐことができます。

それでも問題が解決しない場合は、コードを追加してください。また、ライブラリプロジェクトの構造(および目的)についてもう少し詳しく説明する必要があります...ライブラリプロジェクトを使用することにした理由、作成方法など。


ええ、私は個々のプロジェクトを絶対に正しく扱っていました。実際に問題を引き起こしたのは、図書館のプロジェクトを参照する方法でした。素晴らしい助けをありがとう!
Matthew Rathbone 2012年

np ...それは一撃の価値がありました、ハハ
Alex Lockwood

2

Eclipse Kepler(Mac)の場合:Controlキーを押しながらプロジェクトをクリック-> Androidツール->サポートライブラリを追加


これは私のためにそれを修正しました。ライブラリとしてv4-support.jarだけを含めても機能しませんでした。
whiteagle 2015年

2

私の場合は異なりますが、私が取り組んでいるプロジェクトでこの問題が発生しました。それでも問題の解決策が見つからない場合は、次のことを確認してください。

Eclipseの場合:

Project properties -> Java Build Path -> Source tab

中には、プロジェクト(および/ gen)をビルドするたびにコンパイルおよび生成されたapkに配置されるすべてのソースフォルダーのリストがあります。ヒント:

>MyProject/gen
>MyProject/src

確認したいのは、各ソースフォルダー内(/ genを除く、この場合は/ srcのみ)で、アイテムOutput folderがデフォルトの出力フォルダーであるMyProject/bin/classes。に配置されていることです。これを行うには、[出力]フォルダーを選択し、右側のボタンセットから[削除]をクリックします(これにより、デフォルトのフォルダーがポイントされます)。

サブアイテムの出力フォルダが表示されない場合は、リストのすぐ下にある[ソースフォルダの出力フォルダを許可する]をオンにします


1

すべてのヒント(プライベートライブラリなどを確認)に従ったが、まだバグがある場合。アプリケーションタグでこのコード行のマニフェストを確認してください

    android:hasCode="false" 

それを削除して幸せになります。(私はついに):)


どうもありがとうございます!!それは私を夢中にさせていました。これは私のために働きました、私はちょうどそうをロードしていたダミーのMainActivityを持っていました。あなたのコメントを見つけるのに2日かかりました!
AdrianTut

1

JavaのclassNotFoundExceptionはjava.lang.Exceptionのサブクラスであり、Java仮想マシンが特定のクラスを読み込もうとしたが、要求されたクラスがクラスパスで見つからなかった場合に発生します。

続きを読む:http//javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

しようとして試してみてくださいProject -> Properties -> Java Build Path -> Order & ExportAndroidのプライベートライブラリが確認あなたのプロジェクトのために、あなたのアプリケーションで使用している他のすべてのライブラリのプロジェクトのためにチェックされます。

ClassNotFoundExceptionに対処する方法

  1. 要求されたクラスの名前が正しいこと、および 適切な.jarファイルがクラスパスに存在することを確認してください。そうでない場合は、アプリケーションのクラスパスに明示的に追加する必要があります。
  2. 指定された.jarファイルがクラスパスに存在する場合、アプリケーションのクラスパスがオーバーライドされているため、アプリケーションで使用されている正確なクラスパスを見つける必要があります。
  3. 例外の原因がサードパーティのクラスである場合は、例外をスローするクラスを特定してから、不足している.jarファイルをクラスパスに追加する必要があります。

1

これはすべての人に当てはまるわけではありませんが、最近、プロジェクトがデバイスに存在する共有ライブラリとリンクできなかったため、この問題が発生しました。マニフェストで自分のアプリケーションを指定するのを忘れていました<uses-library>



0

SimonSaysActivityはどのインターフェースまたは親クラスを使用/拡張しますか?それらは使用しているAndroidのバージョンで利用できますか?使用しているAndroidのバージョンでは使用できないAPIインターフェースをアクティビティで実装した場合にも、同様の問題が発生しました。

私の場合、アクティビティはAPI 14でのみ使用可能なインターフェイスPopupMenu.OnDismissListenerを実装しましたが、2.3デバイスでアプリを実行すると、アクティビティに対してjava.lang.NoClassDefFoundError例外が発生しました。


すべてのバージョンは同じです、アンドロイド2.2。
Matthew Rathbone 2012年

0

私も同じ問題を抱えていて、いろいろなことをしようとして一日のほとんどを無駄にしました。アプリは、1台のPCからデプロイされたときに検索を実行しましたが、この1台のPCには実行されませんでした。結局、それは欠けているjavaの性質であることになりました!それが私にJavaビルドパス、注文/エクスポートなどをどのように示したかは奇妙ですが、それでもJavaの性質はありませんでした。:(これが他の誰かの時間を大幅に節約することを願っています


0

@yorkwによって提供される解決策は絶対に正しいです。追加の問題がありました。レイアウトファイルの1つで、絶対名が間違って記載されていました。あるべきだった

<android.support.v4.view.ViewPager xmlns:android="...

むしろ私はそれを置いていた

<android.support.v4.app.view.ViewPager xmlns:android="...

これらを解決した後、それはうまくいきました。


0

信じられないかもしれませんが、私にとっての修正は、少なくとも4時間すべてを試した後、古いバージョン(2.0)のGoogleアナリティクスライブラリをプロジェクトから削除することでした。もちろん、このライブラリの更新も解決策になる可能性があります。したがって、依存関係jarのバージョン管理の問題である可能性があります。


0

私はこれらのタイプのエラーを受け取り、すべてを試しましたが、解決策が得られませんでした。次に、ライブラリをaarファイルとして使用しているかどうかを判断し、aarライブラリのすべての依存関係をアプリのgradle.buildファイルに追加する必要があります。誰かが解決策を見つけられなかった場合は、これを試してください!


-1

私は同じ問題を抱えていました。しかし、その後、アプリケーションの現在の構造を確認しました。古いアプリケーション構造(Androidフレームワークの開発者によっていつ変更されたかはわかりません)のフォルダー名"lib"が現在のようになっていることがわかりました"libs"。すべてのjarファイルを「libs」に移行すると、エラーはなくなりました。これが誰かに役立つことを願っています:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.