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: я полностью перестроил проект и не смог воспроизвести ошибку. Не уверен, что было причиной.

Phito
источник
2
ты пользуешься прогардом?
Juangcg
Proguard не включен.
Phito
Отметьте это сообщение: stackoverflow.com/questions/10866431/…
Juangcg
попробуйте вместо этого ".Login" в android: name, Android добавит остальную часть префикса самостоятельно, если не сможет ее обнаружить. Может быть просто странная проблема с анализом Eclipse
Дэррил Бейлисс
@Juangcg Я прочитал этот пост перед тем, как написать этот, но, к сожалению, все, что я пробовал оттуда, не сработало.
Phito,

Ответы:

76

У меня была такая же проблема с моим проектом. Это произошло из-за конфликта в версии библиотеки поддержки Android между моим проектом и проектом библиотеки, который я добавил в свой проект. Поместите ту же версию библиотеки поддержки Android в свой проект и проекты библиотеки, которые вы включили, и очистите сборку ... Все будет работать ...

Баладжи Дханасекар
источник
3
Спасибо чувак!!! Я был уверен, что уже сделал, но проверил, версии разные! Большое спасибо!
Родриго Венансио
2
Я комментирую это, чтобы не забыть в следующий раз «обновить» SDK, посмотрите этот ответ
Энрике Сан-Мартин
1
Есть идеи, почему проблема возникает, если я не использую библиотеки поддержки?
Budda
33

Этот следующий метод сработал для меня

  • Щелкните правой кнопкой мыши projectи выберитеproperties
  • Откроется панель «Свойства для». В меню слева выберите Java Build Path->Order and Export
  • В списке ниже снимите флажок рядом с "Android Dependencies"
  • Наконец clean your projectи запустите
Крис
источник
8
Это сработало для меня. Что означает «зависимости Android» и почему они помогли в данном конкретном случае?
Олег Гриб
У меня отлично сработало! Большое спасибо!
Prajitdas
7
Это инструкции для затмения? Я не могу следовать этим инструкциям для студии Android. Что у меня project? Что это значит?
Адам Джонс
1
Да, эти инструкции предназначены для затмения
Крис
2
Эта ссылка содержит шаги для Android Studio stackoverflow.com/questions/18533054/…
Джозеф Селварадж,
13

Для тех из вас , кто с этой проблемой на Android Studio, у меня была такая же проблема , после слияния и по какой - то причине он даже сохраняется после cleanи invalidate cash/restartоперации, сводит меня с ума.

Оказывается, это можно исправить, запустив gradle build один раз из командной строки. Просто запустите в каталоге проекта следующую команду:

./gradlew assemble clean
./gradlew assemble

Я надеюсь, что это сэкономит кому-то трату времени и разочарование, через которые мне пришлось пройти.

Иман Акбари
источник
Сработало и
12

У меня была такая же проблема, это сработало для меня

1) Полный путь активности в mainfest вместо относительного пути.

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

Рам Мехар Десвал
источник
У меня сработало удаление папки сборки. Я потерял несколько часов на этом вопросе, Спасибо
Guy S
У меня тоже сработало. Спасибо.
Душянт Сутар
Это реальная сделка. XD
noob-Sci-Bot
9

Если вы используете Eclipse, попробуйте Project -> Clean

Данило Силва
источник
Работает для студии Android - Очистить / Восстановить проект и запустить
frcake
8

Если вы добавили новый Library Projectмодуль в свой проект Android и используете его Kotlinв своей библиотеке , не забудьте добавить

apply plugin: 'kotlin-android'

в начало файла Gradle вашего модуля. Android Studio не добавляет эту строку при создании нового модуля, и это может тратить ваши часы, как я.

Изменить: через некоторое время я снова боролся с этой проблемой, и на этот раз я забыл добавить свой модуль в качестве зависимости от проекта. :)

спасти население
источник
Решил это за меня, и я просто хотел опубликовать ответ. Кто переходит на вторую страницу SO в поисках решения?
Куно
Эта проблема возникает, когда мы используем проект библиотеки Java ... это решение
устранило
7

Это происходит, если мы меняем путь сборки приложения, это может быть в любом случае добавления, удаления или изменения библиотек или файла .jar. Лучшее решение - перезапустить Eclipse.

пионер Бхона
источник
6

Если вы получаете эту ошибку при использовании новой функции мгновенного запуска в Android Studio 2.0 и более поздних версиях, то это своего рода ошибка на их стороне.
Чтобы исправить это, вам придется вручную остановить приложение на устройстве / эмуляторе, если оно не остановлено, затем в Android Studio выберите BuildRebuild Project.
Затем нажмите кнопку « Выполнить» или SHIFT + F10.

вовахост
источник
6

Для всех, у кого есть поддержка multidex, напишите это

внутри 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">
Манохар Редди
источник
оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо :) :)
Сачин Варма
рад, что это помогло :)
Манохар Редди
2
Главное - расширить приложение из MultiDexApplicationкласса, а не из Application.
VSB
Спасибо. У меня уже было какое-то приложение в манифесте. Расширен 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 / сборочные инструменты / 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.

