2014-12-30 5 views
39

Jestem w trakcie konwertowania istniejącej aplikacji z Eclipse na system Android Studio. Jednak po uruchomieniu go na urządzeniu z uruchomionym 4.x (testowałem kilka wersji na emulatorach), natychmiast ulega awarii z NoClassDefFoundError.NoClassDefFoundError w Android Studio na Androida 4

Próbowałem komentować odniesienia do klas, których nie można znaleźć, ale zawsze jest coś innego. O ile można powiedzieć, klasa wykraczająca jest zawsze

  1. W ramach własnego kodu
  2. Wewnętrzna klasa (Aktualizacja: Przy większej dochodzenia, to nie zawsze jest prawdą)

Wszystko działa dobrze na emulatorze 5.0.1 (nie mam urządzenia do testowania). Mój plik build.gradle jest dość długa, ale wygląda to tak:

apply plugin: 'com.android.application' 
apply plugin: 'android-apt' 

def AAVersion = "2.7.1" 

android { 
    compileSdkVersion 19 
    buildToolsVersion "21.1.1" 

    defaultConfig { 
     applicationId "com.myapp.android" 
     minSdkVersion 8 
     targetSdkVersion 19 
     multiDexEnabled = true 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 

    packagingOptions { 
     *snip* 
    } 
} 

buildscript { 
    repositories { 
     mavenCentral() 

    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 
    } 
} 

repositories { 
    maven { 
     url "https://repo.commonsware.com.s3.amazonaws.com" 
    } 
} 

apt { 
    arguments { 
     androidManifestFile variant.outputs[0].processResources.manifestFile 
     resourcePackageName 'com.pact.android' 
    } 
} 

dependencies { 
    *snip compile project(':...') declarations 

    apt "com.googlecode.androidannotations:androidannotations:$AAVersion" 
    compile "com.googlecode.androidannotations:androidannotations-api:$AAVersion" 

    compile 'com.actionbarsherlock:actionbarsherlock:[email protected]' 
    compile 'com.android.support:support-v4:21.0.3' 
    compile 'com.google.android.gms:play-services:3.1.36' 

    *snip many more compile declarations* 

    compile fileTree(dir: 'libs', include: ['*.jar']) 
} 

Niektóre przykłady klas, które powodują problemy:

  • anonimowy klasy, która implementuje interfejs wewnątrz biblioteki facebook (jako projekt biblioteki)
  • Parcelable.CREATOR implementacje w moich modelach
  • wewnętrzna klasa, która rozszerza android.os.Library
  • wewnętrzna klasa w moim własnym CO de
  • Klasa, która implementuje interfejs w bibliotece z Maven

co się dzieje nie tak i jak to naprawić?

Odpowiedz

114

Nie byłem w pełni odpowiedzialny za obsługę MultiDex, więc niektóre z moich zajęć nie znajdowały się w odpowiednim pliku. Aby to naprawić, musisz zrobić więcej niż ustawić multiDexEnabled = true w swoim bloku defaultConfig. Trzeba także:

  1. Dołącz compile 'com.android.support:multidex:1.0.1' w swoich zależnościach
  2. Wyraź swoją klasę Zastosowanie przedłużyć MultiDexApplication zamiast tylko Application. Ewentualnie możesz zadzwonić pod numer MultiDex.install() w aplikacji attachBaseContext().

Aby uzyskać więcej informacji, patrz https://developer.android.com/tools/building/multidex.html.

+0

Bardzo pomaga. Dziękuję :) – Liuting

+0

Wielkie dzięki. Nie mogłem tego rozgryźć po przeniesieniu projektu z zaćmienia. Pozdrawiam :) – Fenil

+0

Mężczyzna! oszczędzasz mi dni utknięcia w pracy. Wielkie dzięki! –

10

1) Dodaj multiDexEnabled = true w domyślnej konfiguracji

2) Dodaj skompilować w swoich zależnościach

3) Application klasa przedłużyć MultiDexApplication zamiast tylko Application

0

I rozwiązać problem poprzez usunięcie multiDexEnabled = true w mój przypadek.

+0

To nie działa, gdy właśnie dodałeś 'multiDexEnabled = true' ... odpowiedź Karla jest właściwa. – Armysir

0

1) dodaj multiDexEnabled = true w defaultConfig w pliku build.gradle.

2) Trzeba również obejmować kompilacji 'com.android.support:multidex:1.0.1'

3) dodać następujące do "Aplikacja" tag w swoim manifeście:

android: name = "android.support.multidex.MultiDexApplication"

jego pracy ze mną, mam nadzieję, że pomoże

0

ja również wydawać się rozwiązać po DOI ng następujące kroki:

1) dodaj multiDexEnabled = true w domyślnej konfiguracji w build.gradle.

2) Trzeba również obejmować skompilować com.android.support:multidex:1.0.1

3) dodać następujące wpisy do „Aplikacja” tag w swoim manifeście:

android:name="android.support.multidex.MultiDexApplication" 
0

Mam ten sam problem, próbowałem wszystkie zaproponowane rozwiązania na StackOverflow, ale nie działały w moim przypadku.
Po tym dowiedziałem się, że jedna z bibliotek została skompilowana przez Javę 8. Więc, muszę włączyć Java 8 również w moim projekcie.

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

Istnieje wiele przyczyn, które prowadzą do tego błędu. Mam nadzieję, że to pomoże.