java.lang.ClassNotFoundException: не удалось найти класс по пути: dexpathlist


145

В настоящее время я работаю над проектом, в котором мне нужно использовать исключительно собственный ndk. Это сработало, когда я попытался запустить пример helloworld из исходников движка Irrlicht. Затем я пытаюсь использовать его в своем проекте, следуя тому же формату, что и в этом примере. Но я получил:

03-14 01:40:05.308: E/AndroidRuntime(799): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.irrlicht.example1/android.app.POMActivity}: java.lang.ClassNotFoundException: Didn't find class "android.app.POMActivity" on path: DexPathList[[zip file "/data/app/com.irrlicht.example1-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.irrlicht.example1-2, /system/lib]]

при запуске моего проекта.

Вот мой файл main.cpp:

#include <android/log.h>
#include <jni.h>
#include <android_native_app_glue.h>
#include "android_tools.h"
#ifdef _IRR_ANDROID_PLATFORM_
void android_main(android_app* app)
{
__android_log_print(4 , "pom" , "nothing");
}

#endif

в Android.mk:

LOCAL_PATH := $(call my-dir)/..
IRRLICHT_PROJECT_PATH := $(LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := Irrlicht
LOCAL_SRC_FILES := /home/karthik/Android/Essentials/ogl-es/lib/Android/libIrrlicht.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloWorldMobile1
LOCAL_CFLAGS := -D_IRR_ANDROID_PLATFORM_ -pipe -fno-exceptions -fno-rtti -fstrict-aliasing
LOCAL_C_INCLUDES := -I ../../include -I /home/karthik/Android/Essentials/ogl-es/include -I /home/karthik/Android/json/jsoncpp-src-0.5.0/libs/linux-gcc-4.8 -I /home/karthik/Android/json/jsoncpp-src-0.5.0/include/json 
LOCAL_SRC_FILES :=  android_tools.cpp main.cpp
LOCAL_LDLIBS := -lEGL -llog -lGLESv1_CM -lGLESv2 -lz -landroid -ldl 
LOCAL_STATIC_LIBRARIES := Irrlicht android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)

И я дал имя действия в AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.irrlicht.example1"
    android:versionCode="1"
    android:versionName="1.0">
...
<application android:icon="@drawable/irr_icon" android:label="HelloWorldMobile1" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:debuggable="true">
        <activity android:name="android.app.POMActivity"
        android:label="HelloWorldMobile1"
        android:launchMode="singleTask"
        android:configChanges="orientation|keyboardHidden"
        android:screenOrientation="portrait"
        android:clearTaskOnLaunch="true">
        <meta-data android:name="android.app.lib_name" android:value="HelloWorldMobile1" />                     

Какую ошибку я здесь делаю? При необходимости выложу полный код.


1
Вы используете какие-либо внешние файлы jar?
Siddharth_Vyas

@SiddharthVyas Нет, я не использую здесь внешние файлы jar.
Karthik Sivam

1
Ваше приложение мультидексировано? Если да, то это объясняет проблему.
Игорь Ганапольский 09

когда я сделал подписанный apk, этой ошибки не было. только отладка
j2emanue 05

Нашли рабочее решение?
Benobab

Ответы:


85

Перепробовал все возможные варианты, но результат нулевой. Наконец я нашел правильное решение, которое мне помогло. Просто зайдите, чтобы отключить Instant Run. Перейдите в File -> Settings -> Build, Execution, Deployment -> Instant Run -> Снимите флажок для мгновенного запуска . Запустите приложение один раз, и этот apk-файл заработает правильно.


11
Это правильный ответ для Android Studio. Я не могу поверить, что Instant Run все еще настолько глючит, что вам приходится отключать его, чтобы избежать неприятных сюрпризов ...
Огнян

2
Я искал этот ответ несколько дней, а то и недель! Хотя это и не критично, этот вопрос был у меня на уме, не давая мне покоя. Никогда не думал, что мгновенный бег был причиной этого. Мое приложение работало нормально при запуске через adb, но всегда вылетало из-за ожидания выполнения ClassNotFound при ручной установке через apk.
Рэзван Барбу

