java.lang.ClassNotFoundException: Не знайшов клас на шляху: dexpathlist


140

Зараз я працюю над проектом, в якому я повинен використовувати суто рідний 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
Ваша програма багатодекларована? Якщо так, то це пояснює проблему.
ІгорГанапольський

коли я зробив підписаний apk, ця помилка не сталася. просто налагодження
j2emanue

Ви знайшли робоче рішення?
Бенобаб

Відповіді:


84

Я спробував усі можливі варіанти, але результат дорівнює нулю. Нарешті я знайшов правильне рішення, яке корисно для мене. Просто перейдіть до відключення миттєвого запуску. Перейдіть у меню Файл -> Налаштування -> Збірка, виконання, розгортання -> Миттєвий запуск -> Зніміть прапорець для миттєвого запуску . Запустіть додаток один раз, і цей файл apk належним чином працює ..


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

2
Я шукав цю відповідь цілими днями, навіть тижнями! Незважаючи на те, що це не критично, це питання лежить у моїй думці, не даючи мені спокою. Ніколи не думав, що це викликає миттєвий запуск. Мій додаток справно працював під час запуску через adb, але завжди виходив із очікувань виконання ClassNotFound під час встановлення вручну через apk.
Разван Барбу

5
Це не для мене рішення. Я відключив миттєвий пробіг
Тералогія

Після відключення параметрів. Перезапустіть свою андроїд-студію
Ashik Abbas

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

63

У мене була подібна проблема, ось моє рішення:

  1. Клацніть правою кнопкою миші на вашому проекті та виберіть Властивості .
  2. Виберіть Java Build Path у меню зліва.
  3. Виберіть вкладку " Замовлення та експорт" .
  4. Зі списку переконайтеся , що бібліотеки або зовнішні банки, додані до вашого проекту перевіряються .
  5. Нарешті, очистіть проект та запустіть.

Ви також можете перевірити цю відповідь.


1
Це правильне вирішення питання. Я перевірив це на своїй грі libgdx з тими ж помилками, що і вище. Я виявив ці помилки, використовуючи журнал, сформований на моєму телефоні (samsung galaxy S6). Як тільки я застосував це рішення, всі мої питання були вирішені.

25
Я не можу знайти властивості, клацнувши правою кнопкою миші проекту. Може бути, я дурний. :(
Zin Min

12
Я також не можу знайти властивості, ніхто не з'ясував, як перейти на перелічену сторінку
Skyler

9
Це рішення для IDE Eclipse. У студії Android немає типового файла "project.properties". Його можна створити, хоча.
Бот

Забезпечене рішення застосовується лише для Eclipse IDE.
mnsalim

47

Це, здається, є проблемою у вашому випадку. Відносний шлях вашої діяльності в маніфесті невірний:

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

замініть це на:

<activity android:name=".POMActivity"

або

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

31

Видалення програми на пристрої та очищення проекту працює для мене


2
Це теж працювало для мене з реагуванням на місця. Я відкрив папку Android на Android Studio, а потім побудував -> чистий проект. react-native run-android
Побудували

Зробив те саме, що коментар вище, і це спрацювало! Дякую !
Елегія

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

Потім розгорніть клас Application класом за MultiDexApplicationінструкцією на вищезазначеному посиланні (або оголосіть клас додатка в функції AndroidManifest.xmlабо замініть, attachBaseContext()якщо це неможливо для розширення класу додатків).

Це все, і це вирішило проблему.


1
Додавання мультидекса корисно лише тоді, коли ви перейдете ліміт підрахунку посилань (56k), і це так дуже нестабільно і дуже ненадійно перед Lollipop. Це слід використовувати для виправлення неполадок в крайньому випадку.
milosmns

то яким має бути рішення за вами
Акаш Бісарія

Я просто кажу, що мультидекс викликає більше проблем, ніж допомагає, що чітко зазначено на веб-сайті розробника. Я б тут не шукав відповіді, якби у мене був такий?
milosmns

1
Добре дякую за інформацію, будь ласка, оновіть тут, якщо ви знайшли хороше рішення, це буде чудовою допомогою.
Акаш Бісарія

2
Додавання рядка до залежностей вище зробив це для мене.
gadildafissh

23

Просто спробуйте Очистити проект та відновити проект .


1
У меню "Збірка". Виберіть " Збірка" - "Очистити проект", а потім " Створити" - "Відновити проект"
kangkyu

Це означає, що додаток виходить з ладу лише локально, але збій також відбувається у версії випуску, тому це насправді не є рішенням.
Девід

22

Цей виняток також може виникати, якщо у вашому макеті є такий власний вигляд :

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

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


Це було корисно з іншої причини. Перевірте правопис. У мене було неправильно написане ім'я класу, що спричинило вихідну проблему.
Беррі Вінг


12

Я вирішив це за допомогою: ./gradlew --stopкоманда в терміналі андроїд-студії. Після виконання цієї команди очистіть і відновіть проект.


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

працював на мене.


10

Для будь-кого, хто має мультидексельне включення, напиши це

всередині 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
    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. Це необхідно, якщо ви хочете використовувати мультидекс
Manohar Reddy

Погодьтеся. Я використовую або MultiDexApplicationабо attachBaseContext(див. Developer.android.com/studio/build/multidex ).
CoolMind

8

Я стикався з цим питанням кілька разів, і всі вони вирішуються, відключивши функцію Instant Run .


Перепробувавши кілька рішень, ця дрібниця вирішила проблему, неймовірно!
Фрак

@FraK, найпопулярніше рішення містить цю пораду. Хоча я вже не перевірив миттєвий запуск (кілька років він приносив багато помилок).
CoolMind

7

Нам не потрібно мати спеціальний клас програми, який розширює програму 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 (Модуль: додаток),

defaultConfig {
      ...

      // Enabling multidex support.
      multiDexEnabled true
}

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

Дякую.


Зміна назви програми, працював для мене, коли я намагався запустити додаток на android 4.3
h8pathak

6

Коли ви використовуєте мультидекс, спробуйте розширити свій клас додатків за допомогою програми MultiDexAppication замість програми та замінити метод нижче, ніж це потрібно для Android нижче 5,0 (оскільки підтримка мультидекса становить 5,0 і вище)

@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 >після чого почистіть проект . TADA бачити чари :)


