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>

이 문제를 해결하는 방법을 모르겠으며 도움을 주시면 감사하겠습니다. 나는이 특정 행동을 보지 않고 많은 유사한 질문을 스캔했습니다.

더 많은 정보:

  • 생성 된 APK 내부를 확인했고 클래스의 classes.dex 파일에 항목이 있습니다.
  • 나는 일식에서 프로젝트를 청소 / 빌드하려고 시도했습니다.
  • 이미 APK 사본이없는 완전히 새로운 기기 이미지를 사용해 보았습니다.
  • 라이브러리 프로젝트를 일반 Java로 변경 한 다음 Android 프로젝트로 다시 변경했습니다. 차이는 없습니다.
  • 추상 SimonSaysActivity를 매니페스트에 추가해도 차이가 없습니다.
  • 모든 종속성을 Android 라이브러리 프로젝트로 만들고 필요한 Android 버전을 동기화하려고 시도했지만 도움이되지 않았습니다.

솔루션을 찾았습니다 (아래 참조). 답변 / 댓글을 게시 한 모든 사람에게 : 문제 해결을 도와 주셔서 감사합니다!

이것은 SDK 도구 업그레이드로 인해 도입 된 것 같습니다. 이 링크에 대한 의견 아래 @Nick에게 감사드립니다 : http://iqadd.com/item/noclassdeffounderror-adt-fix


1
귀하의 활동이 라이브러리 또는 애플리케이션에 있습니까?
Jeshurun

응용 프로그램에 있습니다. 도서관 프로젝트의 기본 활동을 확장합니다.
Matthew Rathbone

개미 또는 ADT로 빌드합니까? dex 파일에 라이브러리 클래스가 포함되어 있지 않은 것 같습니다.
Tomasz Gawel 2012 년

이 오류는 귀하의 활동 위치가 com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity임을 의미합니다. 라이브러리에 존재하지 않는 프로젝트 패키지에 패키지 레벨을 추가하십시오. 그러나 매니페스트의 프로젝트 경로를 라이브러리 프레임 워크 경로와 구분하기 위해 라이브러리에 'myapp'수준을 추가하지 마십시오.
Gunnar Karlsson 2012 년

1
iqadd.com/item/noclassdeffounderror-adt-fix : 링크가 끊어졌습니다. : /
Nishant.

답변:


148

내 프로젝트로 시간을 보냈고 문제를 복제하고 기본 프로젝트를 실행하려고 할 때 정확히 동일한 예외 스택 추적을 얻을 수 있으므로 이것이 원인이 될 수 있다고 생각합니다.

내가 생각했던 것과 마찬가지로, 간단한 Eclipse 구성 설정 인 Android 메인 프로젝트에서 Android 라이브러리 프로젝트를 참조하는 방법에 관한 것입니다.

잘못된 방법 :
메인 프로젝트를 마우스 오른쪽 버튼으로 클릭 하고을 선택 Properties -> Java Build Path -> Projects -> Add...합니다. Android 라이브러리 프로젝트가 Android 메인 프로젝트의 빌드 경로에 종속성 프로젝트로 추가됩니다. 작동하지 않습니다. 필요한 모든 Android 관련 리소스가 기본 프로젝트에 정의되어 있으면 컴파일 타임에 오류가 발생하지 않지만 응용 프로그램을 실행하면 질문에 설명 된 예외가 발생합니다.

올바른 방법 :
메인 프로젝트를 마우스 오른쪽 버튼으로 클릭 Properties -> Android하고 라이브러리 섹션에서을 선택 하고 여기에 Android 라이브러리 프로젝트를 추가합니다. 공식 개발 가이드 참조 라이브러리 프로젝트 참조 . 이것은 모든 문제를 해결합니다. 또한 라이브러리 프로젝트-개발 고려 사항에 명시된대로 실제 Android 라이브러리 프로젝트에 대한 상대 경로 참조를 사용해야 합니다.

도움이 되었기를 바랍니다.


1
내 친구는 천재 야. 흥미로운 점은 제가 항상 하나의 라이브러리를 '잘못된 방식'으로 포함 시켰고 작동했다는 것입니다. 그래서 두 개의 라이브러리로 리팩토링했을 때 다른 작업을한다고 생각했습니다. 당신은 저에게 몇 시간의 작업 시간을 절약했습니다.
Matthew Rathbone

재미있는 점은 이전에 작동하고 있었는데 SDK 도구를 업그레이드하면 동작이 변경된 것 같습니다. 그것은 매우 분명하지 않았습니다.
Matthew Rathbone

3
예, SDK 도구를> ADT 17로 업데이트하면 현재 ADT 버전이 라이브러리를 처리하는 방식이 변경되어이 오류가 발생합니다. 확인 : iqadd.com/item/noclassdeffounderror-adt-fix
Nick

2
ADT 22로 업데이트하면 비슷한 문제가 발생했습니다. stackoverflow.com/questions/16596969/…
Niels

