このページでは、ndk-build
が使用する Application.mk
ビルドファイルについて説明します。
このページを読む前に、概念を読むことをおすすめします。
概要
Application.mk
は、ndk-build のプロジェクト レベルの設定を指定します。デフォルトでは、アプリのプロジェクト ディレクトリ内の jni/Application.mk
に格納されます。
変数
APP_ABI
デフォルトでは、NDK ビルドシステムは、サポートが終了していないすべての ABI を対象としてコードを生成します。APP_ABI
設定を使用すると、特定の ABI 用のコードを生成することができます。さまざまな命令セットを対象とする APP_ABI
設定を表 1 に示します。
命令セット | 値 |
---|---|
32 ビット ARMv7 | APP_ABI := armeabi-v7a |
64 ビット ARMv8(AArch64) | APP_ABI := arm64-v8a |
x86 | APP_ABI := x86 |
x86-64 | APP_ABI := x86_64 |
サポートされているすべての ABI(デフォルト) | APP_ABI := all |
複数の値を指定する場合は、1 つの行に各値をスペース区切りで配置します。次に例を示します。
APP_ABI := armeabi-v7a arm64-v8a x86
サポートされているすべての ABI のリストや、使用方法、制限の詳細については、Android ABIをご覧ください。
APP_ASFLAGS
プロジェクト内のすべてのアセンブリ ソースファイル(.s
および .S
ファイル)を対象に、アセンブラに渡されるフラグ。
APP_ASMFLAGS
すべての YASM ソースファイル(.asm
。x86 / x86_64 のみ)を対象に、YASM に渡されるフラグ。
APP_BUILD_SCRIPT
ndk-build はデフォルトでは、Android.mk ファイルが jni/Android.mk
(プロジェクト ルートを起点とする相対パス)に配置されていると想定します。
別の場所から Android.mk ファイルを読み込む場合は、APP_BUILD_SCRIPT
を Android.mk ファイルの絶対パスに設定します。
APP_CFLAGS
プロジェクト内のすべての C / C++ コンパイルに対して渡されるフラグ。
APP_CONLYFLAGS、APP_CPPFLAGS もご覧ください。
APP_CLANG_TIDY
true に設定すると、プロジェクト内のすべてのモジュールで clang-tidy が有効になります。デフォルトでは無効になっています。
APP_CLANG_TIDY_FLAGS
プロジェクト内のすべての clang-tidy 実行に対して渡されるフラグ。
APP_CONLYFLAGS
プロジェクト内のすべての C コンパイルに対して渡されるフラグ。C++ コードの場合、このフラグは使用されません。
APP_CFLAGS、APP_CPPFLAGS もご覧ください。
APP_CPPFLAGS
プロジェクト内のすべての C++ コンパイルに対して渡されるフラグ。C コードの場合、このフラグは使用されません。
APP_CFLAGS、APP_CONLYFLAGS もご覧ください。
APP_CXXFLAGS
APP_CPPFLAGS
と同様ですが、コンパイル コマンド内で APP_CPPFLAGS
の後に配置されます。次に例を示します。
APP_CPPFLAGS := -DFOO
APP_CXXFLAGS := -DBAR
上記の設定の場合、clang++ -DBAR -DFOO
ではなく、clang++
-DFOO -DBAR
というコンパイル コマンドになります。
APP_DEBUG
true に設定すると、デバッグ可能なアプリがビルドされます。
APP_LDFLAGS
実行ファイルと共有ライブラリをリンクするときに渡されるフラグ。
APP_MANIFEST
AndroidManifest.xml ファイルへの絶対パス。
デフォルトでは、$(APP_PROJECT_PATH)/AndroidManifest.xml)
が存在する場合はそちらが使用されます。
APP_MODULES
ビルドするモジュールの明示的なリスト。各モジュールの名前がこのリストの要素となり、その順序は Android.mk ファイルの LOCAL_MODULE
内の配置どおりになります。
デフォルトでは、ndk-build はすべての共有ライブラリ、実行ファイル、およびその依存関係をビルドします。静的ライブラリがビルドされるのは、プロジェクトがその静的ライブラリを使用している場合や、プロジェクト内に含まれるのが静的ライブラリだけの場合、APP_MODULES
内でその静的ライブラリが指定されている場合に限られます。
APP_OPTIM
必要に応じてこの変数を release
または debug
に設定します。リリース バイナリはデフォルトでビルドされます。
リリースモードでは最適化が有効になり、生成されるバイナリはデバッガでは使用できない場合があります。デバッグモードでは最適化が無効になり、デバッガを使用することができます。
なお、デバッグはリリース バイナリでもデバッグ バイナリでも実行できます。ただし、リリース バイナリの場合は、デバッグ中に提供される情報が少なくなります。たとえば、変数が最適化されるため、検査できなくなることがあります。また、コードの並べ替えにより、コードをステップ実行しにくくなり、スタック トレースの信頼性が下がることがあります。
アプリ マニフェストの <application>
タグ内で android:debuggable
を宣言すると、この変数のデフォルト値が release
ではなく debug
に設定されます。このデフォルト値をオーバーライドするには、APP_OPTIM
を release
に設定してください。
APP_PLATFORM
APP_PLATFORM
は、ビルドするアプリの対象となる Android API レベルを宣言します。アプリの minSdkVersion
に対応します。
指定しない場合、ndk-build は、NDK がサポートしている最小 API レベルをターゲットにします。最新の NDK がサポートしている最小 API レベルであれば、ほぼすべてのアクティブ デバイスがサポートされます。
たとえば、値を android-16
にすると、「このライブラリは、Android 4.1(API レベル 16)より前のプラットフォーム バージョンでは利用できない API を使用しており、そのようなバージョンを搭載しているデバイスでは使用できない」と指定することになります。プラットフォーム名と、対応する Android システム イメージの完全なリストについては、Android NDK ネイティブ API をご覧ください。
Gradle と externalNativeBuild
を併用する場合は、このパラメータを直接設定しないでください。代わりに、module-level の build.gradle
ファイルの defaultConfig
ブロックか productFlavors
ブロックで、minSdkVersion
プロパティを設定するようにしてください。これにより、該当する Android バージョンを搭載しているデバイスにインストールされた場合に限り、アプリがこのライブラリを使用するようになります。
NDK には、すべての Android API レベルのライブラリが含まれているわけではありません。 新しいネイティブ API を含まないバージョンは、NDK 内のスペースを節約するために省略されています。ndk-build が使用するプラットフォーム バージョンは、以下の優先順位(降順)で決定されます。
APP_PLATFORM
と一致するプラットフォーム バージョン。APP_PLATFORM
以下で次に利用可能な API レベル。たとえば、APP_PLATFORM
がandroid-20
に設定されている場合、android-20 には新しいネイティブ API がなかったため、android-19
が使用されます。- NDK がサポートしている最小 API レベル。
APP_PROJECT_PATH
プロジェクトのルート ディレクトリの絶対パス。
APP_SHORT_COMMANDS
LOCAL_SHORT_COMMANDS
と同等のプロジェクト レベルの設定。詳細については、Android.mk の LOCAL_SHORT_COMMANDS
のドキュメントをご覧ください。
APP_STL
このアプリで使用する C++ 標準ライブラリ。
デフォルトでは、system
STL が使用されます。他に、c++_shared
、c++_static
、none
を選択できます。NDK C++ ランタイムと機能をご覧ください。
APP_STRIP_MODE
このアプリ内のモジュールの strip
に渡される引数。デフォルトは --strip-unneeded
ですモジュール内のすべてのバイナリでストリップを行わないようにするには、none
に設定します。他のストリップ モードについては、ストリップのドキュメントをご覧ください。
APP_THIN_ARCHIVE
true に設定すると、プロジェクト内のすべての静的ライブラリに対してシンアーカイブが使用されます。詳細については、Android.mk 内の LOCAL_THIN_ARCHIVE
のドキュメントをご覧ください。
APP_WRAP_SH
このアプリに含める wrap.sh ファイルへのパス。
この変数には、各 ABI 専用のバリアントと、全 ABI を対象とする汎用バリアントが存在します。
APP_WRAP_SH
APP_WRAP_SH_armeabi-v7a
APP_WRAP_SH_arm64-v8a
APP_WRAP_SH_x86
APP_WRAP_SH_x86_64