назва папки - лише libs
Killer

4

У моєму випадку це питання виникло через Котліна. У моєму існуючому коді був клас, який писав Котлін. Я створив додаток, він встановився, і як тільки перша активність відкрилася, програма зазнала краху. у 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" />

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 у затемненні, але це не спрацювало, тому мені довелося додати його вручну, і він працював


3

У мене виникла ця аварія лише на пристроях Samsung Lollipop, і це рішення працювало на мене.

dexOptions {
     preDexLibraries false
}

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


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

2

Наступне рішення працювало для мене ...

Я спробував усе, що було сказано вище, але все ще не запустив свою програму. У мене є реактивна програма, що працює на останній версії gradle 4+ та android studio.

У мене виникла проблема, коли, якщо я запускаю натиснуту на 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+ використовує цей делекс за замовчуванням
Lennon Spirlandelli

2

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

debug {
            minifyEnabled false

        }

1

Згідно з моїм розумінням, я отримую проблему після оновлення андроїд-студії 2.1 до 2.3 через миттєву функцію, моя програма не запуститься, коли я скопіюю apk з виводу та покладу в sdcard. Для цієї проблеми я будую apk from build option, будую apk в android studio.


1

Якщо ви ввімкнено minifyEnabledі shrinkResourcesсправжній файл у файлі gradle програми. Потрібно додати наступний рядок у proguard-rules.proфайл

-keep клас com.yourpackage_name. ** {*; }

тому що для мінімізації видалено деякі важливі класи в нашому файлі apk.


Це не гарне рішення, оскільки воно виключає всі ваші вихідні файли зі скорочення ресурсів. Виключіть лише ті файли, які дійсно потрібні замість цього, інакше ви збільшите розмір apk.
Яник

1

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

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

1

У моєму випадку я використовував стару бібліотеку простору імен, коли мій проект був створений з використанням Android android.

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


1

у моєму випадку я визначив активність у Manifest.xmlі забув створити будь-яку activity. Тож я створив Діяльність і визначив її, manifestі моя помилка була вирішена!


0

Якщо ви отримаєте цю помилку після видалення деякої залежності від Gradle, перевірте свій маніфест і переконайтесь, що ви видалили всі записи, що відповідають цій залежності.


Не додайте однакову відповідь на кілька запитань. Дайте відповідь найкращому, а решту позначте як дублікати. Див. Чи прийнятно додати дублюючу відповідь на кілька запитань?
Петтер Фріберг

0

Для мене випуск з’явився після того, як я створив підписаний APK. Щоб виправити це, я створив новий, налагоджувальний apk за допомогою Run / Build APK. Після цього Run (cmd + r) знову працює без цієї помилки.


0

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


0

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

<com.my.app.wrong.package.MyActivity
    android:id="@+id/myActivity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:paddingTop="16dp"
    android:paddingBottom="8dp"
    android:gravity="left" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.