Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

アプリケーション ID の設定

すべての Android アプリには、com.example.myapp などの Java パッケージ名に似た一意のアプリケーション ID があります。この ID によってアプリがデバイスと Google Play ストアで一意に識別されます。アプリの新しいバージョンをアップロードする場合、アプリケーション ID(と署名した証明書)は、元の APK と同じにする必要があります。アプリケーション ID が変更されると、Google Play ストアはこの APK をまったく別のアプリとして処理します。そのため、アプリの公開後はアプリケーション ID を変更しないでください

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

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

Android Studio に新しいプロジェクトを作成すると、applicationId はセットアップ時に選択した Java スタイルのパッケージ名と完全に同じ値になります。ただし、この点を除けばアプリケーション ID とパッケージ名は互いに独立しています。コードのパッケージ名(コード名前空間)を変更してもアプリケーション ID は変わらず、その逆も同様です(ただし、前述の理由からアプリの公開後はアプリケーション ID を変更しないでください)。パッケージ名の変更による影響については注意が必要なため、パッケージ名の変更にに関するセクションをご確認ください。

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

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

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

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

ビルド バリアント向けにアプリケーション ID を変更する

アプリ用に APK をビルドすると、ビルドツールは build.gradle ファイルの defaultConfig ブロックで定義したアプリケーション ID を使用して APK をタグ付けします(下記参照)。ただし、「free」や「pro」のようにアプリのバージョンを複数作成して Google Play ストアで別々の掲載情報として表示されるようにしたい場合は、アプリケーション ID がそれぞれ異なるビルド バリアントを作成する必要があります。

この場合、ビルド バリアントはそれぞれ別のプロダクト フレーバーとして定義する必要があります。productFlavors ブロック内のフレーバーごとに applicationId プロパティを再定義するか、以下の例に示すように applicationIdSuffix を使用してデフォルトのアプリケーション ID にセグメントを付加します。

android {
        defaultConfig {
            applicationId "com.example.myapp"
        }
        productFlavors {
            free {
                applicationIdSuffix ".free"
            }
            pro {
                applicationIdSuffix ".pro"
            }
        }
    }
    

これにより、「free」プロダクト フレーバーのアプリケーション ID は「com.example.myapp.free」となります。

以下の例に示すように、applicationIdSuffix を使用してビルドタイプに基づいたセグメントを付加することもできます。

android {
        ...
        buildTypes {
            debug {
                applicationIdSuffix ".debug"
            }
        }
    }
    

Gradle ではプロダクト フレーバーの後にビルドタイプの設定を適用するため、「free debug」ビルド バリアント用のアプリケーション ID は「com.example.myapp.free.debug」となります。2 つの APK で同じアプリケーション ID を使用することはできないため、この方法はデバッグビルドとリリースビルドの両方を同じデバイスに組み込みたい場合に役に立ちます。

前述のとおり、アプリケーション ID が異なる APK は Google Play ストアでは別のアプリとして扱われます。アプリの掲載情報は共通のものを使用して、それぞれ異なるデバイス設定(API レベルなど)をターゲットとする APK を複数配布したい場合は、すべてのビルド バリアントに同じアプリケーション ID を使用する必要があります。ただし、APK ごとに別の versionCode を指定してください。詳しくは、複数 APK のサポートをご覧ください。

注意: 以前の SDK ツールとの互換性を保つため、build.gradle ファイルに applicationId プロパティを定義していない場合、ビルドツールは AndroidManifest.xml ファイルのパッケージ名をアプリケーション ID として使用します。

ヒント: マニフェスト ファイルでアプリケーション ID を参照する必要がある場合は、任意のマニフェスト属性でプレースホルダ ${applicationId} を使用できます。Gradle はビルド時にこのタグを実際のアプリケーション ID に置き換えます。詳しくは、マニフェストへのビルド変数の追加をご覧ください。

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

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

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

パッケージ名を変更する

プロジェクトのパッケージ名は、デフォルトでアプリケーション ID と一致していますが、変更することもできます。ただし、パッケージ名を変更する場合は、プロジェクトのディレクトリ構造で定義されたパッケージ名が常に AndroidManifest.xml ファイルの package 属性と一致する必要があります(下記参照)。

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp"
        android:versionCode="1"
        android:versionName="1.0" >
    

Android ビルドツールは次の 2 つの場合に package 属性を使用します。

  • アプリが生成した R.java クラスの名前空間としてこの名前を適用する。

    例: 上記のマニフェストの場合、R クラスは com.example.myapp.R となります。

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

    例: 上記のマニフェストの場合、<activity android:name=".MainActivity"> として宣言されたアクティビティは com.example.myapp.MainActivity として解決されます。

そのため、package 属性の名前は、アクティビティと他のアプリコードを保持するプロジェクトのベース パッケージ名と常に一致している必要があります。プロジェクトにサブパッケージが含まれていてもかまいませんが、これらのファイルでは package 属性の名前空間を使用して R.java クラスをインポートし、マニフェストで宣言されたすべてのアプリ コンポーネントでは不足しているサブパッケージ名(または完全修飾パッケージ名)を追加する必要があります。

パッケージ名を完全にリファクタリングする場合は、package 属性も更新してください。Android Studio のツールを使用してパッケージの名前を変更、リファクタリングすれば、パッケージは自動的に同期されます(同期状態にならない場合、アプリのコードでは R クラスを解決することができません。アプリのコードが同じパッケージに含まれず、マニフェストがアクティビティまたは他のコンポーネントを識別しないためです)。

プロジェクトのメイン AndroidManifest.xml ファイルで常に package 属性を指定する必要があります。追加のマニフェスト ファイル(プロダクト フレーバー用やビルドタイプ用)がある場合は、優先度の最も高いマニフェスト ファイルが提供するパッケージ名が常に最終的にマージされたマニフェストで使用されることに注意してください。詳しくは、複数のマニフェスト ファイルをマージするをご覧ください。

補足情報: マニフェストの package と Gradle の applicationId で名前が異なることがありますが、ビルドツールは、ビルドの最後にアプリケーション ID を APK の最終的なマニフェスト ファイルにコピーします。そのため、ビルド後に AndroidManifest.xml ファイルを確認したときに package 属性が変わっていても問題ありません。Google Play ストアと Android プラットフォームでは、実際に package 属性を確認することでアプリを識別します。そのためビルドで(R クラスに名前空間を設定し、マニフェスト クラス名を解決するために)元の値が使用されたらその値は無視され、アプリケーション ID で置き換えられます。