アプリのバージョニング

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

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

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 が用意されています。バージョン情報を取得するには、getPackageInfo(java.lang.String, int) メソッド(PackageManager に含まれています)を使用します。

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 ビルドの設定については、ビルド バリアントの設定をご覧ください。