Android Activity ClassNotFoundException - đã thử mọi thứ


82

Tôi vừa cấu trúc lại một ứng dụng thành một thư viện khung và một ứng dụng, nhưng bây giờ khi tôi thử và khởi động ứng dụng đó trong trình giả lập, tôi nhận được dấu vết ngăn xếp lỗi sau:

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

Thông thường, điều này có nghĩa là tệp kê khai bị sai theo một cách nào đó, nhưng tôi đã kiểm tra kỹ mọi thứ mà tôi có thể nghĩ ra.

Đây là lớp hoạt động của tôi:

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;
        }
       };
      }
    }

Như bạn có thể thấy, nó được liệt kê chính xác trong tệp kê khai:

<?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>

Tôi không biết làm thế nào để khắc phục điều này, và sẽ đánh giá cao bất kỳ sự giúp đỡ nào. Tôi đã quét nhiều câu hỏi tương tự trên SO mà không thấy hành vi cụ thể này.

Thêm thông tin:

  • Tôi đã kiểm tra bên trong APK được tạo và lớp có mục nhập trong tệp class.dex
  • Tôi đã thử dọn dẹp / xây dựng dự án trong nhật thực
  • Tôi đã thử sử dụng một hình ảnh thiết bị hoàn toàn mới chưa có bản sao của APK trên đó
  • Tôi đã thay đổi dự án thư viện thành một java thông thường, sau đó đổi lại thành một dự án android, không có gì khác biệt
  • Thêm SimonSaysActivity trừu tượng vào tệp kê khai không có gì khác biệt.
  • Tôi đã thử biến mọi phụ thuộc thành dự án thư viện android và đồng bộ hóa phiên bản android mà họ yêu cầu, nó không giúp được gì

Đã tìm ra giải pháp (xem bên dưới). Gửi đến tất cả những người đã đăng câu trả lời / nhận xét: Tất cả các bạn đều tuyệt vời, cảm ơn vì đã giúp tôi giải quyết vấn đề!

Có vẻ như điều này được giới thiệu bởi một bản nâng cấp công cụ SDK. Cảm ơn @Nick bên dưới trong nhận xét cho liên kết này: http://iqadd.com/item/noclassdeffounderror-adt-fix


1
Hoạt động của bạn là trong Thư viện hay ứng dụng?
Jeshurun

Nó nằm trong ứng dụng. Nó mở rộng một hoạt động cơ sở trong dự án thư viện.
Matthew Rathbone

Bạn xây dựng bằng kiến ​​hay bằng ADT? có vẻ như các tệp dex không chứa các lớp thư viện.
Tomasz Gawel

Lỗi ngụ ý rằng vị trí Hoạt động của bạn là com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity - rõ ràng là không đúng. Hãy thử thêm một cấp độ gói vào gói dự án không tồn tại trong thư viện, ví dụ ... eastersays.myapp.EasterSimonSaysActivity và chỉ định com.matthewrathbone.eastersays.myapp làm gói trong tệp kê khai. Nhưng không thêm cấp 'myapp' vào thư viện để giữ cho đường dẫn dự án trong tệp kê khai khác biệt với đường dẫn khung thư viện.
Gunnar Karlsson

Câu trả lời:


148

Tôi đã dành một chút thời gian để chơi với dự án của riêng mình và tôi có thể tái tạo sự cố của bạn và nhận được chính xác dấu vết ngăn xếp ngoại lệ khi cố gắng chạy dự án chính của mình, vì vậy tôi nghĩ đây có thể là nguyên nhân:

Đúng như những gì tôi nghĩ, tất cả là về cách bạn tham chiếu dự án thư viện Android của mình trong dự án chính Android, một cài đặt cấu hình Eclipse đơn giản.

Cách sai:
Nhấp chuột phải vào dự án chính, chọn Properties -> Java Build Path -> Projects -> Add..., điều này thêm Dự án thư viện Android làm dự án phụ thuộc vào đường dẫn xây dựng của dự án chính Android, điều này không hoạt động. Nếu tất cả các tài nguyên bắt buộc liên quan đến Android được xác định trong dự án chính, bạn sẽ không gặp bất kỳ lỗi nào tại thời điểm biên dịch, nhưng khi chạy ứng dụng, bạn nhận được ngoại lệ được mô tả trong câu hỏi.

Cách đúng:
Nhấp chuột phải vào dự án chính, chọn Properties -> Android, trong phần Thư viện, thêm dự án thư viện Android của bạn tại đây. Kiểm tra hướng dẫn phát triển chính thức Tham khảo một dự án thư viện . Điều này sẽ khắc phục tất cả vấn đề của bạn. Cũng lưu ý rằng bạn phải sử dụng tham chiếu đường dẫn tương đối dự án thư viện Android thực tế, như đã nêu trong Dự án thư viện - Xem xét phát triển .