7
누군가 내가 어디에서 찾을 수 있는지 알려 주시겠습니까 Properties? 어디에서도 찾을 수없는 것 같습니다.
jlively

8

나는 당신이 준 코드를 테스트했으며 잘 작동합니다. "Extends SimonSaysActivity"를 단순히 "extends Activity"로 변경하고 작동하는지 직접 확인하십시오.

작동하지 않는 이유는 SimonSaysActivity가 Activity를 확장하지 않거나 (이 실수를 저질렀다고 생각하지 않습니다) 빌드 경로의 순서가 잘못 되었기 때문입니다.

빌드 경로의 순서로 이동하려면 다음으로 이동하십시오.

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

내 기본 순서는 프로젝트 src, 프로젝트 생성, 안드로이드 4.0.3, 안드로이드 종속성입니다.

이 문제는 일반적으로 라이브러리를 사용할 때 발생합니다.


그래서 당신이 맞습니다. Activity를 직접 확장하면 작동합니다. 내 빌드 순서가 귀하의 것과 일치하므로 그렇게 고칠 방법을 찾을 수 없습니다. 다른 아이디어가 있습니까?
Matthew Rathbone

정말 이상합니다. sdk & adt를 업데이트하십시오. 또한 앱에서 사용하는 라이브러리 프로젝트 (또는 jar 파일 또는 둘 다)가 여러 개 있는지 알려주세요. 그렇다면 빌드 경로의 순서로 약간 재생 해보십시오 (전에 라이브러리를 배치하려고합니다). 또한 다른 질문이 있습니다. "Activity"라는 클래스를 만들었고 Android 대신 확장했을 수 있습니다.
안드로이드 개발자

2 개의 라이브러리 프로젝트가 있으며, 두 번째 (엔진)는 simonSays와 Android 프로젝트 모두에 의존합니다. SimonSays에서 엔진 프로젝트를 내보내는 빌드 순서의 모든 조합을 시도했습니다. 귀하의 질문에 대한 답변 : 나는 어디에도 activity라는 수업이 없습니다.
Matthew Rathbone 2015 년

엔진이 핵심입니다. 다른 프로젝트는 그것을 사용해야하며 그 반대가 아닙니다. Android 프로젝트 (라이브러리 프로젝트가 아님) 인 프로젝트에만 모든 활동, 서비스 등의 삭제를 포함하는 매니페스트가 있어야합니다. (자세한 내용은 this 참조 : stackoverflow.com/a/10445630/878126 )
안드로이드 개발자

1
그들은 있어야합니다. 매니페스트 파일은 매우 짧고 거의 아무것도 포함하지 않을 수 있습니다. 또한 project.properties 파일 (각 프로젝트에서)의 대상 SDK가 현재 최신 버전이므로 15인지 확인하십시오. 원하신다면 PM을 보내 주시면 프로젝트를 수정하겠습니다.
안드로이드 개발자

2

방금 앱을 프레임 워크 라이브러리와 애플리케이션으로 리팩터링했습니다.

여기서 무슨 말을 하려는지는 잘 모르겠지만 여기서 "리팩토링"이라는 단어를 사용했다는 사실은 당신이 도서관 프로젝트의 개념을 오해하고 있다고 믿게 만듭니다.


어떤 라이브러리 프로젝트가 있습니다 :

라이브러리 프로젝트는 공유 소스 코드 및 리소스를 포함하는 개발 프로젝트입니다. 다른 Android 프로젝트는 라이브러리 프로젝트를 참조하고 컴파일 타임에 .apk 파일에 컴파일 된 소스를 포함 할 수 있습니다.

도서관 프로젝트 가 아닌 것 :

라이브러리 프로젝트는 단일 .apk파일로 직접 컴파일 하여 Android 기기에서 실행할 수 없다는 점에서 표준 Android 프로젝트와 다릅니다 . Android 프로젝트를 라이브러리 프로젝트로 사용한 다음 다른 Android 프로젝트 가 라이브러리 프로젝트를 확장 하도록 할 수 없습니다 . 그런 식으로 작동하지 않습니다.


즉, 라이브러리 프로젝트의 구조를 조사하고 올바르게 설정 했는지 확인 합니다 . 라이브러리를 사용하여 공유 코드 / 리소스를 저장하는 것은 괜찮지 만 라이브러리가 .apk라이브러리 프로젝트 자체 내에서 별도의 것처럼 작동하려고 시도하는 경우 아마도 뭔가 잘못한 것입니다. ClassNotFoundException이 경우 a 가 던져 질 것이라고 생각합니다 . 문제를 해결하기 위해 Android 프로젝트를 라이브러리 프로젝트로 변환하는 대신 라이브러리 프로젝트를 처음부터 빌드했습니다. 이렇게하면 작고 성가신 버그가 발생하지 않습니다.

여전히 문제가 있으면 더 많은 코드를 게시하십시오. 또한 라이브러리 프로젝트의 구조 (및 목적)에 대해 좀 더 자세히 설명해야합니다. 라이브러리 프로젝트를 사용하기로 결정한 이유, 만든 방법 등.


