Android ClassNotFoundException: Не знайдено клас на шляху


97
10-22 15:29:40.897: E/AndroidRuntime(2561): FATAL EXCEPTION: main
10-22 15:29:40.897: E/AndroidRuntime(2561): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.gvg.simid/com.gvg.simid.Login}: java.lang.ClassNotFoundException: Didn't find class "com.gvg.simid.Login" on path: DexPathList[[zip file "/data/app/com.gvg.simid-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.gvg.simid-1, /vendor/lib, /system/lib]]
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.os.Looper.loop(Looper.java:137)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.reflect.Method.invokeNative(Native Method)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.reflect.Method.invoke(Method.java:525)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at dalvik.system.NativeStart.main(Native Method)
10-22 15:29:40.897: E/AndroidRuntime(2561): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.gvg.simid.Login" on path: DexPathList[[zip file "/data/app/com.gvg.simid-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.gvg.simid-1, /vendor/lib, /system/lib]]
10-22 15:29:40.897: E/AndroidRuntime(2561):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
10-22 15:29:40.897: E/AndroidRuntime(2561):     ... 11 more

Я не зовсім впевнений, що це спричиняє, оскільки це правильно вказано в маніфесті:

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.READ_OWNER_DATA" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <uses-feature android:name="android.hardware.usb.host" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.gvg.simid.Login"
            android:label="@string/app_name" 
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Я також додав "Приватні бібліотеки Android" для побудови шляху та перемістив його у верхню частину "Замовлення та експорт", але все одно це призвело до тієї ж помилки.

EDIT: Я повністю відновив проект і не зміг відтворити помилку. Не впевнений, що це спричинило.


2
ти використовуєш proguard?
Juangcg

Proguard не ввімкнено.
Phito

Перевірте це повідомлення: stackoverflow.com/questions/10866431 / ...
Juangcg

спробуйте ".Login" в android: name, замість цього Android додасть решту префікса самостійно, якщо не зможе його виявити. Це може бути просто дивна проблема розбору з Eclipse
Darryl Bayliss

@Juangcg Я прочитав цю публікацію перед тим, як зробити цю, але, на жаль, все, що я спробував звідти, не спрацювало.
Phito

Відповіді:


76

У мене було те саме питання для мого проекту. Це сталося через конфлікт у версії бібліотеки підтримки Android між моїм проектом та проектом бібліотеки, який я додав у своєму проекті. Помістіть ту саму версію бібліотеки підтримки Android у свій проект та бібліотечні проекти, які ви включили, та очистіть збірку ... Все буде працювати ...


3
Спасибі людино !!! Я був впевнений, що це вже зробив, але перевірив і версії були різні! Дуже дякую!
Родріго Венансіо

2
я коментую це, щоб запам'ятати наступного разу, щоб "оновити" sdk, перегляньте цю відповідь
Енріке Сан Мартін,

1
Будь-які ідеї, чому виникає проблема, якщо я не використовую бібліотеки підтримки?
Будда,

33

Цей наступний метод спрацював для мене

  • Клацніть правою кнопкою миші на projectі виберітьproperties
  • Відкриється панель «Властивості для». З меню ліворуч перейдіть до Java Build Path->Order and Export
  • Зі списку нижче зніміть прапорець біля "Android Dependencies"
  • Нарешті clean your projectі біжи

8
Це працювало для мене. Що означає "залежності Android" і чому це допомогло у цьому конкретному випадку?
Олег Гриб

У мене спрацювало чудово! Дуже дякую!
prajitdas

7
Чи є ці вказівки щодо затемнення? Я не можу слідувати цим інструкціям для android studio. Що таке моє project? Що це означає?
Адам Джонс,

1
Так, ці інструкції стосуються затемнення
Кріс

2
Це посилання має кроки для Android Студія stackoverflow.com/questions/18533054 / ...
Джозефу Selvaraj

13

Для тих з вас, хто стикається з цією проблемою в Android Studio, у мене була така сама проблема після злиття, і з якихось причин вона навіть зберігалася після cleanіinvalidate cash/restart операції, зводить мене з розуму.

Виявляється, це можна виправити, запустивши gradle build один раз із командного рядка. Просто запустіть наступний каталог каталогу:

./gradlew assemble clean
./gradlew assemble

Я сподіваюся, це врятує когось, витрачаючи час і розчарування, які мені довелося пережити.


Працював і для мене
davedavedave

12

У мене була та сама проблема, це працювало у мене

1) Повний шлях діяльності в mainfest замість відносного шляху.

