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 を持つアプリにのみ適用されます。

通常、アプリ デベロッパーはアプリの 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 のバージョンを決定します。

アプリケーションの minSdkVersion は、__ANDROID_API__ マクロを介してプリプロセッサから使用できます。このマクロは Clang によって自動的に定義されるため、これを使用するためにヘッダーを含める必要はありません。NDK ビルドの場合、このマクロは常に定義されます。

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