アプリ モジュールを設定する

このページでは、モジュール レベルの build.gradle ファイルで役立つアプリ設定について説明します。build.gradle ファイルに設定された重要なプロパティの概要だけでなく、以下の方法についても説明します。

  • 異なるビルド構成用にアプリケーション ID を変更する。
  • 名前空間をアプリケーション ID とは独立にかつ安全に調整する。

アプリケーション ID を設定する

すべての Android アプリには、「com.example.myapp」など、Java パッケージ名に似た一意のアプリケーション ID があります。この ID によってアプリがデバイスと Google Play ストアで一意に識別されます。アプリの公開後はアプリケーション ID を変更しないでください。アプリの新しいバージョンをアップロードする場合、アプリケーション ID(および署名に使用する証明書)は、最初に公開されたときと同じでなければなりません。アプリケーション ID を変更すると、Google Play ストアは新しいバージョンのアプリをまったく別のアプリとして扱います。

アプリケーション ID は、次に示すように、モジュールの build.gradle ファイル内の applicationId プロパティで定義されます。

Groovy

android {
    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    ...
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 15
        targetSdk = 24
        versionCode = 1
        versionName = "1.0"
    }
    ...
}

アプリケーション ID は従来の Java パッケージ名(コードの名前空間)に似ていますが、アプリケーション ID の命名規則はもう少し厳密になっています。

  • 2 つ以上のセグメント(1 つ以上のドット)が必要
  • 各セグメントは文字で始まる必要がある
  • 使用できる文字は英数字と下線のみ(a~z、A~Z、0~9、_)

Android Studio で新しいプロジェクトを作成した場合、applicationId には、セットアップ時に選択した Java スタイルのパッケージ名が自動的に割り当てられます。技術的には、その後で 2 つのプロパティを独立に切り替えることは可能ですが、おすすめはしません。

アプリケーション ID を設定する際は、次のことをおすすめします。

  • アプリケーション ID は名前空間と同じにしておきます。2 つのプロパティの違いに多少混乱する可能性がありますが、同じままにしておけば心配はありません。
  • アプリの公開後は、アプリケーション ID を変更しないでください。変更すると、Google Play ストアでそれ以降のアップロードが新しいアプリとして扱われます。
  • アプリケーション ID を明示的に定義します。applicationId プロパティを使用してアプリケーション ID を明示的に定義しなかった場合、自動的に名前空間と同じ値が割り当てられます。つまり、名前空間を変更するとアプリケーション ID が変更されるという通常は望ましくないことが起こります。

注: アプリケーション ID は、以前はコードのパッケージ名に直接紐付けされていました。そのため、一部の Android API のメソッド名とパラメータ名に「package name」という語が含まれていますが、これは実際にはアプリケーション ID を指します。たとえば、Context.getPackageName() メソッドはアプリケーション ID を返します。コードの本来のパッケージ名をアプリコードの外部に公開する必要はありません。

注意: WebView を使用している場合は、アプリケーション ID の接頭辞としてパッケージ名を使用することをおすすめします。使用しないと、issue 211768 で説明している問題が発生する可能性があります。

テスト用にアプリケーション ID を変更する

デフォルトでは、ビルドツールは、指定されたビルド バリアントのアプリケーション ID の末尾に .test を付加したものを使用して、インストゥルメンテーション テスト APK にアプリケーション ID を適用します。たとえば、com.example.myapp.free ビルド バリアントのテスト APK では、アプリケーション ID は com.example.myapp.free.test です。

必須ではありませんが、defaultConfig または productFlavor ブロックで testApplicationId プロパティを定義することにより、アプリケーション ID を変更できます。

名前空間を設定する

どの Android モジュールにも名前空間があり、その名前空間は、生成される R クラスと BuildConfig クラスの Java パッケージ名として使用されます。

名前空間は、次のコード スニペットに示すように、モジュールの build.gradle ファイル内の namespace プロパティで定義されます。namespace は、最初はプロジェクトの作成時に選択した Java スタイルのパッケージ名に設定されます。

android {
    namespace 'com.example.myapp'
    ...
}

アプリを最終アプリ パッケージ(APK)にビルドする際、Android ビルドツールは名前空間を次の 2 つのことに使用します。

  • アプリが生成した R.java クラス(アプリリソースへのアクセスに使用される)の名前空間にこの名前を適用する。

    例: 上記のビルドファイルでは、R クラスは com.example.myapp.R に作成されます。

  • マニフェスト ファイルで宣言されたすべての相対クラス名の解決にこの名前を使用する。

    例: 上記のビルドファイルでは、<activity android:name=".MainActivity"> として宣言されたアクティビティは com.example.myapp.MainActivity に解決されます。

そのため、build.gradle ファイルの namespace プロパティに設定する名前は、アクティビティと他のアプリコードを配置する、プロジェクトのベース パッケージ名に常に一致させる必要があります。他のサブパッケージをプロジェクトに含めることはもちろんできますが、それらのファイルでは namespace プロパティの名前空間を使用して R.java クラスをインポートする必要が生じます。

簡単なワークフローにするため、デフォルトのとおり、名前空間をアプリケーション ID と同じにすることもおすすめします。

名前空間を変更する

名前空間とアプリケーション ID は、デフォルトのとおり、同じにすることを強くおすすめします。ただし、コードを再編成する場合や、名前空間の競合を避ける必要がある場合には、いずれかの時点で名前空間を変更する必要があります。このような場合、アプリケーション ID とは独立に(モジュールの build.gradle ファイル内の namespace プロパティを更新して)名前空間を変更できます。その前に、アプリケーション ID を明示的に定義して、名前空間を変更してもアプリケーション ID が変更されないようにしておいてください。名前空間がアプリケーション ID に与える影響については、アプリケーション ID を設定するをご覧ください。

namespace と Gradle の applicationId で名前が異なる場合は、ビルドの最後に、ビルドツールによってアプリケーション ID がアプリの最終マニフェスト ファイルにコピーされることに注意してください。そのため、ビルド後に AndroidManifest.xml ファイルを検査する際は、package 属性がアプリケーション ID に設定されていても問題ありません。マージ マニフェストの package 属性は、Google Play ストアと Android プラットフォームが実際にアプリを識別するために使用するものです。