java.lang.ClassNotFoundException: nie znaleziono klasy w path: dexpathlist

140

Obecnie pracuję nad projektem, w którym muszę używać czysto natywnego ndk. Zadziałało, gdy próbuję uruchomić przykład helloworld ze źródła silnika Irrlicht. Następnie próbuję użyć go w moim projekcie, postępując zgodnie z formatem z tego przykładu. Ale dostałem:

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]]

podczas prowadzenia mojego projektu.

Oto mój plik 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

w 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)

I podałem nazwę działania w 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" />                     

Jaki błąd tutaj robię? W razie potrzeby prześlę pełny kod.

Karthik Sivam
źródło
1
Czy używasz zewnętrznych plików jar?
Siddharth_Vyas,
@SiddharthVyas Nie, nie używam w tym zewnętrznych plików jar.
Karthik Sivam
1
Czy Twoja aplikacja jest wielodeksowa? Jeśli tak, to wyjaśnia problem.
IgorGanapolsky
kiedy zrobiłem podpisany apk, ten błąd się nie pojawił. po prostu
debuguj
Czy znalazłeś działające rozwiązanie?
Benobab

Odpowiedzi:

84

Wypróbowałem wszystkie możliwe opcje, ale wynik jest zerowy. W końcu znalazłem poprawne rozwiązanie, które jest dla mnie pomocne. Po prostu przejdź, aby wyłączyć Natychmiastowe uruchamianie Idź do Plik -> Ustawienia -> Kompilacja, Wykonanie, Wdrożenie -> Natychmiastowe uruchamianie -> Odznacz pole wyboru dla natychmiastowego uruchamiania . Uruchom aplikację raz, a ten plik APK będzie działał poprawnie.

Ashik Abbas
źródło
11
To jest poprawna odpowiedź dla Android Studio. Nie mogę uwierzyć, że Instant Run nadal jest tak wadliwy, że trzeba go wyłączyć, aby uniknąć przykrych niespodzianek ...
Ognyan
2
Tej odpowiedzi szukałem od dni, a nawet tygodni! Chociaż nie jest to krytyczne, ten problem tkwił w mojej głowie, nie dając mi spokoju. Nigdy nie sądziłem, że to natychmiastowy bieg jest tym, który powoduje to. Moja aplikacja działała dobrze po uruchomieniu przez adb, ale zawsze ulegała awarii z oczekiwaniem na środowisko uruchomieniowe ClassNotFound podczas ręcznej instalacji przez apk.
Răzvan Barbu
5
To nie jest rozwiązanie dla mnie.
Wyłączyłem
Po wyłączeniu opcji. Uruchom ponownie studio z
Androidem
omg, nie wiem, dlaczego przyczyną jest natychmiastowy bieg, ale rzeczywiście tak jest, dzięki stary.
KingKongCoder
63

Miałem podobny problem, oto moje rozwiązanie:

  1. Kliknij prawym przyciskiem myszy swój projekt i wybierz Właściwości .
  2. Wybierz Ścieżkę budowania Java z menu po lewej stronie.
  3. Wybierz kartę Zamów i eksportuj .
  4. Na liście upewnij się, że biblioteki lub zewnętrzne pliki JAR, które dodałeś do projektu, są zaznaczone .
  5. Na koniec wyczyść swój projekt i uruchom.

Możesz również sprawdzić odpowiedź.

