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" на другое, но вы также забываете изменить его в макете.

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

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

./gradlew clean

или

./gradlew cleanBuildCache

или для окон

gradlew cleanBuildCache

https://developer.android.com/studio/build/build-cache.html

Ромуальд
источник
Большое спасибо :)
Салман Уллах Хан
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'
Kabore Abdoul Mohamine
источник
Мы должны переопределить этот метод, если мы расширяемся от Application. Почему мы должны переопределить в случае MultiDexAppication?
CoolMind
4

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

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

Properties > Java Build Path > libraries :

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

Hemantsb
источник
имя папки только 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

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

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

debug {
            minifyEnabled false

        }
Hofs
источник
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
j2emanue
источник
1

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

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

Андрей Артамонов
источник
1

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

сана эбади
источник
0

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

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

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

Passatgt
источник
0

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

П.К. Гупта
источник