Application.mk

このドキュメントでは、アプリに必要なネイティブ モジュール について記述した 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_OPTIM

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

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

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

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

APP_CFLAGS

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

これらのフラグのすべてのパスは 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 と同等であるため動作しません。

注: この変数は、android-ndk-1.5_r1 の C ソースでのみ機能します。C++ ソースでは機能しません。 これ以降のすべてのバージョンで、APP_CFLAGS は Android ビルドシステム全体に適用されます。

APP_CPPFLAGS

この変数には、C++ ソースのビルドでのみ、ビルドシステムがコンパイラーに渡す一連の C++ コンパイラー フラグを指定します。

注: android-ndk-1.5_r1 では、この変数は C ソースと C++ ソースの両方で機能します。 これ以降のすべての NDK のバージョンで、APP_CPPFLAGS は Android ビルドシステム全体に適用されます。 C ソースと C++ ソースの両方に適用するフラグの場合、APP_CFLAGS を使用します。

APP_LDFLAGS

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

APP_BUILD_SCRIPT

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

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

APP_ABI

既定では、NDK ビルドシステムは armeabi ABI 向けのマシンコードを生成します。 このマシンコードは、ソフトウェア浮動小数点演算機能付きの ARMv5TE ベース CPU に対応します。 APP_ABI を使用して、別の ABI を選択することができます。 表 1 にはさまざまな命令セット用の APP_ABI 設定が記載されています。

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

命令セット
ARMv7 ベース端末上のハードウェア FPU 命令APP_ABI := armeabi-v7a
ARMv8 AArch64APP_ABI := arm64-v8a
IA-32APP_ABI := x86
Intel64APP_ABI := x86_64
MIPS32APP_ABI := mips
MIPS64(r6)APP_ABI := mips64
サポート対象のすべての命令セットAPP_ABI := all

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

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

APP_ABI := armeabi armeabi-v7a x86 mips

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

APP_PLATFORM

この変数にはターゲットの Android プラットフォームの名前が含まれます。たとえば、android-3 は Android 1.5 のシステム イメージを指定します。 プラットフォーム名と対応する Android システム イメージの一覧は、Android NDK ネイティブ API でご覧ください。

APP_STL

NDK ビルドシステムはデフォルトで、Android システムで提供される最小限の C++ ランタイム ライブラリ(system/lib/libstdc++.so)向けに C++ ヘッダーを提供します。 さらに、代替の C++ 実装も備えており、自分のアプリで使用したり、アプリにリンクしたりできます。APP_STL を使用すると、ランタイム ライブラリを選択できます。 サポート対象のランタイムと、これらが提供する機能については、NDK ランタイムと機能で詳細をご覧ください。

APP_SHORT_COMMANDS

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

NDK_TOOLCHAIN_VERSION

この変数を 4.9 または 4.8 に指定して、GCC コンパイラーのバージョンを選択します。 64 ビット ABI の規定バージョンは 4.9 で、32 ビット ABI の規定バージョンは 4.8 です。Clang のバージョンを選択する場合は、この変数を clang3.4clang3.5、または clang に指定します。 clang を指定すると、Clang の最新バージョンが選択されます。

APP_PIE

Android 4.1(API レベル 16)以降で、Android のダイナミック リンカーは、位置独立実行ファイル(PIE)をサポートします。 Android 5.0(API レベル 21)以降は、実行可能ファイルに PIE が必要です。PIE を使用して実行可能ファイルをビルドするには、-fPIE フラグを設定します。 このフラグでコードの位置をランダム化することで、メモリが破損されるバグに乗じた攻撃を受けにくくなります。 デフォルトでは、プロジェクトが android-16 以降をターゲットとしている場合、ndk-build はこの値を自動的に true に設定します。手動で true または false に設定することもできます。

このフラグは実行可能ファイルのみに適用されます。共有ライブラリまたは静的ライブラリのビルドには影響がありません。

注: PIE 実行可能ファイルは 4.1 以前の Android リリースでは実行できません。

この制限事項は実行可能ファイルのみに当てはまります。共有ライブラリまたは静的ライブラリのビルドには影響がありません。

APP_THIN_ARCHIVE

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