2) Видалити папку "build" та очистити проект.


Видалення папки складання працювало у мене. Я втратив кілька годин з цього питання, дякую
Гай С,

Працював і для мене. Дякую.
Dushyant Suthar

Це справжня справа. XD
noob-Sci-Bot

9

Якщо ви використовуєте Eclipse, спробуйте Project -> Clean


Працює для андроїд-студії - Проект «Очистити / відновити і запустити»
frcake

8

Якщо ви додали новий Library Projectяк модуль до свого проекту Android і використовуєте Kotlinу своїй бібліотеці , не забудьте додати

apply plugin: 'kotlin-android'

на початок файлу Gradle вашого модуля. Android Studio не додає цей рядок, коли ви створювали новий модуль, і це може витратити ваші години, як я.

Редагувати: Через деякий час я просто знову боровся з цією проблемою, і цього разу забув додати свій модуль як залежність від проекту. :)


Вирішив це для мене, і я просто хотів опублікувати відповідь. Хто переходить до другої сторінки SO для пошуку рішення?
Куно,

Ця проблема трапляється, коли ми використовуємо проект бібліотеки Java ... це рішення виправило мою проблему
Devrath

Це мені допомогло, дякую :)
Sreekanth Karumanaghat

7

Це трапляється, якщо ми змінимо шлях побудови додатка, це може бути в будь-якому випадку Додаванням, Видаленням або Зміною бібліотек або файлом .jar. Найкраще рішення - перезапустити Eclipse.


6

Якщо ви отримуєте цю помилку під час використання нової функції миттєвого запуску в Android Studio 2.0 і вище, то це якась помилка на їх стороні.
Щоб виправити це, вам доведеться зупинити програму вручну на пристрої / емуляторі, якщо її не зупинено, виберіть із Android Studio BuildRebuild Project.
Потім натисніть кнопку Виконати або SHIFT + F10


6

Для кожного, хто має мультидексівний режим, напишіть це

всередині build.gradle

apply plugin: 'com.android.application'

android {
 defaultConfig {
      multiDexEnabled true
  }
 dexOptions {
        javaMaxHeapSize "4g"
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:multidex:1.0.1'
}

напишіть клас, EnableMultiDexяк показано нижче

import android.content.Context;
import android.support.multidex.MultiDexApplication;

public class EnableMultiDex extends MultiDexApplication {
    private static EnableMultiDex enableMultiDex;
    public static Context context;

    public EnableMultiDex(){
        enableMultiDex=this;
    }

    public static EnableMultiDex getEnableMultiDexApp() {
        return enableMultiDex;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();

    }
}

і в AndroidManifest.xmlзапишіть це className всередині тегу Application

 <application
    android:name="YourPakageName.EnableMultiDex"
    android:hardwareAccelerated="true"
    android:icon="@drawable/wowio_launch_logo"
    android:label="@string/app_name"
    android:largeHeap="true"
    tools:node="replace">

оххххх ман ... ідеальна відповідь .. я бачив цю відповідь, але ніхто не проголосував, тому я нехтував цим і пішов на відповіді, але не працював .. нарешті, я просто протестував цей, і я його отримав, дякую, ман. :) :) :) :)
Sachin Varma

рада, що це допомогло :)
Манохар Редді

2
Головне - розширити програму з MultiDexApplicationкласу замість Application.
VSB

Дякую. Я вже мав деяку програму в Manifest. Розширив його з MultiDexApplicationі виняток зник на Android 4.4.
CoolMind

6

Якщо ви використовуєте Multidex на Android 4.4 та новіших версіях , можливо, проблема полягає в тому, що ваш клас активності знаходиться у другому файлі dex, і тому система Android його не знаходить.

Щоб зберегти свій клас активності у головному файлі dex, перегляньте цю сторінку:

https://developer.android.com/studio/build/multidex.html#keep


Щоб знайти, які класи розміщені у файлі dex, використовуйте Android Studio .

Просто перетягніть і опустіть свій apk в Android Studio. Ви повинні бачити свої файли dex у провіднику apk.

Потім виберіть файл dex, щоб побачити, які класи знаходяться всередині.


інша альтернатива - dexdump:

Ви можете перевірити вміст ваших файлів dex, що містяться у вашому apk, за допомогою команди dexdump, яку можна знайти в

android-sdk / build-tools / 27.0.3 / dexdump

Для користувачів Windows див. Цей інструмент, який я створив для полегшення процесу


1
Пов’язуючи свій власний інструмент, обов’язково заявіть, що ним володієте .
LW001

