web-dev-qa-db-ja.com

Android multidexライブラリの実装をサポート

私のアプリケーションは多くのjar(ドライブAPI、greendao、pdf to text、サポート..)を使用するため、魔法のdex制限に達しました。

私の現在の解決策は、メインのapkから呼び出したgoogleドライブ専用の2番目のapkを文字通り作成したことです。しかし、今、私はAndroidが最終的にこのライブラリでこれをサポートしていることを発見しました。私の問題は、それを実装する方法がわからないことですそれのためのチュートリアル。

オーケー私はこれを実装しようとして心を失っています...私は this を見つけました

そして、私は追加しました:

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

私のマニフェストファイルと

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

私のmainactivity.Javaへ

また、Eclipse用のgradleプラグインをインストールし、gradleをエクスポートしてbuild.gradleファイルを取得しました。

apply plugin: 'Android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':Android-support-v7-appcompat')
    compile project(':Sync')
    compile project(':gdrive:google-play-services_lib')
}


Android {
    compileSdkVersion 14
    buildToolsVersion "21.1.1"


    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            Java.srcDirs = ['src-gen','src']
            resources.srcDirs = ['src-gen','src']
            aidl.srcDirs = ['src-gen','src']
            renderscript.srcDirs = ['src-gen','src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/Java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/Java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    dexOptions {
      preDexLibraries = false
   }
}

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

しかし、エラーはまだ同じです:(

13
Tadej Vengust

ブログは古いソリューションでした。

Android Studio 0.9.2&Gradle Plugin 0.14.1の場合、必要なのは以下だけです:

  1. AndroidManifest.xmlに追加します。

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

または

追加

MultiDex.install(this);

カスタムアプリケーションのattachBaseContextメソッド内

またはカスタムアプリケーションがMultiDexApplicationを拡張します

  1. 追加 multiDexEnabled = trueあなたのbuild.gradle

Android {
    defaultConfig {
        ...
        multiDexEnabled = true
    }
}

できた.

下手な英語でごめんなさい

関連リソース:

http://developer.Android.com/tools/building/multidex.html

https://plus.google.com/+XavierDucrohet/posts/1FnzwdcBnyC

19
darktiny

しなければならないことがいくつかありますが、

1- gradleで、multidexを指定し、サポートライブラリを追加する必要があります。

_Android {
    defaultConfig {
        ...
        multiDexEnabled true
        ...
    }
}

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

2-マニフェストで、アプリケーションをmultidexアプリケーションに設定する必要があります。

_<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.package.name">
    <application
        ...
        Android:name="com.package.name.my_application">
        ...
    </application>
</manifest>
_

3.1-アプリケーションクラスでは、MultiDexApplicationを拡張する必要があります。

_public class my_application extends MultiDexApplication
{
    ...
}
_

3.2-またはattachBaseContext()メソッドをオーバーライドします:

_public class my_application extends Application
{
    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
_

multidexサポートライブラリの制限

Multidexサポートライブラリには、アプリのビルド構成に組み込むときに注意してテストする必要がある既知の制限がいくつかあります。

  • 起動中の.dexファイルのデバイスのデータパーティションへのインストールは複雑であり、セカンダリdexファイルが大きい場合、アプリケーション応答なし(ANR)エラーが発生する可能性があります。この場合、ProGuardでコード圧縮技術を適用して、dexファイルのサイズを最小化し、コードの未使用部分を削除する必要があります。
  • マルチデックスを使用するアプリケーションは、Dalvik linearAllocのバグ(問題22586)により、Android 4.0(APIレベル14)より前のプラットフォームのバージョンを実行するデバイスで起動しない場合があります。 14より前のAPIレベルをターゲットにしている場合、これらのバージョンのプラットフォームでテストを実行してください。起動時に、または特定のクラスグループがロードされるときにアプリケーションに問題が発生する可能性があります。コードを縮小することで、これらの潜在的な問題を減らすことができます。
  • 非常に大きなメモリ割り当て要求を行うmultidex構成を使用するアプリケーションは、Dalvik linearAllocの制限により、実行中にクラッシュする場合があります(問題78035)。割り当て制限はAndroid 4.0(APIレベル14)で増加しましたが、Android 5.0(APIレベルより前のAndroidバージョンでは引き続きこの制限に達する可能性があります21)。
  • Dalvikランタイムで実行する場合、プライマリdexファイルで必要なクラスに関する複雑な要件があります。 Androidビルドツールの更新はAndroid要件を処理しますが、他の含まれるライブラリには、Javaメソッドのイントロスペクションまたは呼び出しの使用を含む追加の依存関係要件がある可能性がありますネイティブコードから。一部のライブラリは、multidexビルドツールが更新されてプライマリdexファイルに含める必要があるクラスを指定できるようになるまで使用できない場合があります。

リソース: http://developer.Android.com/tools/building/multidex.html

16
Nicolas Tyler

https://developer.Android.com/studio/build/multidex.html#avoid のドキュメントによると

MinSdkVersionが21以上の場合、必要なことは

Android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

minSdkVersionが20以下の場合、サポートライブラリを使用する必要があります

Android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

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

とともに

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.myapp">
    <application
            Android:name="Android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>
2
Sanket Berde