mnsalim
źródło
1
To jest poprawne rozwiązanie tego pytania. Przetestowałem to z moją grą libgdx z tymi samymi błędami, co powyżej. Znalazłem te błędy, korzystając z dziennika wygenerowanego na moim telefonie (Samsung Galaxy S6). Po zastosowaniu tego rozwiązania wszystkie moje problemy zostały rozwiązane.
25
Nie mogę znaleźć właściwości po kliknięciu projektu prawym przyciskiem myszy. Może jestem głupi. :(
Zin Min
12
Nie mogę też znaleźć nieruchomości, nikt nie wymyśli, jak przejść do wymienionej strony
Skyler
9
To jest rozwiązanie dla Eclipse IDE. W Android Studio nie ma domyślnego pliku „project.properties”. Można go jednak stworzyć.
Bot
Dostarczone rozwiązanie ma zastosowanie tylko do Eclipse IDE.
mnsalim
47

Wydaje się, że w twoim przypadku jest to problem. Względna ścieżka twojej aktywności w manifestacji jest nieprawidłowa:

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

zamień to na:

<activity android:name=".POMActivity"

lub

<activity android:name="com.irrlicht.example1.POMActivity"
Sushil
źródło
31

Usunięcie aplikacji na urządzeniu i czyszczenie projektu działa dla mnie

Vlad
źródło
2
To zadziałało również dla mnie z React Native. Otworzyłem folder Androida w Android Studio, a następnie skompilowałem -> wyczyść projekt. Przebudowano go zreact-native run-android
pinguinos
Zrobiłem to samo, co komentarz powyżej i zadziałało! Dzięki !
Elegya
24

Powinienem zrozumieć problem, po prostu widząc

dex błędy

Ale rozwiązanie problemu zajęło pół dnia.
Naprawiam to, postępując zgodnie z instrukcją na stronie dla programistów Androida: https://developer.android.com/studio/build/multidex.html

Najpierw dodaj to do pliku gradle.build:

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

    // Enabling multidex support.
    multiDexEnabled true
}

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

Następnie rozszerz klasę Application o MultiDexApplicationklasę zgodnie z instrukcją w powyższym linku (lub zadeklaruj klasę aplikacji w funkcji AndroidManifest.xmllub przesłoń, attachBaseContext()jeśli nie jest możliwe rozszerzenie klasy aplikacji).

To wszystko i rozwiązało problem.

Akash Bisariya
źródło
1
Dodanie multi-dex jest przydatne tylko wtedy, gdy przekroczysz limit liczby odwołań (56k) i jest bardzo niestabilne i bardzo zawodne przed Lollipopem. Powinno to służyć do rozwiązywania problemów w ostateczności.
milosmns
jakie zatem według ciebie powinno być rozwiązanie
Akash Bisariya,
Mówię tylko, że multi-dex sprawia więcej kłopotów niż pomaga, co jest jasno określone na stronie programisty. Nie szukałbym tutaj odpowiedzi, gdybym ją miał, prawda?
milosmns
1
Ok, dzięki za informacje, zaktualizuj tutaj, jeśli znalazłeś dobre rozwiązanie, byłoby to bardzo pomocne.
Akash Bisariya
2
Dodanie linii w zależnościach powyżej zrobiło to za mnie.
gadildafissh
23

Po prostu wypróbuj Clean Project & Rebuild Project .

nicolas asinovich
źródło
1
W menu „Kompiluj”. Wybierz Build -> Clean Projektu , a następnie Build -> Rebuild projektu
kangkyu
Oznaczałoby to, że aplikacja ulega awarii tylko lokalnie, ale awaria występuje również w wersji wydania, więc tak naprawdę nie jest to rozwiązanie.
David
22

Ten wyjątek może również wystąpić, gdy masz w układzie widok niestandardowy, taki jak ten:

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

i zmieniasz nazwę pakietu widoku z „com.example” na inną, ale zapominasz o zmianie również w układzie.

petrnohejl
źródło
Było to pomocne z innego powodu. Sprawdź swoją pisownię. Miałem błędną nazwę klasy, która spowodowała pierwotny problem.
Berry Wing
12

rozwiązałem to za pomocą ./gradlew --stoppolecenia : w terminalu Android Studio. Po wykonaniu tego polecenia wyczyść i przebuduj projekt.

Ali Gürelli
źródło
11
  1. usuń folder bin
  2. zmienić kolejność bibliotek
  3. wyczyść i odbuduj

pracował dla mnie.

crazyjune
źródło
10

Napisz to dla każdego, kto ma włączoną funkcję multidex

wewnątrz 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'
}

napisz zajęcia EnableMultiDexjak poniżej

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();

    }
}

i AndroidManifest.xmlnapisz tę nazwę klasy wewnątrz tagu aplikacji

 <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">
Manohar Reddy
źródło
Jak enableMultiDexwpływa? W moim przypadku javaMaxHeapSize "4g"nie pomogło.
CoolMind
@CoolMind To po prostu klasa aplikacji, która rozszerza MultiDexApplication. Jest to konieczne, jeśli chcesz korzystać z multidex
Manohar Reddy
Zgodzić się. I użyć jednej MultiDexApplicationlub attachBaseContext(patrz developer.android.com/studio/build/multidex ).
CoolMind
8

Wielokrotnie miałem do czynienia z tym problemem i wszystkie zostały rozwiązane przez wyłączenie funkcji Instant Run .

