web-dev-qa-db-ja.com

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

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

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

20
JMRboosties

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

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

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

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

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

37
Alex Lipov

この質問はかなり古いものですが、API <21の1つのAPKとして異なるモジュールを一緒にビルドしようとすると、マルチモジュールのセットアップでこのエラーが発生しました。

AndroidXを使用している場合は、古いmultidex依存関係を必ず置き換えてください

compile 'com.Android.support:multidex:1.0.3'

新しいものと

implementation 'androidx.multidex:multidex:2.0.0'
18
jossiwolf

私は [〜#〜] this [〜#〜] に従い、サポートライブラリのr21にMultiDexApplicationを含めるべきであるというブログ投稿に従いました。

My 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を使用する任意のクラス)を作成し、その中のメソッドコンテンツを実行できます。
2
gswierczynski