Android SDK バージョンのプロパティ

Android アプリでは、build.gradle ファイルで多くの SDK バージョン プロパティを設定できます。一般的なプロパティについては、Android build.gradle のドキュメントをご覧ください。このドキュメントでは、これらのプロパティが NDK ビルドに与える影響について説明します。

compileSdkVersion

このプロパティは、NDK ビルドには影響しません。NDK での API の可用性は、代わりに minSdkVersion で管理されます。これは、C++ シンボルが、Java でのように最初に呼び出されたときに遅延的に解決されるのではなく、ライブラリの読み込み時にすぐに解決されるためです。minSdkVersion で使用できないシンボルを使用すると、古い API の OS バージョンでは、API が呼び出されるかどうかにかかわらずライブラリの読み込みが失敗します。

新しいアプリの場合は、利用可能な最新バージョンを選択してください。既存のアプリの場合は、必要に応じて最新バージョンに更新してください。

targetSdkVersion

Java と同様に、アプリの targetSdkVersion でネイティブ コードのランタイム動作を変更できます。システムの動作変更は、可能な場合は、その変更を適用した OS バージョン以上の targetSdkVersion を持つアプリにのみ適用されます。

新しいアプリの場合は、利用可能な最新バージョンを選択してください。既存のアプリの場合は、compileSdkVersion の更新後、必要に応じて最新バージョンに更新してください。

通常、アプリ デベロッパーはアプリの targetSdkVersion を把握しますが、この API は、ユーザーがどの targetSdkVersion を選択すべきかわからないライブラリ デベロッパーに役立ちます。

ランタイムに android_get_application_target_sdk_version() を呼び出すことで、アプリケーションで使用する targetSdkVersion を取得できます。この API は API レベル 24 以降で使用できます。この関数の署名は次のとおりです。

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

その他の動作変更は、デバイスの API レベルによって異なります。android_get_device_api_level() を呼び出すことで、アプリケーションが実行されているデバイスの API レベルを取得できます。この関数の署名は次のとおりです。

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

maxSdkVersion

このプロパティは、NDK ビルドには影響しません。

minSdkVersion

build.gradle ファイル内で設定されている minSdkVersion が、ビルド時に使用可能な API(これが Java のビルドと異なる理由については compileSdkVersion を参照)と、コードと互換性のある OS のバージョンを決定します。

NDK は minSdkVersion を使用して、コードのコンパイル時に使用できる機能を決定します。たとえばこのプロパティにより、libc で使用されている FORTIFY 機能を特定し、古いバージョンの Android と互換性のないバイナリのパフォーマンスまたはサイズの改善(GNU ハッシュRELR)が有効になる場合があります。新しい API を使用していない場合でも、このプロパティで、サポート対象の最小バージョンの OS が制御されます。

新しいアプリの場合は、Android Studio の [Create New Project] ウィザードまたは apilevels.com のユーザー配信データをご覧ください。潜在的なマーケット シェアとメンテナンス コストとのバランスを選択してください。minSdkVersion が古いほど、古いバグへの対応やまだ実装されていない機能に対するフォールバック動作の追加に時間がかかります。

既存のアプリの場合は、古い API レベルにメンテナンス コストをかける価値がなくなったら必ず minSdkVersion のレベルを上げてください。また、ユーザーが必要とし、新たにメンテナンス コストをかける価値がある場合は、レベルを下げてください。Google Play Console には、アプリのユーザー配信に固有の指標があります。

アプリの minSdkVersion__ANDROID_MIN_SDK_VERSION__ マクロを介してプリプロセッサから使用できます(以前の __ANDROID_API__ も同じですが、意味がより明確であるため、前者が推奨されます)。このマクロは Clang によって自動的に定義されるため、使用するためにヘッダーを含める必要はありません。NDK ビルドの場合、このマクロは常に定義されます。