Mohamed Nageh
źródło
Próbowałem wielu rozwiązań, ta mała rzecz rozwiązała problem, niewiarygodne!
FraK
Najlepiej oceniane rozwiązanie @FraK zawiera tę poradę. Chociaż odznaczyłem już Instant Run (od kilku lat przynosi wiele błędów).
CoolMind
7

Nie musimy mieć dostosowanej klasy Application, która rozszerza MultiDexApplication . Zamiast tego możemy mieć taki plik na 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">

Wraz z tym na build.gradle (moduł: aplikacja),

defaultConfig {
      ...

      // Enabling multidex support.
      multiDexEnabled true
}

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

Dzięki.

Abdul Gaffar
źródło
Zmiana nazwy aplikacji zadziałała, gdy próbowałem uruchomić aplikację na
Androidzie
6

Jeśli używasz multidex, spróbuj rozszerzyć klasę aplikacji za pomocą MultiDexAppication zamiast Application i zastąp poniższą metodę, która jest wymagana dla Androida poniżej 5.0 (ponieważ 5.0 i nowsze obsługują multidex)

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

iw zależnościach dodaj to

compile 'com.android.support:multidex:1.0.1'
kabore abdoul mohamine
źródło
Powinniśmy zastąpić tę metodę, jeśli rozszerzamy z Application. Dlaczego powinniśmy nadpisywać w przypadku MultiDexAppication?
CoolMind
4

Po prostu zmień nazwę folderu z libna libs,

Następnie zobaczysz kilka znaków błędów w swoim projekcie, aby rozwiązać ten problem, kliknij projekt>

Properties > Java Build Path > libraries :

Usuń całą bibliotekę z czerwonymi oznaczeniami na niej, a następnie apply > ok >po tym czystym projektu . TADA zobacz magię :)

hemantsb
źródło
nazwa folderu to tylko libs
Killer
4

W moim przypadku ten problem powstał z powodu Kotlina. W moim istniejącym kodzie była klasa, która została napisana Kotlin. Zbudowałem aplikację, zainstalowałem ją i zaraz po uruchomieniu pierwszej aktywności aplikacja uległa awarii. w logcat ten błąd był pokazywany. Następnie zaktualizowałem moją wersję Kotlin z witryny Kotlin w pliku gradle aplikacji. Zbuduj aplikację ponownie i wtedy działała dobrze.

Harry .Naeem
źródło
Wow, mam projekt Kotlin w 99%. Co robić? :)
CoolMind
Czy możesz sprawdzić, czy wersja Kotlin jest kompatybilna z Twoim podstawowym Android Studio. To tylko przypuszczenie. spójrz
Harry .Naeem
Mam AS 3.3.1 i Kotlin 1.3.21. Są najnowsze stabilne. Przepraszam, przypuszczam, że wszystkie rozwiązania opisane powyżej i poniżej nie są odpowiednie dla mojej sytuacji.
CoolMind
4

Jedną z możliwych przyczyn może być nieprawidłowa ścieżka działania w pliku aplikacji AndroidManifest.xml. Zarejestruj aktywność w swoim AndroidManifest.xml z pełną ścieżką względną, jak poniżej.

<activity android:name="<full_path>.ActivityName" />
Akki
źródło
3

po wypróbowaniu udzielonych odpowiedzi odkryłem inny powód tego samego wyjątku, że musiałem ręcznie dodać bibliotekę, której używam do mojej głównej biblioteki za pośrednictwem

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

przed tym rozwiązaniem użyłem "Fix Project setup" z pliku .java w eclipse, ale to nie zadziałało, więc musiałem dodać to ręcznie tutaj i zadziałało

Ahmed Adel Ismail
źródło
3

Dostawałem tę awarię tylko na urządzeniach Samsung Lollipop i to rozwiązanie działało u mnie.

dexOptions {
     preDexLibraries false
}

Publikuję tę odpowiedź tutaj, ponieważ to pytanie jest obecnie najwyżej ocenianym wynikiem wyszukiwania w Google dla tej awarii i żadna z powyższych odpowiedzi nie zadziałała.

blinkmacalahan
źródło
Nie pomogło mi (Samsung Galaxy S4, Android 5.0.1).
CoolMind
2

Poniższe rozwiązanie zadziałało dla mnie ...

