以下內容節選自本書

編寫模組的編譯檔案,實際就是定義一系列以“LOCAL_”開頭的編譯變數,因此我們有必要弄明白這些變數的具體含義。下面是一些經常使用的LOCAL_編譯變數的說明:

變數名

說明

LOCAL_ASSET_FILES

編譯APK檔案時用於指定資源列表,通常寫成

LOCAL_ASSET_FILES+= $(call find-subdir-assets)

LOCAL_CC

自定義C編譯器來代替預設的編譯器。

LOCAL_CXX

自定義C++編譯器來代替預設的編譯器。

LOCAL_CFLAGS

定義額外的C/C++編譯器的引數。

LOCAL_CPPFLAGS

僅定義額外的C++編譯器的引數,不用在C編譯器中。

LOCAL_CPP_EXTENSION

自定義C++原始檔的字尾。例如:LOCAL_CPP_EXTENSION := .cc

注意:一旦定義,模組中所有的原始檔都必須使用該字尾,目前不支援混合字尾。

LOCAL_C_INCLUDES

指定標頭檔案的搜尋路徑。

LOCAL_FORCE_STATIC_EXECUTABLE

如果編譯時候需要連結的庫有共享和靜態兩者共存的情況。設定此變數值為true將會優先連結靜態庫。通常這種情況只會在編譯root/sbin目錄下的應用才會用到,因為他們執行的時間比較早,檔案系統的其他部分還沒有載入。

LOCAL_GENERATED_SOURCES

指定由系統自動生成的檔案列表。

LOCAL_MODULE_TAGS

定義模組標籤,Build系統根據標籤決定哪些模組被安裝。

LOCAL_REQUIRED_MODULES

指定依賴的模組。一旦本模組被安裝,通過此變數指定的模組也將被安裝

LOCAL_JAVACFLAGS

定義額外的javac編譯器的引數

LOCAL_JAVA_LIBRARIES

指定模組依賴的java共享庫

LOCAL_LDFLAGS

定義連結器ld的引數

LOCAL_LDLIBS

指定模組連結時依賴的庫。如果這些庫檔案不存在,並不會引發對它們的編譯。這是此變數和LOCAL_SHARED_LIBRARIES的主要區別。

LOCAL_NO_MANIFEST

在一個資源apk中可以指定此變數為true,表示此apk檔案沒有AndroidManifest.xml檔案。

LOCAL_PACKAGE_NAME

指定APP應用名稱。

LOCAL_PATH

指定Android.mk檔案所在的目錄。

LOCAL_POST_PROCESS_COMMAND

在編譯host相關的模組時,可以用此變數定義一條命令在link完成後執行。

LOCAL_PREBUILT_LIBS

指定預編譯c/c++動態和靜態庫列表。用於預編譯模組定義中。

LOCAL_PREBUILT_JAVA_LIBRARIES

指定預編譯java庫列表。用於預編譯模組定義中。

LOCAL_SHARED_LIBRARIES

指定模組依賴的c/c++共享庫列表。

LOCAL_SRC_FILES

指定原始檔列表。

LOCAL_STATIC_LIBRARIES

指定依賴的c/c++靜態庫列表。

LOCAL_MODULE

除應用(apk)LOCAL_PACKAGE_NAME指定模組名以外,其餘的模組都以LOCAL_MODULE指定模組名。

LOCAL_MODULE_PATH

指定模組在目標系統的安裝路徑。

LOCAL_UNSTRIPPED_PATH

指定模組的unstripped版本在out目錄下的儲存路徑。

LOCAL_WHOLE_STATIC_LIBRARIES

這個變數也是定義了模組依賴的靜態庫列表,和LOCAL_STATIC_LIBRARIES類似。但是通過這個變數定義,連結時連結器不會將靜態庫中無人呼叫的程式碼去掉。

LOCAL_YACCFLAGS

指定yacc的引數。

LOCAL_ADDITIONAL_DEPENDENCIES

指定本模組的依賴。用在不方便使用別的方法來指定依賴關係時。

LOCAL_BUILT_MODULE

指定編譯時存放中間檔案的目錄。

LOCAL_INSTALLED_MODULE

指定模組的安裝路徑。

LOCAL_MODULE_CLASS

定義模組的分類。根據分類,生成的模組檔案會安裝到目標系統相應的目錄下。例如:APPS:安裝到/system/app下;SHARED_LIBRARIES:安裝到/system/lib下;EXECUTABLES:安裝到/system/bin下;ETC:安裝到/system/etc下;但是如果同時用LOCAL_MOULE_PATH定義了路徑,則安裝到該路徑。

LOCAL_MODULE_NAME

指定模組的名稱。但是目前系統中用到它的例項。

LOCAL_MODULE_SUFFIX

指定當前模組的字尾。一旦指定,系統在產生目標檔案時,會以模組名加字尾來建立目標檔案

LOCAL_STRIP_MODULE

指定模組是否需要被strip,該模組是可執行檔案或動態庫才能使用該變數。

LOCAL_STRIPPABLE_MODULE

此變數的值通常由Build系統設定,一般可執行檔案和動態庫被設為true

LOCAL_SYSTEM_SHARED_LIBRARIES

此變數在編譯系統的基本庫,如:libclibmlibdl時,用來定義這些庫的依賴庫。通常在應用模組定義中不應使用該變數。

LOCAL_PRELINK_MODULE

編譯.so模組時,定義是否需要prelinkprelink是通過預連結的方式來加快程式啟動速度。如果要設定此值為true,要先在build/core/prelink-linux-arm.map檔案中定義該庫的地址和大小,否則報錯。但是在Android4.2以後的程式碼中找不到檔案prelink-linux-arm.map了,在build目錄下也搜尋不到這個變數。可能Android已經取消了prelink的功能。