Application.mk

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

このページを読む前に、コンセプトのページと Android.mk のページを読むことをお勧めします。 それによって、このページに記載されている内容が理解しやすくなります。

概要

Application.mk は GNU Makefile のごく一部であり、コンパイル用に複数の変数を定義するファイルです。 通常は、$PROJECT/jni/ に格納されています。ここで、$PROJECT は アプリケーションのプロジェクト ディレクトリを指しています。 最上位のディレクトリ $NDK/apps/ のサブディレクトリの下に含まれることもあります。 次に例を示します。

$NDK/apps/<myapp>/Application.mk

ここで <myapp> は、NDK ビルドシステムに対してアプリを記述するときに使用される短縮名です。 生成された共有ライブラリや最終パッケージに含まれることはありません。

変数

APP_PROJECT_PATH

この変数にはアプリのプロジェクト ルート ディレクトリへの絶対パスを指定します。 ビルドシステムはこの情報をもとに、生成された JNI 共有ライブラリの最小限の機能を持つバージョンを、APK 生成ツールで認識されている特定の場所に配置します。

Application.mk ファイルを $NDK/apps/<myapp>/ の下に配置した場合は、この変数を定義する必要があります。 $PROJECT/jni/ の下に配置した場合は、定義は省略可能です。

APP_MODULES

この変数が定義された場合、ndk-build は対応するモジュールと依存するモジュールのみをビルドするよう指示されます。 Android.mk ファイルの LOCAL_MODULE 定義と同じようにモジュール名をスペースで区切る必要があります。

この変数が定義されなかった場合、ndk-build はインストール可能なすべての最上位モジュールのリストを検索します。 つまり、Android.mk ファイルとその中に直接含まれるすべてのファイルでリストされるモジュールです。 ただし、インポートされたモジュールは最上位ではありません。

インストール可能なモジュールは、共有ライブラリか実行可能ファイルのどちらかで、libs/$ABI/ にファイルを生成します。

この変数が定義されず、プロジェクト内にインストール可能な最上位モジュールが存在しない場合、ndk-build は代わりにすべての最上位静的ライブラリとそれらの依存関係をビルドします。 これらのライブラリは、obj/ または obj-debug/ の下の通常の場所に配置されます。

APP_OPTIM

この省略可能な変数には release または debug を指定します。 この変数を使用すると、アプリのモジュールをビルドするときに、最適化レベルを変更することができます。

既定はリリースモードで、最適化されたバイナリが生成されます。 デバッグモードに変更すると、最適化されていないバイナリが生成され、デバッグがはるかに容易になります。

なお、デバッグはリリース バイナリでもデバッグ バイナリでも実施できます。 ただし、リリース バイナリではデバッグ中に提供される情報が少なくなります。 たとえば、ビルドシステムがいくつかの変数を最適化するため、値を監視できなくなっています。 また、コードの並び替えにより、コードをステップ実行することが難しくなる場合があり、スタック トレースの信頼性が下がります。

アプリケーション マニフェストの <application> タグで android:debuggable を宣言すると、 この変数の既定値が release ではなく debug に設定されます。 既定値をオーバーライドするには、APP_OPTIMrelease に指定します。

APP_CFLAGS

モジュールの C または C++ のソースコードをコンパイルするときに、ビルドシステムがコンパイラに渡す一連の C コンパイラ フラグをこの変数に指定します。 この変数を使用すると、Android.mk ファイル自体を変更しなくても、任意のモジュールを必要とするアプリに応じて、そのモジュールのビルドを変更することができます。 C++ 専用のフラグを指定する場合は、APP_CPPFLAGS を使用します。

これらのフラグのすべてのパスは NDK のトップレベル ディレクトリへの相対パスである必要があります。 たとえば、次のように指定しているとします。

sources/foo/Android.mk
sources/bar/Android.mk

foo/Android.mk で、コンパイル時に bar ソースへのパスを追加するよう指定するには、次のようにします。

APP_CFLAGS += -Isources/bar

または次のように指定します。

APP_CFLAGS += -I$(LOCAL_PATH)/../bar

-I../bar-I$NDK_ROOT/../bar と同等であるため動作しません。

APP_CPPFLAGS

この変数には、ビルドシステムが C++ ソースのビルドのときだけコンパイラに渡す一連の C++ コンパイラ フラグを指定します。 C と C++ に適用されるフラグの指定には APP_CFLAGS を使用します。

