Android.mk文件使用速通手冊
一、Android.mk文件的作用
Android.mk是 Android 工程管理文件,類似于編譯文件的說明書,用來向編譯系統(tǒng)描述源代碼,并將源文件分組為模塊(包括靜態(tài)庫、共享庫、獨立可執(zhí)行文件)。
Android.mk 會被編譯系統(tǒng)解析一次或多次,可以在每一個 Android.mk 文件中定義一個或多個模塊,也可以多個模塊使用同一個 .mk 文件。
二、簡單示例
下面是一個簡單的 mk 文件示例,也是一個 mk 文件最基本的部分,我將對其進行詳細解析。
#源文件在開發(fā)樹中的位置 LOCAL_PATH := $(call my-dir) #清除LOCAL_PATH變量之外的LOCAL_XXX變量 include $(CLEAR_VARS) #需要編譯的文件 LOCAL_SRC_FILES :=$(call all-subdir-java-files) #生成的模塊名稱 LOCAL_MODULE := TestMK #編譯的標簽 LOCAL_MODULE_TAGS := optional #指定簽名 LOCAL_CERTIFICATE := platform #引用靜態(tài)jar LOCAL_STATIC_JAVA_LIBRARIES := jar1 jar2 #編譯apk include $(BUILD_PACKAGE) #需要進行預編譯的庫 include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jar1:path1 \ jar2:path2 include $(BUILD_MULTI_PREBUILT)
2.1 定義當前模塊的位置
LOCAL_PATH := $(call my-dir)
LOCAL_PATH
是表示當前模塊位置的變量,my-dir
是由系統(tǒng)提供的宏函數(shù),返回當前文件所在的路徑,$(call my-dir)
表示調(diào)用這個函數(shù)。
2.2 清除 LOCAL_XXX 變量
include $(CLEAR_VARS)
這句代碼清除了 LOCAL_PATH
變量之外的 LOCAL_XXX
變量。因為所有的編譯控制文件都在同一個 GNU MAKE 執(zhí)行環(huán)境中,所有的變量都是全局的,在編譯該模塊之前可能編譯過別的模塊,產(chǎn)生了大量變量,會被系統(tǒng)誤認為是屬于該模塊的,可能產(chǎn)生不可預知的錯誤。
2.3 需要編譯的文件
LOCAL_SRC_FILES :=$(call all-subdir-java-files)
LOCAL_SRC_FILES
變量代表需要編譯的文件,all-subdir-java-files
函數(shù)返回 LOCAL_PATH
子目錄的所有 java 文件。也可以直接寫出需要編譯的文件路徑:
LOCAL_SRC_FILES :=src/com/example/test/MainActivity.java \ src/com/example/test/Demo1.java \ src/com/example/test/Demo2.java
但要注意,在文件最后面加上以下語句,指明 LOCAL_PATH
目錄。
include $ (call all-makefiles-under,$(LOCAL_PATH))
或者在每個文件路徑下都加上 LOCAL_PATH
:
LOCAL_SRC_FILES :=$(LOCAL_PATH)/src/com/example/test/MainActivity.java \ $(LOCAL_PATH)/src/com/example/test/Demo1.java \ $(LOCAL_PATH) /src/com/example/test/Demo2.java
幾個常用的獲取源文件的方法:
$(call all-java-files-under, src)
:獲取指定目錄下的所有 Java 文件。
$(call all-c-files-under, src)
:獲取指定目錄下的所有 C 語言文件。
$(call all-Iaidl-files-under, src)
:獲取指定目錄下的所有 AIDL 文件。
$(call all-makefiles-under, folder)
:獲取指定目錄下的所有 Make 文件。
2.4 定義編譯生成的模塊名稱
LOCAL_MODULE := TestMK
LOCAL_MODULE
變量必須定義且唯一,作為模塊的標識,編譯系統(tǒng)會自動產(chǎn)生合適的前綴和后綴。
2.5 編譯的標簽
LOCAL_MODULE_TAGS := optional
常用的有:debug
, eng
, user
, development
或者 optional
(默認)。
2.6 簽名屬性
LOCAL_CERTIFICATE := platform
常用的有:platform
:該 APK 完成一些系統(tǒng)的核心功能。經(jīng)過對系統(tǒng)中存在的文件夾的訪問測試。shared
:該 APK 需要和 home/contacts 進程共享數(shù)據(jù)。media
:該 APK 是 media/download 系統(tǒng)中的一環(huán)。
2.7 引用靜態(tài) jar 庫
LOCAL_STATIC_JAVA_LIBRARIES := jar1 jar2
jar1、jar2 是第三方 Java 包的別名,需要定義,見后文 2.9。LOCAL_JAVA_LIBRARIES
用于引用動態(tài)jar。
2.8 編譯成 apk
include $(BUILD_PACKAGE)
include $(BUILD_STATIC_LIBRARY)
:編譯成靜態(tài)庫include $(BUILD_SHARED_LIBRARY)
:編譯成動態(tài)庫include $(BUILD_EXECUTABLE)
:編譯成可執(zhí)行程序include $(BUILD_STATIC_JAVA_LIBRARY)
:編譯成 Java 靜態(tài)庫
2.9 需要進行預編譯的庫
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jar1:path1 \ jar2:path2
jar1、jar2 定義靜態(tài)庫別名,path1、path2 是靜態(tài)庫的路徑,注意要一直寫到后綴 .jar。
2.10. 拷貝到本地編譯
include $(BUILD_MULTI_PREBUILT)
將 prebuild 定義的庫拷到本地進行編譯。
2.11. 指定生成目錄
通過 LOCAL_MODULE_PATH
變量,可以指定生成的 apk 目錄:
LOCAL_MODULE_PATH := $(TARGET_OUT)/xxx
$(TARGET_OUT)
代表 /system, 后續(xù)路徑按需要補充完整,如這里的 xxx。
$(TARGET_OUT_DATA_APPS)
代表 data/app 目錄。
結(jié)語
本文給出了一個簡單的 Android.mk 文件示例,并逐行解析了一些基礎(chǔ)指令,希望對大家有所幫助,更多關(guān)于Android.mk文件使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flutter 首頁必用組件NestedScrollView的示例詳解
今天介紹的組件是NestedScrollView,大部分的App首頁都會用到這個組件。對Flutter 首頁必用組件NestedScrollView的相關(guān)知識感興趣的一起看看吧2020-05-05Android ListView用EditText實現(xiàn)搜索功能效果
本篇文章主要介紹了Android ListView用EditText實現(xiàn)搜索功能效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03AndroidApk混淆編譯時,報告java.io.IOException...錯誤解決辦法
這篇文章主要介紹了 AndroidApk混淆編譯時,報告Error:Execution failed for task ‘:gviews:transformClassesAndResourcesWithProguardForRelease’.錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-03-03Android中Fragment多層嵌套時onActivityResult無法正確回調(diào)問題的解決方法
這篇文章主要介紹了Android中Fragment多層嵌套時onActivityResult無法正確回調(diào)問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09