Hi vọng điêu nay co ich.


1
Bạn bạn của tôi là một thiên tài. Điều thú vị về điều này là tôi luôn đưa vào một thư viện 'sai cách', và nó đã hoạt động. Vì vậy, khi tôi cấu trúc lại thành hai thư viện, tôi nghĩ đó là điều tôi đã làm khác. Bạn vừa tiết kiệm cho tôi hàng giờ đồng hồ làm việc.
Matthew Rathbone

điều buồn cười là, nó đã hoạt động trước đây, tôi đoán việc nâng cấp các công cụ sdk của tôi đã thay đổi hành vi. Nó rất không rõ ràng.
Matthew Rathbone

3
Có, việc cập nhật Công cụ SDK lên> ADT 17 gây ra lỗi này do sự thay đổi trong cách phiên bản ADT hiện tại xử lý thư viện. Kiểm tra: iqadd.com/item/noclassdeffounderror-adt-fix
Nick

2
Cập nhật lên ADT 22 đã gây ra sự cố tương tự: stackoverflow.com/questions/16596969/…
Niels

7
Ai đó vui lòng cho tôi biết nơi tôi có thể tìm thấy Properties? Tôi dường như không thể tìm thấy nó ở bất cứ đâu.
vui vẻ

8

tôi đã kiểm tra mã mà bạn đã cung cấp và nó hoạt động tốt. hãy thử thay đổi "mở rộng SimonSaysActivity" thành "mở rộng Hoạt động" và tự xem nó có hoạt động không.

lý do mà nó không hoạt động là SimonSaysActivity không mở rộng Hoạt động (mà tôi không nghĩ rằng bạn đã mắc lỗi này) hoặc thứ tự của đường dẫn xây dựng bị sai.

để đi đến thứ tự của đường dẫn xây dựng, hãy đi tới:

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

thứ tự cơ bản của tôi là: project src, project gen, android 4.0.3, các phụ thuộc android.

sự cố này thường xảy ra khi bạn sử dụng thư viện.


Vì vậy, bạn nói đúng, nếu tôi mở rộng Hoạt động trực tiếp, nó sẽ hoạt động. Thứ tự xây dựng của tôi khớp với thứ tự của bạn, vì vậy tôi không thể tìm cách khắc phục theo cách đó. Bất kỳ ý tưởng khác?
Matthew Rathbone

điều đó thực sự kỳ lạ. cố gắng cập nhật sdk & adt. ngoài ra, vui lòng cho tôi biết nếu có nhiều dự án thư viện (hoặc tệp jar hoặc cả hai) mà ứng dụng của bạn sử dụng. nếu vậy, hãy thử chơi một chút với thứ tự của đường dẫn xây dựng (tôi sẽ cố gắng đặt các thư viện trước đó). Ngoài ra, tôi có một câu hỏi khác: bạn đã tạo một lớp được gọi là "Hoạt động" và có thể bạn đã mở rộng nó thay vì lớp của android?
nhà phát triển android

Có 2 dự án thư viện, dự án thứ hai (động cơ) phụ thuộc vào cả simonSays và dự án android. Tôi đã thử mọi cách kết hợp giữa thứ tự xây dựng, xuất dự án động cơ từ SimonSays. Trả lời cho câu hỏi của bạn: Tôi không có một lớp học được gọi là hoạt động ở bất cứ đâu.
Matthew Rathbone

động cơ là cốt lõi. các dự án khác nên sử dụng nó và không phải ngược lại. chỉ dự án là một dự án android (có nghĩa là không phải là một dự án thư viện) mới nên có tệp kê khai bao gồm việc phân tích tất cả các hoạt động, dịch vụ, v.v. ... tệp kê khai trên các dự án thư viện android (hiện tại) không có nhiều mục đích (xem phần này để biết thêm thông tin: stackoverflow.com/a/10445630/878126 )
nhà phát triển android

1
họ phải có . chỉ là tệp kê khai có thể rất ngắn và không bao gồm hầu hết mọi thứ. cũng kiểm tra tệp project.properties (trong mỗi dự án) rằng sdk mục tiêu của nó là 15 vì đây là phiên bản mới nhất hiện tại. Nếu bạn muốn, bạn có thể PM cho tôi và tôi sẽ sửa các dự án.
nhà phát triển android

2

Tôi vừa cấu trúc lại một ứng dụng thành một thư viện khung và một ứng dụng.

