MultiDexApplication не распознается

Попытка использовать MultiDexApplication в моем приложении, но класс не распознается, когда я пытаюсь расширить свою активность приложения с ним.

Вот мой файл build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion '21.0.1'
    defaultConfig {
        applicationId 'com.myapp'
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 115
        versionName '4.8'
    }

    buildTypes {
        debug {
            debuggable true
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            debuggable false
            runProguard true
            zipAlign true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

    lintOptions {
        checkReleaseBuilds false
    }
}

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

    compile 'com.google.android.gms:play-services:6.1.11'

    compile 'com.android.support:appcompat-v7:21.0.0'

    compile 'com.nineoldandroids:library:2.4.0'
    compile 'com.viewpagerindicator:library:[email protected]'
    compile project(':facebook')
}

Вы можете видеть, что я компилирую 21, используя новейшие инструменты сборки, а также последние сервисы Google Play и библиотеку поддержки.

Кто-нибудь получил это, чтобы работать?

Ответ 1

Класс MultiDexApplication не является частью библиотеки appcompat-v7. Он отправляется в отдельную банку (называемую android-support-multidex).

Найдите android-support-multidex.jar в разделе /sdk/extras/android/support/multidex/library/libs (доступно из версии 21 библиотеки поддержки) и скопируйте его в папку проекта libs.

Обновление (11/5/2014):
Теперь банку доступно в центральном хранилище:

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

Для получения дополнительной информации см. здесь.

Ответ 2

Я следил за ЭТО сообщение в блоге, согласно которому MultiDexApplication должен быть включен в r21 библиотеки поддержки.

У моей IDE также были проблемы с ее устранением.

Я сделал это сейчас с помощью MULTIDEX проекта github, добавив (вы можете увидеть более подробную информацию на странице проекта)

android {
    dexOptions {
        preDexLibraries = false
    }
}

repositories {
  jcenter()
}

dependencies {
  compile 'com.google.android:multidex:0.1'
}

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex' // enable multidex

        dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
    }
}

и добавить файл $project_dir/multidex.keep со следующим содержимым:

android/support/multidex/BuildConfig.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/ZipUtil$CentralDirectory.class
android/support/multidex/ZipUtil.class

На странице проекта github также упоминается содержание вашей реализации класса MultiDexApplication:

  • Статические поля в вашем классе приложения будут загружены до MultiDex # installbe называется! Поэтому рекомендуется избегать статических полей с типами, которые могут быть помещены из основного файла classes.dex.
  • Методы вашего класса приложения могут не иметь доступа к другим классам которые загружаются после вашего класса приложения. В качестве рабочего плана для этого, вы можете создать другой класс (любой класс, в приведенном выше примере, я использую Runnable) и выполните содержимое метода внутри него.

Ответ 3

Я получил решение:)

Перейдите на jdk 8 и измените местоположение JDK в Android Studio в

Файл > Структура проектa > Местоположение SDK

Найдите и измените местоположение JDK и нажмите OK