6
Для меня это не решение. Я отключил мгновенный запуск
Terranology

После отключил опции. Пожалуйста, перезапустите свою студию Android
Ашик Аббас

Боже мой, я не знаю, почему виноват мгновенный бег, но это действительно так, спасибо, чувак.
KingKongCoder

63

У меня была аналогичная проблема, вот мое решение:

  1. Щелкните правой кнопкой мыши свой проект и выберите " Свойства" .
  2. Выберите Java Build Path в меню слева.
  3. Выберите вкладку « Порядок и экспорт ».
  4. Из списка убедитесь , что библиотеки или внешние банки, добавленные к вашему проекту проверяются .
  5. Наконец, очистите свой проект и запустите.

Вы также можете проверить этот ответ.


1
Это правильное решение вопроса. Я тестировал это с моей игрой libgdx с теми же ошибками, что и выше. Я обнаружил эти ошибки, используя журнал, созданный моим телефоном (samsung galaxy S6). Как только я применил это решение, все мои проблемы были решены.

26
Я не могу найти свойства, щелкнув правой кнопкой мыши по проекту. Может я и дурак. :(
Zin Min

13
Я тоже не могу найти свойства, никто не
Скайлер

11
Это решение для Eclipse IDE. В Android Studio нет файла project.properties по умолчанию. Но его можно создать.
Бот

Предоставленное решение применимо только для Eclipse IDE.
мнсалим

49

Кажется, это проблема в вашем случае. Относительный путь вашей активности в манифесте неверен:

<activity android:name="android.app.POMActivity"

замените это на:

<activity android:name=".POMActivity"

или

<activity android:name="com.irrlicht.example1.POMActivity"

32

У меня работает удаление приложения на устройстве и очистка проекта


2
Это сработало для меня тоже с реагирующим родным. Я открыл папку Android с Android Studio, а затем построил -> чистый проект. Восстановил его с помощьюreact-native run-android
pinguinos

Сделал то же, что и комментарий выше, и это сработало! Благодарность !
Elegya

25

Просто попробуйте Clean Project & Rebuild Project .


2
В меню «Сборка». Выберите Build -> Clean Project, а затем Build -> Rebuild Project
kangkyu

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

24

Я должен понять проблему, просто увидев

dex ошибки

Но на устранение проблемы ушло полдня.
Я исправляю это, следуя инструкциям на странице разработчиков Android: https://developer.android.com/studio/build/multidex.html

Сначала добавьте это в файл gradle.build:

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ...

    // Enabling multidex support.
    multiDexEnabled true
}

 dependencies {
     compile 'com.android.support:multidex:1.0.0'
 }

Затем расширите класс приложения классом, MultiDexApplicationкак указано в приведенной выше ссылке (или объявите класс приложения AndroidManifest.xmlили переопределите attachBaseContext()функцию, если невозможно расширить класс приложения).

Вот и все, и проблема решена.


1
Добавление multi-dex полезно только тогда, когда вы превысите предел количества ссылок (56k), и это было очень нестабильно и очень ненадежно до Lollipop. Это следует использовать для устранения проблем в крайнем случае.
milosmns

тогда каким должно быть решение, по вашему мнению
Акаш Бисария

Я просто говорю, что multi-dex доставляет больше проблем, чем помогает, о чем четко сказано на сайте разработчика. Я бы не стал здесь искать ответ, если бы он у меня был, не так ли?
milosmns

1
Хорошо, спасибо за информацию, пожалуйста, обновите здесь, если вы нашли хорошее решение, это будет большим подспорьем.
Акаш Бисария

2
Добавление строки в зависимости выше сделало это за меня.
gadildafissh

22

Это исключение также может возникнуть, если у вас есть настраиваемый вид в макете, например:

<com.example.MyView
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

и вы меняете имя пакета представления с "com.example" на другое, но вы также забываете изменить его в макете.