APP_LDFLAGS

アプリのリンク時にビルドシステムが渡す一連のリンカーフラグです。 この変数は、ビルドシステムが共有ライブラリと実行可能ファイルをビルドするときのみ関係します。 ビルドシステムが静的ライブラリをビルドするときは、これらのフラグは無視されます。

APP_BUILD_SCRIPT

既定では、NDK ビルドシステムは jni/ の下で Android.mk という名前のファイルを検索します。

この動作をオーバーライドしたい場合、代替ビルド スクリプトを指すように APP_BUILD_SCRIPT を定義することができます。 ビルドシステムは常に非絶対パスを NDK の最上位ディレクトリへの相対パスとして解釈します。

APP_ABI

既定で、NDK ビルドシステムは非推奨以外のすべての ABI 向けのマシンコードを生成します。 APP_ABI 設定を使用して、特定の ABI 向けのマシンコードを生成することができます。 表 1 にはさまざまな命令セット用の APP_ABI 設定が記載されています。

表 1. さまざまな命令セット用の APP_ABI 設定。

命令セット
ARMv7 ベース端末上のハードウェア FPU 命令 APP_ABI := armeabi-v7a
ARMv8 AArch64 APP_ABI := arm64-v8a
IA-32 APP_ABI := x86
Intel64 APP_ABI := x86_64
サポート対象のすべての命令セット APP_ABI := all

注: all は NDKr7 以降で使用できます。

複数の値を同じ行に空白で区切って配置すると、複数の値を指定することもできます。 次に例を示します。

APP_ABI := armeabi-v7a arm64-v8a x86

注: Gradle の externalNativeBuild ディレクティブを使用して ndk-build プロジェクトを Gradle プロジェクトに統合する場合は、Application.mk ファイル内の APP_ABI 設定は無視されます。 Gradle スクリプトで abiFilters ブロックまたは splits ブロック内の abi ブロック(「複数 APK」を使用している場合)を使用してビルドするように ABI を設定できます。

サポート対象のすべての ABI 一覧と、使用法と制限の詳細については、ABI 管理をご覧ください。

APP_PLATFORM

この変数には、サポート対象の Android プラットフォームの最小バージョンを格納します。 たとえば、値を android-15 にすると、ライブラリで Android 4.0.3 (API レベル 15)より前のバージョンでは利用できない API を使用するよう指定されることになり、下位のプラットフォーム バージョンを実行している端末では使用できなくなります。 プラットフォーム名と対応する Android システム イメージの一覧は、Android NDK ネイティブ API をご覧ください。

このフラグを直接変更するのではなく、minSdkVersion プロパティを defaultConfig ブロック または productFlavorsブロック(module-level build.gradle ファイル内)で設定します。 これにより、Android の適切なバージョンを実行している端末にインストールされたアプリでのみライブラリが実行されるようになります。 ndk-build ツールチェーンは、以下のロジックを使用して、ビルド中の ABI と指定された minSdkVersion に基づいてライブラリの最小プラットフォーム バージョンを選択します。

  1. minSdkVersion と同じ ABI のプラットフォーム バージョンがある場合、ndk-build はそのバージョンを使用します。
  2. そうではなく、ABI 用の minSdkVersion より低いプラットフォーム バージョンがある場合、ndk-build はそれらのプラットフォーム バージョンのうちもっとも高いものを使用します。 通常、プラットフォーム バージョンがないということは、直前の利用可能バージョン以降、ネイティブ プラットフォーム API に変更がないことを意味するため、これが妥当な選択になります。
  3. そうでない場合、ndk-build は minSdkVersion より高い、次に利用可能なプラットフォーム バージョンを使用します。

APP_STL

NDK ビルドシステムでは、既定で STL `system` に設定されます。 他の選択肢として、`c++_shared`、`c++_static`、`none` があります。 NDK ランタイムと機能をご覧ください。

APP_SHORT_COMMANDS

プロジェクト全体の Application.mk にある LOCAL_SHORT_COMMANDS に相当します。 詳細については、Android.mk のこの変数のドキュメントをご覧ください。

APP_THIN_ARCHIVE

このプロジェクトのすべての静的ライブラリ モジュール用に、Android.mk ファイルで LOCAL_THIN_ARCHIVE の既定値を設定します。 詳細については、Android.mkLOCAL_THIN_ARCHIVE のドキュメントをご覧ください。