アプリのバージョニング

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

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

Android システムは、サードパーティ アプリのアップグレード、ダウングレード、互換性に制限を適用するためにアプリのバージョン情報を使用しません。代わりに、開発者がアプリ内で、またはユーザーにバージョン制限について通知することによってバージョン制限を適用します。ただし、Android システムは、ビルドファイルの minSdkVersion 設定で指定されているようにシステム バージョンの互換性を適用します。この設定によって、アプリは互換性がある最小のシステム API を指定できます。詳細については、最小のシステム API バージョンを指定するをご覧ください。

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

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

注: アプリのバージョンをアプリの <manifest> 要素で直接定義すると、Gradle ビルドファイルのバージョンの値によってマニフェストの設定がオーバーライドされます。また、Gradle ビルドファイルでこの設定を定義しておくと、アプリのバージョンごとに異なる値を指定できます。マニフェストを統合する際の柔軟性を高めて上書きのリスクを回避するには、<manifest> 要素からこれらの属性を削除し、Gradle ビルドファイルでバージョン設定を定義する必要があります。

次の 2 つの設定を使用でき、必ず両方の値を定義する必要があります。

  • versionCode - 内部バージョン番号として使用する整数。この番号は、バージョンを比較してどちらが新しいか判別するために使われ、番号が大きくなるほど新しいバージョンであることを示します。このバージョン番号はユーザーには表示されません。ユーザーに表示されるのは、以下の versionName 設定で定義した番号です。

    値は整数なので、他のアプリによってプログラムでこの値を評価できます(アップグレードまたはダウングレードの関係をチェックするなど)。値は任意の整数に設定できますが、アプリの次のリリースは前よりも大きい値を使用する必要があります。この動作はシステムによって強制はされませんが、後続リリースの値は増やすことが一般的です。

    通常、アプリの最初のバージョンは versionCode を 1 に設定してリリースし、リリースごとにそのリリースがメジャー リリースかマイナー リリースかに関係なく単純に値を増やしていきます。つまり、versionCode 値は、ユーザーに表示されるアプリのリリース バージョンと必ずしも類似している必要はありません(次の versionName を参照)。アプリと公開サービスでは、このバージョン値をユーザーに表示しません。

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

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

    値は文字列で、これにより、アプリのバージョンを <major>.<minor>.<point> 文字列として、またはその他のタイプの絶対または相対バージョン識別子として記述できます。versionName はユーザーに表示することのみを目的としています。

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

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) メソッドを使用します。

注: Instant Run を使用すると、Android Studio は自動的に versionCodeMAXINT に、versionName"INSTANTRUN" に設定します。

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 {} ブロックでデフォルトの minSdkVersiontargetSdkVersion の設定を指定し、1 つのプロダクト フレーバーで minSdkVersion をオーバーライドしています。

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

システムはアプリのインストールを準備する際にこれらの設定値をチェックして、システムのバージョンと比較します。minSdkVersion 値がシステム バージョンよりも大きい場合は、アプリをインストールできません。

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

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