Tôi không hoàn toàn chắc chắn những gì bạn đang muốn nói ở đây, nhưng thực tế là bạn đã sử dụng từ "tái cấu trúc" ở đây khiến tôi tin rằng bạn đang hiểu sai khái niệm về một dự án thư viện.


Dự án thư viện là gì :

Dự án thư viện là một dự án phát triển có chứa mã nguồn và tài nguyên được chia sẻ. Các dự án Android khác có thể tham khảo dự án thư viện và bao gồm các nguồn đã biên dịch của nó trong tệp .apk của chúng tại thời điểm biên dịch.

Những dự án thư viện nào không phải là :

Dự án thư viện khác với một dự án Android tiêu chuẩn ở chỗ bạn không thể biên dịch trực tiếp thành một .apktệp và chạy nó trên thiết bị Android. Bạn không thể sử dụng dự án Android làm dự án thư viện, sau đó có một dự án Android khác mở rộng dự án thư viện. Nó không hoạt động theo cách đó.


Điều đó nói rằng, tôi sẽ điều tra cấu trúc của dự án thư viện của bạn và đảm bảo rằng bạn đã thiết lập nó một cách chính xác . Bạn có thể sử dụng thư viện của mình để lưu trữ mã / tài nguyên được chia sẻ, nhưng nếu thư viện của bạn đang cố gắng hoạt động như thể nó là một tệp riêng biệt .apktrong chính dự án thư viện, thì có thể bạn đã làm sai. Tôi tin rằng a ClassNotFoundExceptionsẽ được ném nếu trường hợp này xảy ra. Để khắc phục sự cố, tôi chỉ muốn xây dựng dự án thư viện từ đầu, thay vì cố gắng chuyển đổi dự án Android thành dự án thư viện. Điều đó sẽ ngăn bạn gặp phải những lỗi nhỏ, khó chịu.

Vui lòng đăng thêm mã nếu bạn vẫn gặp sự cố. Bạn cũng nên giải thích thêm một chút về cấu trúc (và mục đích) của dự án thư viện của bạn ... tại sao bạn quyết định sử dụng một dự án, cách bạn tạo ra nó, v.v.


Vâng, tôi đã hoàn toàn xử lý các dự án riêng lẻ một cách chính xác, đó là cách mà tôi đang tham khảo các dự án thư viện thực sự gây ra vấn đề. Cảm ơn vì sự giúp đỡ tuyệt vời!
Matthew Rathbone

np ... nó là giá trị một shot, haha
Alex Lockwood

2

Đối với Eclipse Kepler (Mac): Control khi nhấp chuột vào dự án -> Công cụ Android -> thêm thư viện hỗ trợ


CÁi này đã sửa nó giúp tôi. chỉ bao gồm v4-support.jar như một thư viện không hoạt động.
whiteagle

2

Tôi đã gặp vấn đề này với một dự án mà tôi đang thực hiện, mặc dù trường hợp của tôi khác. Nếu ai đó vẫn không thể tìm ra giải pháp cho vấn đề của họ, hãy thử kiểm tra điều này:

Trong Eclipse:

Project properties -> Java Build Path -> Source tab

Bên trong, bạn sẽ tìm thấy một danh sách với tất cả các thư mục nguồn sẽ được biên dịch và đưa vào apk đã tạo mỗi lần để xây dựng dự án của bạn (và / gen ). Mẹo nhỏ:

>MyProject/gen
>MyProject/src

Điều bạn sẽ muốn chắc chắn là bên trong mỗi thư mục nguồn của bạn (loại trừ / gen , vì vậy chỉ / src trong trường hợp này), mục Output foldernày đang chuyển sang thư mục đầu ra mặc định MyProject/bin/classes. Thực hiện việc này bằng cách chọn Thư mục đầu ra và nhấp vào Xóa từ nhóm nút bên phải (thao tác này sẽ làm cho nó trỏ đến thư mục mặc định).

Nếu bạn không thể thấy thư mục Đầu ra của subitem, hãy chọn "Cho phép thư mục đầu ra cho thư mục nguồn" ngay bên dưới danh sách


1

Nếu bạn đã làm theo tất cả các gợi ý (đã kiểm tra Thư viện tư nhân, v.v.) mà vẫn gặp lỗi. Kiểm tra tệp kê khai của bạn để tìm Dòng mã này trong thẻ ứng dụng

    android:hasCode="false" 

Loại bỏ nó và hạnh phúc. (Cuối cùng thì tôi cũng vậy) :)


Cảm ơn bạn rất nhiều!! Nó đã khiến tôi phát điên. Điều này đã làm việc cho tôi, tôi đã có một MainActivity giả vừa tải một. Mất 2 ngày để tìm bình luận của bạn!
AdrianTut

1

