android.mkの使用の概要(PREBUILT_SHARED_LIBRARYおよびBUILD_SHARED_LIBRARY拡張機能で説明)



Introduction Use Android



序文:

Android NDKは現在、コンパイル済みライブラリ(動的ライブラリ/静的ライブラリ)を使用してコンパイルプロセスを高速化するプリコンパイル済みライブラリをサポートしており、開発者はソースコードを提供する必要はなく、動的ライブラリの形式で提供します。

1.コンパイル済みのダイナミックライブラリモジュールを使用する

1.1プリコンパイルされたモジュールの確認

Androidコンパイルツールの場合、プリコンパイルされた各ライブラリは、独立したモジュールとして宣言する必要があります。次に例を示します。libc.soファイルはAndroid.mkと同じディレクトリにあり、ダイナミックライブラリは次のように定義できます。



LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libc LOCAL_SRC_FILES := libc.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libc include $(PREBUILT_SHARED_LIBRARY) Note: The LOCAL_EXPORT_C_INCLUDES definition ensures that any modules that rely on this precompiled library Will be automatically added to the include target of this pre-compiled library in its own LOCAL_C_INCLUDES variable Recorded path so that the header file can be found.

プリコンパイルされたモジュールはコンパイルする必要がないため、コンパイル時間を大幅に短縮できます。 libc.soのプリコンパイル済みモジュールは、$ PROJECT / obj / localの下にコピーされ、$ PROJECT / lib /の下にもコピーされます。

1.2プリコンパイルされたモジュールへの参照

test.cがlibc.soに依存している場合、プリコンパイルされたモジュールが最初のステップで宣言された後。つまり、LOCAL_SHARED_LIBRARIESを使用して、現在のモジュールの依存関係リストを一覧表示できます。



include $(CLEAR_VARS) LOCAL_MODULE := test LOCAL_SRC_FILES:= test.c LOCAL_SHARED_LIBRARIES := libc include $(BUILD_EXECUTABLE)

2.ダイナミックライブラリモジュールを構築します

include $ (CLEAR_VARS) #This step is mainly to clear the variables defined at the beginning of LOCAL_XXX, which is a necessary operation LOCAL_C_INCLUDES: = $ (LOCAL_PATH) / include #Define the directory required for the header files required by the source files LOCAL_MODULE: = libhello-android #Define the name of the compiled module LOCAL_SHARED_LIBRARIES: = liblog #The dynamic library that this module needs to compile LOCAL_SRC_FILES: = src / hello-android.c #define the source files needed to compile the module include $(BUILD_SHARED_LIBRARY)

3.他のパラメータの導入

Android.mkのいくつかのパラメーターの紹介

LOCAL_PATH

Android.mkファイルはLOCAL_PATH開始、使用development treeでソースファイルを検索する必要があります

$(CLEAR_VARS)を含める

CLEAR_VARS指定されたものを指すGNU MakefileそしてたくさんクリーンアップするLOCAL_XXX変数などLOCAL_MODULE, LOCAL_SRC_FILES待って、 クリーンアップされませんLOCAL_PATH 。すべてのコンパイル制御ファイルは同じGNU Makefile解析と実行で構成されているため、変数はグローバルであり、相互の影響を避けるためにクリーンアップする必要があります



LOCAL_MODULE

各モジュールの名前は一意である必要があり、スペースを含めることはできません。システムは現在構築中ですshared-library、自動的に接頭辞libおよび接尾辞.so

note:モジュール名自体がすでにある場合lib最初に、システムはプレフィックスを追加しませんが、サフィックスを追加します

LOCAL_SRC_FILES

現在のモジュールのソースファイル(C / C ++ファイル)を指定します。これは、C ++ソースコードのデフォルト拡張子です.cppLOCAL_CPP_EXTENSION modifyによっても変更できます

BUILD_SAHRED_LIBRARY

この変数はビルドスクリプトを指し、渡されたすべてのLOCAL_XXX変数を収集して現在のモジュールに関する情報を指定し、リストしたソースファイルに基づいてダイナミックライブラリ(.so)をビルドします。この変数を使用する前に、少なくともLOCAL_MODULE with LOCAL_SRC_FILESを定義する必要があります。

BUILD_STATIC_LIBRARY

静的ライブラリの構築に使用されます(.a)

PREBUILT_SHARED_LIBRARY

プリコンパイルされたダイナミックライブラリを指定するために使用され、BUILD_SAHRED_LIBRARY with BUILD_STATIC_LIBRARY異なる、このモジュールは対応しますLOCAL_SRC_FILESソースファイルにすることはできませんが、コンパイルされたダイナミックライブラリのパスのみです。などfoo/libfoo.so

PREBUILT_STATIC_LIBRARY

プリコンパイルされた静的ライブラリを指定するために使用されます

TARGET_ARCH

ターゲットCPUアーキテクチャ、ほとんどの互換性ARM命令の構築、通常使用arm、対CPUアーキテクチャのバージョンは関係ありません

TARGET_PLATFORM

ターゲットプラットフォームAndroid APIバージョン番号。