Wypróbowałem wszystko wymienione powyżej, ale nadal nie uruchomiłem mojej aplikacji. Mam aplikację React-Native działającą na najnowszej wersji Gradle 4+ i Android Studio.

Miałem problem polegający na tym, że jeśli uruchomiłem react-native run-android, zawodził problem z informacją, że nie jest w stanie znaleźć klasy MainApplication ... tj. ClassNotFoundException

Udało mi się rozwiązać ten problem, gdy zaktualizowałem plik gradle.properties tak, aby korzystał z kompilatora D8.

Dodałem:

android.enableD8 = true

do mojego gradle.properties

Szczegóły dokumentu tutaj: https://android-developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html

nkadu1
źródło
1
Android Studio 3.1+ domyślnie korzysta z tego mechanizmu zgodnego z dex
Lennon Spirlandelli,
2

Odpowiedź Ashik abbas (wyłącz Instant Run ) działa dla mnie, ale potrzebuję Instant Run , w końcu znalazłem rozwiązanie, które jest dla mnie pomocne. po prostu wyłącz minifyEnabled . przejdź do build.gradle (Module: app) w bloku debugowania i wyłącz minifyEnabled :

debug {
            minifyEnabled false

        }
hofs
źródło
1

Zgodnie z moim rozumieniem pojawia się problem po aktualizacji Android Studio 2.1 do 2.3 z powodu funkcji natychmiastowej, moja aplikacja nie będzie działać po skopiowaniu apk z wyjścia i umieszczeniu na karcie SD. W przypadku tego problemu buduję apk z opcji kompilacji, aby zbudować apk w Android Studio.


źródło
1

Jeśli jesteś włączony minifyEnabledi masz wartość shrinkResourcestrue w pliku ocen aplikacji. Musisz dodać następujący wiersz w proguard-rules.propliku

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

ponieważ minifikacja została usunięta z naszego pliku APK.

Naveen Kumar M
źródło
Nie jest to dobre rozwiązanie, ponieważ wyklucza wszystkie pliki źródłowe z kurczenia się zasobów. Zamiast tego wykluczaj tylko te pliki, które są naprawdę potrzebne, w przeciwnym razie zwiększysz rozmiar pliku APK.
Yannick
1

Miałem ten problem wcześniej, a komentarze tutaj pomogły w przeszłości, ale tym razem nie. sprawdziłem konfigurację proguard i usunąłem następujące wiersze, a następnie zadziałało, więc program proguard może mieć coś wspólnego z tym błędem:

 -optimizationpasses 5
        -overloadaggressively
        -repackageclasses ''
        -allowaccessmodification
        -dontskipnonpubliclibraryclassmembers
j2emanue
źródło
1

W moim przypadku użyłem starej biblioteki przestrzeni nazw, podczas gdy mój projekt był skonfigurowany przy użyciu androidx one.

Rozwiązaniem było zastąpić android.support.design.widget.BottomNavigationViewskładnik z prawej jednym uciec z biblioteki wsparcia: com.google.android.material.bottomnavigation.BottomNavigationView.

Andrii Artamonov
źródło
1

w moim przypadku definiuję działanie w programie Manifest.xmli zapomniałem go utworzyć activity. Utworzyłem więc działanie i zdefiniowałem je w programie manifesti rozwiązałem mój błąd!

sana ebadi
źródło
0

U mnie problem pojawił się po utworzeniu podpisanego pliku APK. Aby to naprawić, wygenerowałem nowy, debugujący apk za pomocą Run / Build APK. Następnie Run (cmd + r) działa ponownie bez tego błędu.

passatgt
źródło
0

Miałem ten sam problem. Przez jeden dzień próbowałem wszystkiego, ale nic nie działało. Zależność, która powodowała problem, polegała na używaniu niższego zestawu sdk kompilacji, zestawu docelowego sdk i min sdk. Stworzyłem moduł biblioteki do projektu, skopiowałem wszystkie źródła i dopasowałem wersje sdk do wersji sdk aplikacji. I w końcu zadziałało jak urok.

PK Gupta
źródło
0

Miałem ten sam błąd i niektóre odpowiedzi wprowadzają mnie w błąd w kwestii początkującego. Miałem niewłaściwy pakiet w moim niestandardowym deskryptorze widoku, jak poniżej. Mam nadzieję, że to komuś pomoże.

<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" />
lauksas
źródło