web-dev-qa-db-ja.com

Androidデバッグビルドのみでmultidexを有効にできますか?

親愛なる、私は多くのブログ投稿で、multidexアプリの起動が通常のアプリよりも遅いことを読みました。私のアプリは64kメソッドを超えるライブラリをたくさん使用しているので、multidexを使用しています。しかし、リリースビルドでproguardを使用すると、最終的なapkは64kメソッド未満になります

だから私の質問は:Androidデバッグビルドのみでマルチデックスを有効にしてランタイムエラーが発生しないようにすることはできますか?そしてリリースビルドでマルチデックスを必要ないので無効にすることはできますか?

はいの場合、どのように?

いいえの場合、Androidは、マルチdexアプリであっても、アプリが64kを超えていないことを認識できるため、起動を高速化するのに十分スマートですか?

17
Hisham Bakr

はい、できます。 buildTypesにデバッグ専用のmultidexを含めることを宣言する場合:

buildTypes {
    release {
        multiDexEnabled false
    }
    debug {
        multiDexEnabled true
    }
}
21
antonicg

デバッグ専用にmultidexを有効にする代わりに、デバッグ専用にmin sdkバージョンを21に変更して、gradleがARTを使用したdexingを高速化できるようにすることができます。

Android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.Android.support:multidex:1.0.0'
}

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

9
Ariel Carbonaro

Android studioが「十分にスマート」になったため、推奨されるメソッドは不要になりました。実際、minSdkVersion 21(旧式)を使用してビルド時間を短縮すると、警告が表示されるようになりました。 dex:

開発中にマルチデキシングを有効にするために開発モードは不要になりました。これにより、APIバージョンチェックが中断される可能性が低くなります...

これまで、ドキュメントでは、マルチデキシングで開発中にビルドを大幅に高速化できるようにするために、minSdkVersionが21の開発製品フレーバーを作成することを推奨していました。この回避策は不要になり、APIアクセスチェックの中断など、いくつかの重大な欠点があります(真のminSdkVersionが不明になったため)。最近のバージョンのIDEおよびGradleプラグイン) 、IDEは、デプロイに使用される接続デバイスのAPIレベルを自動的に渡します。そのデバイスが少なくともAPI 21の場合、マルチデキシングは自動的にオンになります。つまり、同じ速度のメリットが得られます。開発製品のフレーバーとしてですが、欠点はありません。

3
RJFares

はい、Lollipopより前のバージョンのAndroidバージョンのmultidexサポートライブラリでも、ちょっとしたトリックで動作します。

まず、build.gradleのデバッグビルドにmultiDexEnabledを指定します。

buildTypes {
    ...
    debug {
        ...
        multiDexEnabled true
    }
}

次に、AndroidManifest.xmlの下にsrc/debugファイルを作成します。

src/debug/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          xmlns:tools="http://schemas.Android.com/tools">

    <application
        Android:name="Android.support.multidex.MultiDexApplication"
        tools:replace="Android:name"/>

</manifest>

それでうまくいくはずです。アプリでカスタムアプリケーションクラスを使用する場合は、アプリケーションクラスのサブクラスを作成し、マニフェストでそのサブクラスの名前を指定する必要があります。

アプリケーションサブクラスは次のようになります。

public class MyDebugApplication extends MyApplication {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
0
devconsole