たとえば、androi4.4システムの対応する値は次のとおりです。TARGET_PLATFORM:= android-19

TARGET_ARCH_ABI

指定CPUファイルの名前と構造に1つ以上の値を指定できます。可能な値は次のとおりです:

  • ARMv5TE -----> armeabi
  • ARMv7 -----> armeabi-v7a
  • ARMv8 AArch64 -----> arm64-v8a
  • i686 -----> x86
  • x86-64 -----> x86-64
  • mips32(r1)-----> mips
  • mips64(r6)-----> mips64
  • すべて----->すべて

TARGET_ABI

Connected Android API with ABI 2つの値、例:TARGET_ABI:= android-19-arm64-v8a

LOCAL_MODULE_FILENAME

このオプションは、モジュールのデフォルト名を上書きできます。次に例を示します。

LOCAL_MODULE:= foo
LOCAL_MODULE_FILENAME:= libnewfoo

システムは最終的にlibnewfoo.soを生成します

LOCAL_SRC_FILES

モジュールを構築するソースファイルのリストが含まれています。相対パスまたは絶対パスを使用できますが、絶対パスを使用せずに相対パスを使用することをお勧めします。これにより、移植性が向上します。

LOCAL_CPP_EXTENSION

指摘C++ソースファイル拡張子

LOCAL_CPP_FEATURES

この変数は、現在のモジュールが何に依存しているかを示しますC++機能(オプション)
LOCAL_CPPFLAGSオプションの受け渡し-frtti with -fexceptionの代わりにこの変数を使用することをお勧めします
この変数を使用すると、システムは適切なflag使用中LOCAL_CPPFLAGSコンパイラに着信flagsを使用させることができます。

LOCAL_CPP_FEATURES:= rtti->(実行時型情報を使用)

LOCAL_CPP_FEATURES:=例外->(C ++例外を使用)

LOCAL_C_INCLUDES

コンパイル時に指定include相対的なパスのリストNDK ROOT目次

LOCAL_CFLAGS

コンパイル中であることを示しますC/C++追加予定flags

注:ここで最適化オプションとデバッグレベルを変更しないでください。これらのオプションはApplication.mkで自動的に指定する必要があります。

include目次を指定することもできます。

LOCAL_CFLAGS + = -I

この方法はLOCAL_C_INCLUDESよりも優れていますndk-gdb使用できるため

LOCAL_CXXFLAGS

LOCAL_CPPFLAGSエイリアス

LOCAL_CPPFLAGS

指定されたコンパイルC++コード時間flags、これらのオプションはコンパイラのコマンドラインに続きますLOCAL_CFLAGS背後にあります

LOCAL_STATIC_LIBRARIES

モジュールのコンパイルに必要な静的ライブラリのリストを指定します
現在のモジュールがダイナミックライブラリまたは実行可能ファイルの場合、変数は、変数にリストされている静的ライブラリを最終的なバイナリファイルにリンクするようにコンパイラに指示します。
現在のモジュールが静的ライブラリである場合、変数は、現在のモジュールに依存する他のライブラリも変数によって宣言されたライブラリに依存することを単に示します。

LOCAL_SHARED_LIBRARIES

現在のモジュールをruntimeダイナミックライブラリに一覧表示します

LOCAL_WHOLE_STATIC_LIBRARIES

静的ライブラリのフルリンク。LOCAL_STATIC_LIBRARIESとは異なり、--whole-archiveの使用と同様です。

LOCAL_LDLIBS

この変数には、ダイナミックライブラリまたは実行可能ファイルをコンパイルする際の追加のリンクオプションのリストが含まれています。これにより、-lプレフィックスを使用して、指定されたシステムライブラリを渡すことができます。次に例を示します。

LOCAL_LDLIBS:= -lz

上記のコードは、モジュールをコンパイルするときに接続するようにコンパイラーに指示します/system/lib/libz.so

LOCAL_ALLOW_UNDEFIEND_SYMBOLS

デフォルトでは、システムはundefined referenceエラーがスローされたときにundefined symbol errorを検出します。
変数がtrueに設定されている場合、それは閉じますundefined reference検査

静的ライブラリのコンパイル時にこの変数を指定すると、システムは変数を無視します

LOCAL_ARM_MODE

デフォルトでは、システムによって生成されるバイナリファイルはthumbモードであり、各コマンドは16ビットであり、これを接続します/thumb under STL libraries。変数をarmに設定すると、生成された命令を32ビットにすることができます。次に例を示します。

LOCAL_ARM_MODE := arm

特定のソースファイルを.armこれで終了して、ファイルをarmモードにコンパイルするように指定することもできます。次に例を示します。

LOCAL_SRC_FILES := foo.c bar.c.arm

注:同じ目的を達成するためにApplication.mk指定APP_OPTIM := debugすることもできます

LOCAL_ARM_NEON

この変数のみABI指定者armeabi-v7a使用可能な場合にのみ有効です。 trueに設定すると、浮動小数点のネオン命令へのコンパイルについて説明します。これにより、浮動小数点演算が大幅に高速化されます(ハードウェアがサポートされている場合)。
同時に、.neon終了してソースファイルのサポートを指定できますneon、例:

LOCAL_SRC_FILES := foo.c.neon bar.c zoo.c.arm.neon

上記のコードは、zoo.c設定armモードもサポートneonを示しています。

LOCAL_DISABLE_NO_EXECUTE

Android NDK r4追加NX bitセキュリティ機能。このオプションはデフォルトでオンになっています。オフにする場合は、次のことができますLOCAL_DISABLE_NO_EXECUTEこの変数はtrueに設定されます
変数は変更されませんABI、そしてオンになっているデバイスのARMv6+ CPUのみ

LOCAL_DISABLE_RELRO

デフォルトでは、NDKコードのコンパイル時に追加されますread-only relocations with GOT protection
この変数は、runtime linker in relocation次に、メモリがread-only確認しながらsecurity exploitより困難であることを示します。

これらの保護はAndroid API 16以上でのみ機能します

この変数を変更しますLOCAL_DISABLE_RELRO設定true、上記のメカニズムをオフにすることができます

LOCAL_DISABLE_FORMAT_STRING_CHECKS

デフォルトでは、システムはコンパイル時に実行されますstringフォーマットチェック。このチェックはデフォルトで有効になっていますが、変更できますLOCAL_DISABLE_FORMAT_STRING_CHECKSこの変数はtrueに設定されていますこのチェックをキャンセルするには

LOCAL_EXPORT_CFLAGS

変数flagsで宣言されたものはすべてLOCAL_STATIC_LIBRARIESまたはLOCAL_SHARED_LIBRARIES現在の静的ライブラリまたは動的ライブラリLOCAL_CFLAGS Inに依存するモジュールを宣言します。次に例を示します。

$(CLEAR_VARS)を含める
LOCAL_MODULE:= foo
LOCAL_SRC_FILES:= foo / foo.c
LOCAL_EXPORT_CFLAGS:= -DFOO = 1
$(BUILD_STATIC_LIBRARY)を含める

$(CLEAR_VARS)を含める
LOCAL_MODULE:=バー
LOCAL_SRC_FILES:= bar.c
LOCAL_CFLGAS:= -DBAR = 2
LOCAL_STATIC_LIBRARIES:= foo
$(BUILD_SAHRED_LIBRARY)を含める

ここで、システムは-DFOO=1 with -DBAR=2すべてがbar.cになります
さらに、zoo依存bar、およびbar依存foo、その後zoo継承fooの場合、すべての依存関係は推移的です。モジュールexported flags
システムは配信しませんexported flagsたとえば、現在のモジュールの場合、-DFOO=1渡されませんfoo

LOCAL_EXPORT_CPPFLAGS

エクスポートinclude paths、たとえば、変数はbar.c含める必要がありますfooモジュールヘッダーファイル

LOCAL_EXPORT_LDFLAGS

この変数は同じ効果がありますLOCAL_EXPORT_CFLAGS、ただlinker flags

LOCAL_EXPORT_LDLIBS

この変数は、指定されたシステムライブラリをコンパイラに渡すようにシステムに指示します。システムはインポートされた接続属性をLOCAL_LDLIBSに追加します。例:

$(CLEAR_VARS)を含める
LOCAL_MODULE:= foo
LOCAL_SRC_FILES:= foo / foo.c
LOCAL_EXPORT_LDLIBS:= -log
$(BUILD_STATIC_LIBRARY)を含める

$(CLEAR_VARS)を含める
LOCAL_MODULE:=バー
LOCAL_SRC_FILES:= bar.c
LOCAL_STATIC_LIBRARIES:= foo
$(BUILD_SHARED_LIBRARY)を含める

システムはコンパイルされますlibbar.so時間は-llog接続コマンドラインの最後に配置されます

LOCAL_SHORT_COMMANDS

モジュールに多数のソースファイルまたは依存ライブラリがある場合、この変数をtrueに設定できます。その後、システムは@ Syntaxを使用して、オブジェクトファイルまたはバイナリファイルを直接インクルードします。機能はin Windows役立つ、またはin Application.mk定義済みAPP_SHORT_COMMANDS各モジュールでこのプロパティを有効にする

LOCAL_THIN_ARCHIVE

静的ライブラリを構築する場合、この変数をtrueに設定できます。システムはa archive 'File'を生成します。ライブラリファイルにはオブジェクトファイルは含まれませんが、各オブジェクトに対応するパスのみが含まれます。ファイル

my-dir

このマクロは最後のマクロを返しますmakefileパスは通常現在Android.mkパスです。このマクロは通常Android.mk初期定義LOCAL_PATH変数で使用されます。例:

LOCAL_PATH:= $(my-dirを呼び出す)

all-subdir-makefiles

現在を返すmy-dirパスの下のすべてのサブディレクトリAndroid.mk

this-makefile

現在のリターンmakefileのルート

親-makefile

リターンには現在のmakefileの父makefileのルートが含まれます

祖父母-makefile

リターンには現在のmakefile祖父makefileのルートが含まれます

import-module

特定のモジュールを含めるために使用できますAndroid.mk、使用法は次のとおりです。

$(call import-module,)