• 検索結果がありません。

メソッド数上限を回避したい

第 5 章 Android Gradle プロジェクト逆引きリファレンス 84

5.10 メソッド数上限を回避したい

manifestPlaceholders

については、「

5.22 Build Type

ごとに異なる値を

AndroidManifest

に書きたい」で詳しく説明します。

5.9 Build Type applicationId を変更したい

Build Type

applicationId

を変えることはお勧めはしませんが、設定としては行うこと ができます。

applicationId

を変更することで、

release

ビルドと

debug

ビルドや、設定の異

なって

debug

ビルドのアプリを一つの端末の中に共存させることができます。

Build Type

での

applicationId

変更では、

defaultConfig

Product Flavor

で指定されたも のに対してサフィックスを付加します(つまり、後ろに

".debug"

のような文字列を付け加える ことのみ可能)。

5.1 Build Typeの設定可能項目と初期着

項目 debug release 意味

debuggable true false デバッグ可能かどうか

jniDebuggable false false JNIのデバッグの有効/無効

renderscriptDebuggable false false RSのデバッグの有効/無効

renderscriptOptimLevel 3 3 RSの最適化レベル

applicationIdSuffix null null アプリIdのサフィックス

versionNameSuffix null null バーション名のサフィックス

signingConfig debug証明書設定 null 署名設定

zipAlignEnabled false true zipalign実行の有無

minifyEnabled false false ProGuardの有効/無効

shrinkResources false false 未使用リソース削除の有効/無効

proguardFile なし なし ProGuard設定ファイル

proguardFiles なし なし ProGuard設定ファイルリスト

multiDexEnabled false false multi-dex用ビルドの有効/無効

manifestPlaceholders null null AndroidManifest用変数定義

app/build.gradle

android.buildTypes.*

の中で、

applicationIdSuffix

を記述します。初期 値は

null

です(サフィックスなし)。

リスト

5.10

は、デバッグビルドの場合は

applicationId

.debug

を追加する設定例です。

リスト5.10: Build Type設定でのapplicationId変更

apply plugin: 'com.android.application' android {

...

buildTypes { ...

debug { ...

// applicationId の後ろに .debug を付加 applicationIdSuffix '.debug'

} } } ...

5.10 メソッド数上限を回避したい

Android

が使用している

dex

ファイルでは、

65k

個のメソッドしか内包できないという制限

があります。そのため、アプリが大きくなると、この制限に到達してしまうことがあります。

この制限を回避するためにはアプリを複数の

dex

ファイルに分割する必要があるのですが、

そのための仕組みが提供されています*3

複数の

dex

ファイルの作成を有効化するためには、リスト

5.11

のように

app/build.gradle

を修正します。

リスト5.11: multidexサポートを有効化する ...

android { ...

defaultConfig { ...

multiDexEnabled true }

}

dependencies { ...

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

リスト

5.11

では

defaultConfig

で有効化の設定を行っていますが、

Product Flavor

Build Type

で指定を行うこともできます。現時点では、ビルドバリアントに対して指定を行うこと はできません。

ま た 、

AndroidManifest.xml

で 、ア プ リ ケ ー シ ョ ン ク ラ ス と し て android.support.multidex.MultiDexApplication ま た は そ の サ ブ ク ラ ス を 指 定 す る 必 要 が あ り ま す 。他 の ラ イ ブ ラ リ 等 の 都 合 で こ れ が で き な い 場 合 は 、独 自 の

Appli-cation

ク ラ ス の 中 で attachBaseContext(Context) メ ソ ッ ド を オ ー バ ー ラ イ ド し 、 android.support.multidex.MultiDex.install(this); の呼び出しを行う必要があり ます。

*3 詳細はhttps://developer.android.com/tools/building/multidex.html参照

リ ス ト

5.12

android.support.multidex.MultiDexApplication ク ラ ス を ア プ リ ケーションクラスとして指定する場合の例です。

リスト5.12: AndroidManifest.xmlの修正

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.myapplication" >

<application ...

android:name="android.support.multidex.MultiDexApplication">

...

</application>

</manifest>

minSdkVersion 21

未満を対象とした現状の

multidex

サポートにはいくつかの制限事項が あります。次にわかっているものを上げておくので、リリース前によくテストを行ってくだ さい。

アプリ起動時のセカンダリー

dex

ファイルロードで

ANR

が発生する場合があります。

この場合は、

ProGuard

で使用していないコードを削除するなどしてセカンダリー

dex

のサイズが小さくなるようにしてください。

• API Level 14

未満の端末では

Dalvik linearAlloc

バグ*4の影響でアプリが起動しない場 合があります。これも、

ProGuard

でコードサイズを削減することで改善する可能性が あります。

• Dalvik linearAlloc limit

*5の影響でアプリが起動しない場合があります。

API Level 14

で制限が緩和されていますが、

API Level 21

未満の端末で発生する可能性があります。

使用しているライブラリによっては、最初にロードされる

dex

ファイルにクラスが存 在しないと動作しないものがあります。このようなライブラリは、現時点では使用でき ません。将来的なビルドツールのバージョンアップで、このようなライブラリにも対応 できるようになる予定です。

*4 http://b.android.com/22586

*5 http://b.android.com/78035

■コラム : multidex ビルドが遅い場合の対処

minSdkVersion

21

以上の場合と

21

未満の場合では、

multidex

の仕組みが異なり ます。

minSdkVersion 21

以上であれば

ART

環境で実行されることが保証できるため、

ART

もっている複数の

dex

ファイルを一つの

oat

ファイルにまとめる機能を前提とすることが できます。そのため、クラス間の依存を気にせずに複数の

dex

ファイルへ分割を行うこと ができます。

minSdkVersion 21

未満の場合は

Dalvik

環境で実行される可能性があるため、ひとつ目 の

dex

ファイルのみでアプリを起動し、その中の処理でふたつ目以降の

dex

ファイルを読 み込む処理を実行する必要があります。ひとつ目の

dex

ファイルに入れておかなければな らないクラスとふたつ目以降の

dex

ファイルでも問題のないクラスを、クラスの依存関係 を解析したうえで適切に振り分ける必要があります。

この解析処理は時間がかかるため、

minSdkVersion

21

未満のアプリで

multidex

を有 効化する場合は別途

minSdkVersion

21

Product Flavor

を追加し普段の開発はこの追 加した

Product Flavor

で行うのがお勧めです。