23

アプリで 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:2.4.1@aar'
    compile project(':facebook')
}

最新のビルド ツールと最新の Google Play サービスとサポート ライブラリを使用して、21 でコンパイルしていることがわかります。

誰かがこれを機能させましたか?

4

4 に答える 4

42

MultiDexApplication クラスは appcompat-v7 ライブラリの一部ではありません。別の jar で出荷されます (android-support-multidex と呼ばれます)。

/sdk/extras/android/support/multidex/library/libs (サポート ライブラリのリビジョン 21 から利用可能) でandroid-support-multidex.jarを見つけて、プロジェクトのlibsフォルダーにコピーします。

更新 (2014 年 11 月 5 日) :
jar が中央リポジトリで利用できるようになりました。

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

詳細については、こちらを参照してください。

更新 (2021 年 9 月 27 日) :
Jetpack (AndroidX) ユーザーは、これを依存関係として追加する必要があります。

dependencies {
  ...
  implementation 'androidx.multidex:multidex:2.0.1'
}
于 2014-10-27T11:52:40.347 に答える
2

サポート ライブラリの r21 にどの MultiDexApplication を含める必要があるかに従って、このブログ投稿に従いまし

私の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#install が呼び出される前にロードされます! そのため、メインの classes.dex ファイルの外に配置できるタイプの静的フィールドを避けることをお勧めします。
  • アプリケーション クラスのメソッドは、アプリケーション クラスの後にロードされる他のクラスにアクセスできない場合があります。この回避策として、別のクラス (上記の例では Runnable を使用する任意のクラス) を作成し、その中のメソッド コンテンツを実行できます。
于 2014-10-26T23:19:17.077 に答える
0

私は解決策を得ました:)

jdk 8 にアップグレードし、Android Studio で JDK の場所を変更します。

ファイル > プロジェクト構造 > SDK の場所

JDKの場所を見つけて変更し、[OK]をクリックします

于 2016-07-22T13:22:57.767 に答える