classNotFoundException trong Java là một lớp con của java.lang.Exception và Đi kèm khi Máy ảo Java cố gắng tải một lớp cụ thể và không tìm thấy lớp được yêu cầu trong classpath.

Đọc thêm: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

Hãy thử đi tới Project -> Properties -> Java Build Path -> Order & ExportXác nhận Thư viện riêng của Android được kiểm tra cho dự án của bạn và cho tất cả các dự án thư viện khác mà bạn đang sử dụng trong Ứng dụng của mình.

Cách đối phó với ClassNotFoundException

  1. Xác minh rằng tên của lớp được yêu cầu là chính xác và tệp .jar thích hợp tồn tại trong classpath của bạn . Nếu không, bạn phải thêm nó vào classpath của ứng dụng một cách rõ ràng.
  2. Trong trường hợp tệp .jar được chỉ định tồn tại trong classpath của bạn, thì classpath của ứng dụng của bạn đang bị ghi đè và bạn phải tìm chính xác classpath được ứng dụng của bạn sử dụng.
  3. Trong trường hợp ngoại lệ được gây ra bởi lớp bên thứ ba, bạn phải xác định lớp ném ra ngoại lệ và sau đó, thêm các tệp .jar bị thiếu trong classpath của bạn .

1

Mặc dù điều này sẽ không áp dụng cho tất cả mọi người, nhưng gần đây tôi đã gặp sự cố này vì dự án của tôi không liên kết được với thư viện được chia sẻ hiện có trên thiết bị. Tôi đã quên chỉ định trong tệp kê khai của mình rằng ứng dụng của tôi <uses-library>.



0

SimonSaysActivity sử dụng / mở rộng giao diện hoặc lớp cha nào và chúng có khả dụng trên phiên bản Android bạn đang sử dụng không? Tôi đã gặp các vấn đề tương tự trong đó hoạt động của tôi triển khai giao diện API không khả dụng trên phiên bản Android mà tôi đang sử dụng.

Trong trường hợp của tôi, hoạt động của tôi đã triển khai giao diện PopupMenu.OnDismissListener chỉ có sẵn trong API 14 nhưng khi tôi chạy ứng dụng trên thiết bị 2.3 của mình, tôi đã nhận được ngoại lệ java.lang.NoClassDefFoundError cho hoạt động.


tất cả các phiên bản đều giống nhau, android 2.2.
Matthew Rathbone

0

Tôi đã gặp phải vấn đề tương tự và lãng phí gần như cả ngày để thử đủ thứ. Ứng dụng chạy tìm thấy khi được triển khai từ một máy tính nhưng không chạy trên một máy tính này. Cuối cùng thì nó đã trở thành một bản chất java bị thiếu! Thật kỳ lạ khi nó chỉ cho tôi đường dẫn xây dựng java, đặt hàng / xuất và tất cả những thứ đó nhưng lại không có bản chất java. :( Hy vọng điều này sẽ tiết kiệm được nhiều thời gian cho người khác


0

giải pháp do @yorkw cung cấp là hoàn toàn chính xác. Tôi gặp một vấn đề bổ sung, trong một trong các tệp bố cục, tôi đã đề cập tên tuyệt đối không chính xác. Nó đáng lẽ phải

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

đúng hơn là tôi đã đặt nó

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

sau khi giải quyết những điều này, nó hoạt động tốt.


0

Tin hay không thì tùy, cách khắc phục đối với tôi là xóa phiên bản cũ (2.0) của thư viện google analytics khỏi dự án của tôi, sau khi thử mọi thứ trong ít nhất 4 giờ. Tất nhiên, một bản cập nhật của thư viện này cũng có thể là giải pháp. Vì vậy, nó có thể là một vấn đề lập phiên bản jar phụ thuộc.


0

Tôi đã gặp phải loại lỗi này và tôi đã thử mọi thứ nhưng không nhận được giải pháp. sau đó tôi đã tìm ra nếu bạn đang sử dụng thư viện dưới dạng tệp aar thì bạn phải thêm tất cả các phụ thuộc của thư viện aar vào tệp gradle.build ứng dụng của bạn. nếu ai đó không tìm ra giải pháp thì hãy thử điều này!


-1

Tôi đã nhận được cùng một vấn đề. Nhưng sau đó tôi kiểm tra cấu trúc hiện tại của ứng dụng, tôi thấy rằng cấu trúc ứng dụng cũ hơn (tôi không biết thời gian nó được các nhà phát triển khung android thay đổi) có tên thư mục "lib"hiện tại "libs". Tôi di chuyển tất cả các tệp jar của mình thành "libs" và lỗi đã biến mất. Tôi hy vọng điều này có thể giúp ích cho ai đó :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.