アプリのバージョニング

バージョニングは、アプリのアップグレードおよびメンテナンス戦略を構成する重要な要素です。バージョニングが重要である理由は次のとおりです。

  • ユーザーは、デバイスにインストールされているアプリのバージョンと、インストール可能なアップグレード バージョンに関する具体的な情報を必要とします。
  • 他のアプリ(スイートとして公開する別のアプリを含む)は、互換性の判定と依存関係の識別のために、アプリのバージョンをシステムに照会する必要があります。
  • アプリを公開するために使用するサービスも、ユーザーにバージョンを表示するために、アプリにバージョンを照会する場合があります。公開サービスは、互換性の判定とアップグレード / ダウングレード関係の確立のために、アプリのバージョンをチェックする場合もあります。

Android システムは、ダウングレードを防止するためにアプリのバージョン情報を使用します。サードパーティ アプリのアップグレードまたは互換性の制限を適用するためにアプリのバージョン情報を使用することはありません。バージョン制限はアプリが適用するべきであり、アプリがそれについてユーザーに知らせるべきです。

Android システムは、ビルドファイルの minSdkVersion 設定で指定されているとおりに、システム バージョンの互換性を適用します。この設定によって、アプリは互換性がある最小のシステム API を指定できます。 詳細については、最小のシステム API バージョンを指定するをご覧ください。

アプリのバージョン情報を設定する

アプリのバージョン情報を定義するには、Gradle ビルドファイルでバージョン設定の値を指定します。これらの値は、ビルドプロセス中にアプリのマニフェスト ファイルにマージされます。

注: アプリが <manifest> 要素でアプリのバージョンを直接定義している場合は、Gradle ビルドファイルのバージョン値がマニフェストの設定より優先されます。また、Gradle ビルドファイルでこれらの設定を定義すると、アプリのバージョンごとに異なる値を指定できます。柔軟性を高め、マニフェストのマージ時に上書きされる危険を避けるには、これらの属性を <manifest> 要素から削除し、代わりに Gradle ビルドファイルでバージョン設定を定義する必要があります。

次の 2 つの設定を使用できます。これらの値は必ず両方とも定義する必要があります。

  • versionCode - 内部バージョン番号として使用される正の整数。この番号は、バージョンを比較してどちらが新しいかを判定するためだけに使用されます。番号が大きいほど、バージョンが新しいことを示します。この番号は、ユーザーに表示されるバージョン番号ではありません。ユーザーに表示されるのは、下記の versionName 設定で定義した番号になります。Android システムは、ダウングレードを防止するために versionCode 値を使用し、現在デバイスにインストールされているバージョンよりも versionCode が小さい APK をユーザーがインストールできないようにします。

    この値は正の整数であるため、他のアプリはプログラムによってこの値を評価できます。たとえば、アップグレード / ダウングレード関係をチェックできます。値は任意の正の整数に設定できますが、アプリの後続のリリースでは前よりも大きい値を使用する必要があります。以前のバージョンですでに使用した versionCode を使用して Play ストアに APK をアップロードすることはできません。

    注: 特定の状況では、最新バージョンよりも小さい versionCode を使用してアプリ バージョンをアップロードしたい場合があります。たとえば、複数の APK を公開する場合、特定の APK に versionCode の範囲が事前設定されている場合があります。複数の APK に versionCode 値を割り当てる方法の詳細については、複数 APK サポートをご覧ください。

    一般的に、アプリの最初のバージョンをリリースするときは versionCode を 1 に設定し、リリースを重ねるたびに、メジャー リリースかマイナー リリースかにかかわらず、単純に値を増やします。つまり、versionCode 値は、ユーザーに表示されるアプリのリリース バージョンとは必ずしも強い関連性を持っていません(下記の versionName を参照)。アプリと公開サービスは、このバージョン値をユーザーに表示しません。

    警告: Google Play で使用できる versionCode の最大値は 2100000000 です。

  • versionName - ユーザーに表示されるバージョン番号として使用される文字列。この値は、未加工の文字列または文字列リソースへの参照として設定できます。

    この値は文字列であり、アプリのバージョンを <メジャー>.<マイナー>.<ポイント> 文字列として、または他のタイプの絶対または相対バージョン識別子として記述できます。versionName はユーザーへの表示のみを目的としています。