Петр Миллер
источник
То же самое, попробовал все и перезапустил после вашего комментария. Я увидел в своих выводах ссылку на имя реорганизованного класса, которое «Не удалось найти», несмотря на то, что я стер всю папку сборки ... только что
Алвин Кеслер
2

Я столкнулся с этой ошибкой один раз, когда определил класс, расширяющий представление, но ссылаясь на это настраиваемое представление в файле макета с неправильным именем. Вместо этого <com.example.customview/>я включил <com.customview/>в файл макета XML.

Цена
источник
2

Я столкнулся с той же проблемой и решил ее, выполнив следующие действия:

В меню сборки выберите

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

2- Соберите APK.

Aaeb
источник
Я всегда часами ищу решение для SO, и оказывается, что Clean -> Build - это все, что мне нужно было сделать.
Шишир Шетти
2

Я столкнулся с той же проблемой и заметил, что образец кода был помещен в каталог «java» вместо каталога «src». После переноса кода в src проблема была решена.

Также убедитесь, что каталог приложения разделен на несколько папок. например, /main/com/site/appname/не/main/com.site.appname/

Надеюсь, это сработает ~

Weiweia
источник
Вы пригвоздили мою проблему к голове!
Недосыпал
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 Build Tools 21.1.2 вместо только инструментов Android SDK Build Tools 18, которые почему-то кажутся по умолчанию.

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

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

Петр Рудник
источник
1

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

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

Винсент Хьюберт
источник
О каком пути ты говоришь?
Quality Catalyst
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>

Теперь это работает! знак равно

Jorgesys
источник
0

У меня была такая же проблема. Как предложил @weiweia, перемещение кода из каталога java в src сработало для меня. Я также удалил зависимости Android из Project -> Properties -> Java Build Path -> Order and Export и убедился, что на экране Android включены только проекты библиотеки.

bran.io
источник
0

У меня была эта проблема довольно долгое время, и, как и все остальные, приведенные выше ответы не относились к моему проекту.

В моем проекте я связал проект с моим проектом, и он бросал ClassDefNotFoundError каждый раз, когда выполнялся какой-то код для другого проекта.

Так что это было моим решением. Я перешел к свойствам проекта и пути сборки Java. Нажал вкладку «Источник» и «источник ссылки» из папки src другого проекта в мой собственный проект и назвал новую папку «core-src».

Надеюсь, это решение кому-то поможет

user3906863
источник
0

Я была такая же проблема. Я использую Xamarin.Android.

В моем случае проблема заключалась в том, что я изменил код версии и имя версии.

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

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

Я исправил проблему, изменив код версии 2 и имя версии 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 не нравится более низкая версия versionName с более высоким versionCode?

Я нашел следующее на http://developer.android.com/guide/topics/manifest/manifest-element.html#vname

android: versionCode Внутренний номер версии. Этот номер используется только для определения того, является ли одна версия более поздней, чем другая, причем более высокие числа указывают на более свежие версии. Это не номер версии, показываемый пользователям; это число устанавливается атрибутом versionName. Значение должно быть целым числом, например «100». Вы можете определить его как хотите, если каждая последующая версия будет иметь более высокий номер. Например, это может быть номер сборки. Или вы можете перевести номер версии в формате «xy» в целое число, кодируя «x» и «y» отдельно в младших и старших 16 битах. Или вы можете просто увеличивать число на единицу каждый раз при выпуске новой версии.

android: versionName Номер версии, показываемый пользователям. Этот атрибут может быть установлен как необработанная строка или как ссылка на строковый ресурс. Строка не имеет другого назначения, кроме отображения для пользователей. Атрибут versionCode содержит значимый номер версии, используемый внутри.

PeterH
источник
0

На всякий случай, когда кто-то сталкивается с той же проблемой, что и я, и никакой предлагаемый ответ здесь не помогает.

Для меня причина заключалась в том, что рефакторинг студии Android глючил. Я переместил внутренний класс за пределы класса, который был представлением и, следовательно, также имел xml, в котором был установлен прямой путь. Этот путь не будет реорганизован студией! И никакой ошибки не будет.

Надеюсь, это кому-нибудь поможет. Ура.

JacksOnF1re
источник
0

В нашем случае мы хотели скомпилировать версию Vagrant и получили ту же ошибку. Мы исправили ее clean projectи rebuild projectв менюПостроениевыберите

Рафаэль
источник
0

Я просто перезапустил устройство и запустил приложение. Работало без проблем. Надеюсь, это кому-то поможет :)

Камесвари
источник
0

Я обнаружил эту ошибку в Android Studio, когда попытался выполнить отладку на устройстве с API 23 , поэтому я проверил Android Studio и заметил, что не установил эту версию API 23 . После установки решил проблему.

Родриго Келеброне
источник
0

У меня была эта проблема несколько раз, и часто я не делал что-то явно неправильное с зависимостями.

Всегда полезно проверить, присутствует ли этот класс «не найден» в финальном apk. Если это так, как это было в моих случаях, проблема обычно в следующем:

Дело не в том, что данный класс не найден, но он не может быть загружен, потому что отсутствует его суперкласс.

Убедитесь, что класс, который вы расширяете, доступен, а затем попытайтесь соответствующим образом исправить сценарий сборки или зависимости.

Michalbrz
источник