5

У моєму випадку це був процес мініфікації proguard, який видалив деякі важливі класи з мого apk-файлу.

Рішенням було відредагувати файл proguard-rules.pro та додати наступне:

-keep class com.someimportant3rdpartypackage.** { *; }

3

1) Створити папку libs під коренем проекту
2) Скопіювати та вставити в неї файл jar
3) Налаштувати шлях збірки (Додати jar)
4) Очистити та запустити

ура :-)


3

Повірте мені чи ні ... Я випробував майже кожну відповідь, яку знайшов тут, на stackoverflow. Ніщо не допомогло б, поки я просто не перезапустив машину. Моя Android Studio працює на Ubuntu 16.04 LTS.


Те саме тут, спробував все і перезапустити після вашого коментаря. Я побачив у своєму висновку посилання на реконструйоване ім'я класу, яке "Не вдалося знайти", незважаючи на те, що я стер цілу папку збірки. Тільки запускаю андроїд
Alwin Kesler

2

Я зіткнувся з цією помилкою одного разу, коли визначив клас, який розширив подання, але посилався на цей власний вигляд у файлі макета з неправильним ім'ям. Замість цього <com.example.customview/>я включив <com.customview/>у файл макета XML.


2

Я зіткнувся з тією ж проблемою і вирішив її, виконавши наступне:

У меню побудови виберіть

1- чистий проект.

2- Створення APK.


Я завжди годинами шукаю рішення щодо SO і виявляється Clean -> Build - це все, що мені потрібно було зробити.
Shishir Shetty

2

Я зіткнувся з тією ж проблемою і помітив, що зразок коду було поміщено в каталог "java" замість каталогу "src". Після переміщення коду до src проблема була вирішена.

Також переконайтесь, що каталог додатків розділений на кілька папок. наприклад, /main/com/site/appname/ні/main/com.site.appname/

Сподіваюся, це працює ~


Ви прибили проблему, яку я мав на голові! Недостатньо сну, навіть не підозрював, що заняття знаходяться в папці Java :)
bran.io

2

Я стикаюся з тією ж проблемою, і після великої роботи та пошуку я придумав рішення: я просто очистив проект, а потім створив apk. -Build-> Clean Project -Build-> Build APK (s) Я сподіваюся, це корисно .....


1

У мене ця проблема була нещодавно, і я використовую Android Studio 0.8.4

Проблема полягала в тому, що я вирішив перейменувати файл макета меню XML, який називався main.xml.

Клацніть правою кнопкою миші та виберіть Refactor -> Rename . Перш ніж перейменовувати його, обов’язково зніміть прапорець біля пункту «Шукати в коментарях та рядках» і натисніть Рефактор .

Оскільки мій файл спочатку називався 'main' , він перейменовував критичні шляхи в app.iml та build.gradle, головним чином java.srcDirs у build.gradle, оскільки шлях визначається як 'src/main/java'.

Сподіваюсь, це допоможе тим, хто може зіткнутися з цією проблемою.


1

У мене виникла ця проблема після оновлення з версії 18. Після оновлення у мене було таке: Ціль побудови проекту - 5,01, targetSDKVersion = 21

Але: Інструменти побудови все ще були з Android 4.3.1 (18). Що я помітив, це те, що ті програми, які виводили свою діяльність з ActionBarActivity, аварійно завершили роботу із зазначеною вище помилкою, і ті, які все ще не працювали.

Тож простим виправленням було використання найновіших інструментів збірки Android SDK 21.1.2 замість лише Android SDK 18, що здається якимось типовим.

Тож винуватцем видається бібліотека Appcompat, яку я використовую для зворотної порівняльності Actionbar.

І до речі : за допомогою бібліотеки appcompat мені довелося встановити / виправити: $SDKInstallDIR$\Android\android-sdk\extras\android\support\v7\appcompat\project.properties target=android-21(що було рекомендовано в іншому корисному дописі і яке за замовчуванням має значення 19))


1

У мене була та сама проблема у Windows. Я перейменував шлях до проекту на щось, що містить пробіл.

Переконайтеся, що шлях до вашого проекту не містить пробілу.


Про який шлях ти говориш?
Якісний каталізатор

1

Згадане тут рішення -> Рішення Multidex Issue для мене спрацювало. Нижче наведено те, що потрібно додати до контексту програми:

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

0

