Android build系統中常用LOCAL_變量

新書上市《深入解析Android 5.0系統》

 以下內容節選自本書


編寫模塊的編譯文件,實際就是定義一系列以“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的功能。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章