Application.mk

このドキュメントでは、ndk-build が使用する Application.mk ビルドファイルについて説明します。

このページを読む前に、概念を読むことをおすすめします。

概要

Application.mk は、ndk-build のプロジェクト レベルの設定を指定します。デフォルトでは、アプリのプロジェクト ディレクトリ内の jni/Application.mk に格納されます。

変数

APP_ABI

デフォルトでは、NDK ビルドシステムは、サポートが終了していないすべての ABI を対象としてコードを生成します。APP_ABI 設定を使用すると、特定の ABI 用のコードを生成することができます。さまざまな命令セットを対象とする APP_ABI 設定を表 1 に示します。

表 1: 各種命令セット向けの APP_ABI 設定

命令セット
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 のリストや、使用方法、制限の詳細については、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_CONLYFLAGSAPP_CPPFLAGS もご覧ください。

APP_CLANG_TIDY

true に設定すると、プロジェクト内のすべてのモジュールで clang-tidy が有効になります。デフォルトでは無効になっています。

APP_CLANG_TIDY_FLAGS

プロジェクト内のすべての clang-tidy 実行に対して渡されるフラグ。

APP_CONLYFLAGS

プロジェクト内のすべての C コンパイルに対して渡されるフラグ。C++ コードの場合、このフラグは使用されません。

APP_CFLAGSAPP_CPPFLAGS もご覧ください。

APP_CPPFLAGS

プロジェクト内のすべての C++ コンパイルに対して渡されるフラグ。C コードの場合、このフラグは使用されません。

APP_CFLAGSAPP_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_OPTIMrelease に設定してください。

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 を併用する場合は、このパラメータを直接設定しないでください。代わりに、モジュール レベルbuild.gradle ファイルの defaultConfig ブロックか productFlavors ブロックで、minSdkVersion プロパティを設定するようにしてください。これにより、該当する Android バージョンを搭載しているデバイスにインストールされた場合に限り、アプリがこのライブラリを使用するようになります。

NDK には、すべての Android API レベルのライブラリが含まれているわけではありません。新しいネイティブ API を含まないバージョンは、NDK 内のスペースを節約するために省略されています。ndk-build が使用するプラットフォーム バージョンは、以下の優先順位(降順)で決定されます。

  1. APP_PLATFORM に合致するプラットフォーム バージョン。
  2. APP_PLATFORM 以下で次に利用可能な API レベル。たとえば、APP_PLATFORMandroid-20 に設定されている場合、android-20 には新しいネイティブ API がなかったため、android-19 が使用されます。
  3. NDK がサポートしている最小 API レベル。

APP_PROJECT_PATH

プロジェクトのルート ディレクトリの絶対パス。

APP_SHORT_COMMANDS

LOCAL_SHORT_COMMANDS と同等のプロジェクト レベルの設定。詳細については、Android.mk 内の LOCAL_SHORT_COMMANDS をご覧ください。

APP_STL

このアプリで使用する C++ 標準ライブラリ。

デフォルトでは、system STL が使用されます。他に、c++_sharedc++_staticnone を選択できます。NDK ランタイムと機能をご覧ください。

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