У мене була ця проблема, порушена з кількох причин, але я бачу це у вашому стеці " **Unable to instantiate activity ComponentInfo{...}: java.lang.ClassNotFoundException: Didn't find class "..." on path: DexPathList[[**", я виявив різницю в моїй, .classpathперш ніж вона перестане працювати.

 <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

Я ДОДАВ рядок:

<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>

це остаточна версія:

  <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

Тепер це працює! =)


0

У мене була така сама точна проблема. Як запропонував @weiweia, перенесіть код із каталогу Java у src, який працював у мене. Я також видалив Залежності Android з Проекту -> Властивості -> Шлях побудови Java -> Замовлення та експорт і переконався, що на екрані Android включено лише проекти бібліотеки.


0

У мене ця проблема була досить давно, і, як і у всіх інших, відповіді вище не стосувались мого проекту.

У своєму проекті я пов’язав проект зі своїм проектом, і він кидав ClassDefNotFoundError кожного разу, коли виконувався якийсь код іншого проекту.

Тож це було моє рішення. Я перейшов до властивостей проекту свого проекту та Java Build Path. Натиснув вкладку "Source" та "link source" із папки src іншого проекту на мій власний проект і назвав нову папку "core-src".

Сподіваюся, це рішення комусь допоможе


0

У мене було те саме питання. Я використовую Xamarin.Android.

Проблема в моєму випадку полягала в тому, що я змінив versionCode та versionName.

У мене не було проблем, коли я встановив їх так:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pac.ka.ge" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">

Проблема з’явилася, коли я змінив її на цю (versionCode 2 та versionName 0.0.1):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=" pac.ka.ge " android:versionCode="2" android:versionName="0.0.1" android:installLocation="auto">

Я виправив проблему, змінивши на versionCode 2 і versionName 1.0.0.1, приблизно так:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=" pac.ka.ge " android:versionCode="2" android:versionName="1.0.0.1" android:installLocation="auto">

Я не впевнений, чому це було проблемою, можливо, Android не любить нижчу версію Name з вищою версією Code?

Я знайшов таке на http://developer.android.com/guide/topics/manifest/manifest-element.html#vname

android: versionCode Внутрішній номер версії. Цей номер використовується лише для того, щоб визначити, чи одна версія є більш пізньою, ніж інша, а більші цифри означають новіші версії. Це не номер версії, показаний користувачам; це число встановлюється атрибутом versionName. Значення має бути встановлене як ціле число, наприклад "100". Ви можете визначити його як завгодно, якщо кожна наступна версія має більший номер. Наприклад, це може бути номер збірки. Або ви можете перекласти номер версії у форматі "xy" у ціле число, кодуючи "x" та "y" окремо в нижньому та верхньому 16 бітах. Або ви можете просто збільшити кількість на одиницю кожного разу, коли виходить нова версія.

android: versionName Номер версії, показаний користувачам. Цей атрибут можна встановити як необроблений рядок або як посилання на рядовий ресурс. Рядок не має жодної іншої мети, окрім як відображатись користувачам. Атрибут versionCode містить значущий номер версії, який використовується всередині.


0

Про всяк випадок, якщо хтось зіткнеться з такою ж проблемою, як я, і жодна пропозиція відповіді тут не допоможе.

Для мене причиною було те, що рефактор студії Android не працює. Я перемістив внутрішній клас за межі класу, який був видом, і тому також мав xml, де був встановлений прямий шлях. Студія не переробить цей шлях! І жодної помилки не буде викинуто.

Сподіваюся, це комусь допомагає. Ура.


0

У нашому випадку ми хотіли скомпілювати версію Vagrant і мали таку ж помилку. Ми виправили це за допомогою clean projectі rebuild projectв меню побудови


0

Я просто перезапустив пристрій і запустив програму. Це працювало без жодних проблем. Сподіваюся, це комусь допомагає :)


0

Я виявив цю помилку в Android Studio, коли спробував виконати налагодження на пристрої з API 23 , тому перевірив Android Studio і помітив, що я не інсталював цю версію API 23 . Після встановлення я вирішив проблему.


0

У мене була така проблема кілька разів, і часто я не робив щось очевидно неправильне із залежностями.

Завжди гарною ідеєю є перевірити, чи присутній у останньому apk цей клас „не знайдено”. Якщо це так, як це траплялося в моїх випадках, проблема зазвичай полягає в:

Справа не в тому, що даний клас не знайдено, але його не можна завантажити, оскільки його суперклас відсутній.

Перевірте, чи доступний клас, який ви розширюєте, а потім спробуйте відповідним чином виправити сценарій збірки або залежності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.