Это было полезно по другой причине. Проверить правильность написания. У меня было неправильное имя класса, вызывающее исходную проблему.
Berry Wing


12

Я решил это, используя ./gradlew --stopкоманду : в терминале студии Android. После выполнения этой команды очистите и перестройте проект.


11
  1. удалить папку bin
  2. изменить порядок библиотек
  3. очистить и восстановить

работал у меня.


10

Для всех, у кого есть поддержка 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">

Как enableMultiDexвлияет? В моем случае javaMaxHeapSize "4g"не помогло.
CoolMind

@CoolMind Это просто расширяемый класс приложения MultiDexApplication. Это необходимо, если вы хотите использовать мультидекс
Манохар Редди

Согласен. Я использую либо MultiDexApplicationили attachBaseContext(см. Developer.android.com/studio/build/multidex ).
CoolMind

8

Я сталкивался с этой проблемой несколько раз, и все они решаются отключением Instant Run .


Пробовал несколько решений, эта мелочь решила проблему, невероятно!
FraK

@FraK, наиболее популярное решение содержит этот совет. Хотя я уже отключил Instant Run (несколько лет он приносил много ошибок).
CoolMind

7

Нам не нужно настраивать класс Application, расширяющий MultiDexApplication . Вместо этого мы можем сделать это в AndroidManifest.xml

<application
android:name="android.support.multidex.MultiDexApplication"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

И вместе с этим в build.gradle (Module: app),

defaultConfig {
      ...

      // Enabling multidex support.
      multiDexEnabled true
}

dependencies {
     ... 
     compile 'com.android.support:multidex:1.0.2'
}

Спасибо.


У меня сработало изменение имени приложения, когда я пытался запустить приложение на android 4.3
h8pathak

6

Когда вы используете multidex, попробуйте расширить класс вашего приложения с помощью MultiDexAppication вместо Application и переопределите метод ниже, который требуется для Android ниже 5.0 (поскольку 5.0 и выше поддерживает multidex)

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

и в зависимостях добавьте это

compile 'com.android.support:multidex:1.0.1'

Мы должны переопределить этот метод, если мы расширяемся от Application. Почему мы должны переопределить в случае MultiDexAppication?
CoolMind

4

Просто измените имя папки с libна libs,

Затем вы увидите несколько отметок об ошибках в своем проекте, чтобы исправить это, щелкните правой кнопкой мыши по проекту>

Properties > Java Build Path > libraries :

Удалите все библиотеки с красными метками на ней, то apply > ok >после этого чистого вашего проекта . ТАДА увидеть волшебство :)


имя папки только libs
Killer

4

В моем случае эта проблема возникла из-за Kotlin. В моем существующем коде был класс, написанный на Kotlin. Я создал приложение, оно установилось, и как только первое действие открылось, приложение вылетело. в logcat отображалась эта ошибка. Затем я обновил свою версию Kotlin с веб-сайта Kotlin в файле приложения gradle. Снова соберите приложение, и тогда оно сработало нормально.


Вау, у меня проект на 99% Котлин. Что делать? :)
CoolMind

Не могли бы вы проверить, совместима ли версия Kotlin с вашей базовой Android Studio. Это просто предположение. взгляни
Гарри .Наим

У меня AS 3.3.1 и Kotlin 1.3.21. Они последние стабильные. Извините, я полагаю, что все решения, описанные выше и ниже, не подходят для моей ситуации.
CoolMind

4

Одной из возможных причин может быть неправильный путь действия в файле Apps AndroidManifest.xml. Зарегистрируйте действие в вашем AndroidManifest.xml с полным относительным путем, как показано ниже.

<activity android:name="<full_path>.ActivityName" />

4

для всех, кто сталкивается с этой проблемой сейчас, с Android Studio 4.0+ вам просто нужно включить java 8, как упоминалось здесь