네, 저는 개별 프로젝트를 절대적으로 올바르게 다루고 있었고 실제로 문제를 일으킨 도서관 프로젝트를 참조하는 방식이었습니다. 그래도 멋진 도움에 감사드립니다!
마태 복음 래스

NP ... 그것은 가치가 샷, 하하이었다
알렉스 록우드

2

Eclipse Kepler (Mac) : Control- 클릭 프로젝트-> Android 도구-> 지원 라이브러리 추가


이것은 나를 위해 그것을 고쳤습니다. v4-support.jar 만 라이브러리로 포함하면 작동하지 않았습니다.
whiteagle

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 Virtual Machine이 특정 클래스를로드하려고 시도하고 클래스 경로에서 요청 된 클래스를 찾지 못할 때 발생합니다.

자세히보기 : http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

에가는 시도 Project -> Properties -> Java Build Path -> Order & Export안드로이드 개인 라이브러리 확인 프로젝트에 당신이 당신의 응용 프로그램에서 사용하는 다른 모든 라이브러리 프로젝트에 확인됩니다.

ClassNotFoundException을 처리하는 방법

  1. 요청 된 클래스의 이름이 올 바르고 적절한 .jar 파일이 클래스 경로에 있는지 확인하십시오 . 그렇지 않은 경우 애플리케이션의 클래스 경로에 명시 적으로 추가해야합니다.
  2. 지정된 .jar 파일이 클래스 경로에있는 경우 애플리케이션의 클래스 경로가 재정의되고 애플리케이션에서 사용하는 정확한 클래스 경로를 찾아야합니다.
  3. 타사 클래스로 인해 예외가 발생한 경우 예외를 발생시키는 클래스를 식별 한 다음 누락 된 .jar 파일을 클래스 경로 에 추가해야합니다 .

1

모든 사람에게 적용되지는 않지만 최근에 내 프로젝트가 장치에있는 공유 라이브러리와 연결되지 않아서이 문제가 발생했습니다. 내 매니페스트 에서 내 응용 프로그램 을 지정하는 것을 잊었습니다 <uses-library>.



0

SimonSaysActivity는 어떤 인터페이스 또는 부모 클래스를 사용 / 확장하며 사용중인 Android 버전에서 사용할 수 있습니까? 내 활동이 내가 사용하고있는 Android 버전에서 사용할 수없는 API 인터페이스를 구현하는 유사한 문제를 보았습니다.

제 경우에는 내 활동이 API 14에서만 사용할 수있는 PopupMenu.OnDismissListener 인터페이스를 구현했지만 2.3 기기에서 앱을 실행했을 때 활동에 대한 java.lang.NoClassDefFoundError 예외가 발생했습니다.


모든 버전이 동일합니다. android 2.2.
Matthew Rathbone 2015 년

0

나는 똑같은 문제가 있었고 모든 종류의 일을 시도하면서 대부분의 하루를 낭비했습니다. 앱이 한 PC에서 배포 될 때 find를 실행했지만이 PC에서는 실행되지 않았습니다. 결국 그것은 누락 된 자바 성격이되었습니다! 내가 자바 빌드 경로, 주문 / 내보내기 및 모든 것을 보여 주었지만 아직 자바 특성이 없었던 방식이 이상했습니다. :( 이것이 다른 사람에게 많은 시간을 절약하기를 바랍니다.


0

@yorkw가 제공하는 솔루션은 절대적으로 정확합니다. 레이아웃 파일 중 하나에서 절대 이름을 잘못 언급 한 추가 문제가 있습니다. 그랬어 야 했어

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

오히려 나는 그것을 넣었다

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

이 문제를 해결 한 후 잘 작동했습니다.


0

믿거 나 말거나, 나에게 해결책은 적어도 4 시간 동안 모든 것을 시도한 후 내 프로젝트에서 Google Analytics 라이브러리의 이전 버전 (2.0)을 제거하는 것이 었습니다. 물론이 라이브러리를 업데이트하는 것도 해결책이 될 수 있습니다. 따라서 종속성 jar 버전 문제가 될 수 있습니다.


0

나는 이러한 유형의 오류를 받고 있었고 모든 것을 시도했지만 해결책을 얻지 못했습니다. 그런 다음 라이브러리를 aar 파일로 사용하고 있는지 확인한 다음 aar 라이브러리의 모든 종속성을 앱 gradle.build 파일에 추가해야합니다. 누군가가 해결책을 찾지 못했다면 이것을 시도하십시오!


-1

나는 같은 문제를 겪고 있었다. 하지만 응용 프로그램의 현재 구조를 확인했습니다. 이전 응용 프로그램 구조 (안드로이드 프레임 워크 개발자가 변경 한 시간을 모릅니다)에 현재 폴더 이름 "lib"이 있음을 발견했습니다 "libs". 내 모든 jar 파일을 "libs"로 마이그레이션하고 오류가 사라졌습니다. 나는 이것이 누군가에게 도움이되기를 바랍니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.