これらの設定のデフォルト値を定義するには、モジュールの build.gradle ファイルの android {} ブロック内にネストされている defaultConfig {} ブロックで指定します。個々のビルドタイプまたはプロダクト フレーバーに応じて異なる値を定義すると、アプリのバージョンごとにデフォルト値をオーバーライドできます。次の build.gradle ファイルは、defaultConfig {} ブロックと productFlavors {} ブロックの versionCode 設定と versionName 設定を示しています。

    android {
      ...
      defaultConfig {
        ...
        versionCode 2
        versionName "1.1"
      }
      productFlavors {
        demo {
          ...
          versionName "1.1-demo"
        }
        full {
          ...
        }
      }
    }
    

この例の defaultConfig {} ブロックでは、versionCode 値は現在の APK にアプリの 2 番目のリリースが含まれていることを示し、versionName 文字列はそれがバージョン 1.1 としてユーザーに表示されることを示します。この build.gradle ファイルでは、「demo」と「full」という 2 つのプロダクト フレーバーも定義されています。「demo」プロダクト フレーバーは versionName を「1.1-demo」として定義しているので、「demo」ビルドではデフォルト値の代わりにこの versionName が使用されます。「full」プロダクト フレーバーのブロックでは versionName を定義していないので、デフォルト値の「1.1」が使用されます。

Android フレームワークには、アプリのバージョン情報をシステムに照会するための API が用意されています。バージョン情報を取得するには、PackageManagergetPackageInfo(java.lang.String, int) メソッドを使用します。

API レベル要件を指定する

アプリに特定の最小バージョンの Android プラットフォームが必要な場合、アプリの build.gradle ファイルで API レベル設定としてそのバージョン要件を指定できます。ビルドプロセス中に、この設定はアプリのマニフェスト ファイルにマージされます。API レベル要件を指定すると、アプリは互換性のあるバージョンの Android プラットフォームを実行しているデバイスにのみインストール可能になります。

注: API レベル要件をアプリのマニフェスト ファイルに直接指定すると、ビルドファイル内の対応する設定がマニフェスト ファイル内の設定より優先されます。また、Gradle ビルドファイルでこれらの設定を定義すると、アプリのバージョンごとに異なる値を指定できます。柔軟性を高め、マニフェストのマージ時に上書きされる危険を避けるには、これらの属性を <uses-sdk> 要素から削除し、代わりに Gradle ビルドファイルで API レベル設定を定義する必要があります。

次の 2 つの API レベル設定を使用できます。

  • minSdkVersion - アプリが実行される Android プラットフォームの最小バージョン。プラットフォームの API レベル識別子で指定します。
  • targetSdkVersion - アプリの本来の実行対象である API レベルを指定します。これにより、場合によっては、最小 API レベルで定義されたマニフェスト要素や動作だけでなく、ターゲット API レベルで定義されたマニフェスト要素や動作をアプリで使用できるようになります。

build.gradle ファイルでデフォルトの API レベル要件を指定するには、android {} ブロック内にネストされている defaultConfig {} ブロックに、上記の設定を 1 つ以上追加します。ビルドタイプまたはプロダクト フレーバーに応じて設定を追加することで、アプリのバージョンごとにデフォルト値をオーバーライドすることもできます。次の build.gradleファイルでは、defaultConfig {} ブロックでデフォルトの minSdkVersion 設定と targetSdkVersion 設定を指定し、1 つのプロダクト フレーバーで minSdkVersion をオーバーライドしています。

    android {
      ...
      defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 24
      }
      productFlavors {
        main {
          ...
        }
        afterLollipop {
          ...
          minSdkVersion 21
        }
      }
    }
    

システムは、アプリのインストールを準備する際にこれらの設定の値をチェックし、システムのバージョンと比較します。minSdkVersion 値がシステムのバージョンより大きければ、システムはアプリのインストールを回避します。

上記の設定が指定されていない場合、システムは、アプリがすべてのプラットフォーム バージョンと互換性があると見なします。

詳細については、<uses-sdk> マニフェスト要素のドキュメントと API レベルのドキュメントをご覧ください。Gradle ビルドの設定については、ビルド バリアントを設定するをご覧ください。