android {
    defaultConfig {
            ...
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Мне потребовалась целая вечность, чтобы найти. Большое спасибо!
Принц

3

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

Right click on my main library > 
Properties > 
Android > 
Go to the very bottom of the screen and click (Add) > 
Select my other library that caused the crash >
Apply

до этого решения я использовал «Исправить настройку проекта» из файла .java в eclipse, но это не сработало, поэтому мне пришлось добавить его вручную, и это сработало


3

Я получал этот сбой только на устройствах Samsung Lollipop, и это решение сработало для меня.

dexOptions {
     preDexLibraries false
}

Я публикую этот ответ здесь, потому что этот вопрос в настоящее время является самым высоким результатом поиска в Google для этого сбоя, и ни один из приведенных выше ответов не помог мне.


Мне не помогло (Samsung Galaxy S4, Android 5.0.1).
CoolMind

2

Следующее решение сработало для меня ...

Я пробовал все, что упоминалось выше, но мое приложение все еще не запускалось. У меня есть приложение для реагирования, работающее в последней версии Gradle 4+ и студии Android.

У меня была проблема, когда, если я запускал run-android с реакцией, он не мог сказать, что он не может найти класс MainApplication ... т.е. ClassNotFoundException

Мне удалось решить проблему, когда я обновил свой gradle.properties, чтобы использовать компилятор D8.

Я добавил:

android.enableD8 = правда

в мой gradle.properties

Подробная информация о документе: https://android-developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html


1
Android Studio 3.1+ использует этот dex-компилятор по умолчанию
Леннон Спирланделли

2

Ответ Ашика Аббаса (отключить Instant Run ) работает для меня, но мне нужен Instant Run , наконец, я нашел решение, которое полезно для меня. просто отключите minifyEnabled . перейдите в build.gradle (Module: app) в блоке отладки и отключите minifyEnabled :

debug {
            minifyEnabled false

        }

1

В соответствии с моим пониманием, я получаю проблему после обновления Android Studio 2.1 до 2.3 из-за мгновенной функции, которую мое приложение не запускает, когда я копирую apk из вывода и помещаю в SD-карту. Для этой проблемы я создаю apk из опции сборки, создаю apk в студии Android.


1

Если у вас включено minifyEnabledи shrinkResourcesзначение true в вашем файле приложения gradle. Вам нужно добавить следующую строку в proguard-rules.proфайл

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

потому что минификация удаляет некоторые важные классы в нашем файле apk.


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

1

У меня была эта проблема раньше, и комментарии здесь помогали в прошлом, но на этот раз этого не произошло. Я проверил свою конфигурацию proguard и удалил следующие строки, после чего все заработало, поэтому proguard может иметь какое-то отношение к этой ошибке:

 -optimizationpasses 5
        -overloadaggressively
        -repackageclasses ''
        -allowaccessmodification
        -dontskipnonpubliclibraryclassmembers

1

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

Решение было заменить android.support.design.widget.BottomNavigationViewкомпонент с правым бежать из библиотеки поддержки: com.google.android.material.bottomnavigation.BottomNavigationView.


1

в моем случае я определяю Activity в Manifest.xmlи забыл создать activity. Итак, я создал Activity и определил его, manifestи моя ошибка решена!


0

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


Пожалуйста, не добавляйте один и тот же ответ на несколько вопросов. Ответьте на лучший, а остальные отметьте как дубликаты. См. Допустимо ли добавлять повторяющийся ответ на несколько вопросов?
Петтер Фриберг

0

Для меня проблема появилась после того, как я создал подписанный APK. Чтобы исправить это, я создал новый отладочный apk с помощью Run / Build APK. После этого Run (cmd + r) снова работает без этой ошибки.


0

Я столкнулся с той же проблемой. За день перепробовал все, но ничего не вышло. Зависимость, которая вызывала проблему, заключалась в использовании SDK более низкой компиляции, целевого SDK и минимального SDK. Я создал библиотечный модуль для проекта, скопировал все исходники и сопоставил версии sdk с версиями приложений sdk. И, наконец, это сработало как шарм.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.