android 系統常用Androd.mk文件語句解釋-整理

==========
LOCAL_DEX_PREOPT := false  直接打包生成.apk 不會附帶生成.odex文件了 
======================
LOCAL_PATH:= $(call my-dir)  
用於確定源碼所在的目錄,最好把它放在CLEAR_VARS變量引用的前面,因爲它不會被清除,每個Android.mk只需要定義
一次即可,表示LOCAL_PATH的值爲當前路徑的值,用於返回當前路徑
include $(CLEAR_VARS)   
它清空了很多以LOCAL_開頭的變量(LOCAL_PATH除外)。由於所有的MakeFile都是在一個編譯環境下執行的,因此
變量的定義理論上是全局的,在每個模塊編譯開始前進行清理工作是必要的。表示清空所有LOCAL_xxx的變量,不影響後面這些變量的使用
LOCAL_MODULE_TAGS := optional  表示該模塊在所有版本下都編譯
LOCAL_SRC_FILES := $(call all-subdir-java-files)   表示編譯的源代碼文件列表,添加所有的java 源文件
LOCAL_PACKAGE_NAME := jnisample   表示生成的apk的名稱,即此例爲jnisample.apk
LOCAL_JNI_SHARED_LIBRARIES := libtest   表示生成的so文件的名稱,此例即爲libtest.so
LOCAL_CERTIFICATE := platform 表示使應用獲得系統權限,即可以在源碼環境下編譯類似於sharedUserId="android.uid.system"
include $(BUILD_PACKAGE)    每個編譯模塊都是以include $(CLEAR_VARS)開始,以include $(BUILD_XXX)結束
include $(LOCAL_PATH)/jni/Android.mk   表示編譯工程文件下面的jni/Android.mk文件
include $(call all-makefiles-under,$(LOCAL_PATH))   表示編譯工程內的所有mk文件
======================================
LOCAL_MODULE 模塊名,需保證在整個編譯系統中是唯一存在的,而且中間不可以有空格。指定 拷貝後的apk的名字(全名),這個變量裏可以有路徑,但路徑也會被拷貝,創建,如果 是在編譯整個Android的源碼,這個apk必須已經添加到了PRODUCT_PACKAGES 變量裏,否則 不會拷貝到,相應的位置,
LOCAL_MODULE模塊必須定義,以表示Android.mk中的每一個模塊。名字必須唯一且不包含空格。
Build System會自動添加適當的前綴和後綴。例如,foo,要產生動態庫,則生成libfoo.so. 但請注意:如果模塊名被定爲:libfoo.則生成libfoo.so. 不再加前綴。
===========================
LOCAL_MODULE_PATH 指定拷貝的路徑,如果路徑不存在自己創建,模塊的輸出路徑
LOCAL_MODULE_PATH := $(TARGET_PREINSTALL_APPS)  一般用於預置類中使用
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
===========================
LOCAL_SRC_FILES 
模塊編譯過程中涉及到的源文件。如果是JAVA程序,可以考慮調用all-subdir-java-files來一次性添加目錄(包括子目錄)下所有的java文件
因爲有LOCAL_PATH,這裏只需要給出文件名(相對路徑)即可;而且編譯系統有比較強的推導功能,可以自動計算依賴關係。指定 源apk
===========================
LOCAL_MODULE_CLASS 指定文件類型,apk文件用APPS, 並且 會檢查 是否是apk文件,動態庫so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件 用ETC
標識所編譯模塊最後放置的位置。ETC表示放置在/system/etc.目錄下,APPS表示放置在/system/app目錄下,SHARED_LIBRARIES表示放置在/system/lib目錄下。如果具體指定,則編譯的模塊不會放到編譯系統中,最後會在out對應product的obj目錄下的對應目錄中。
注意:若是被預置的apk裏有so庫,需要將從Test.apk的 so庫拷貝到 out/target/product/xxx/system/lib/目錄下,若無 so 庫,則去掉此步;
方法一 只能針對 一個文件,方法二 可以 針對多個文件,但 只能 把 文件 拷貝到 system/lib/ 下,
Android提供了Prebuilt編譯方法,兩個文件prebuilt.mk和multi_prebuilt.mk,對應的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。
prebuilt.mk就是prebuilt的具體實現,它是針對獨立一個文件的操作,multi_prebuilt.mk 可以針對多個文件的,它對多個文件進行判斷,然後調用prebuilt對獨立一個文件進行處理。
===========================
LOCAL_PACKAGE_NAME := PartnerLayout  
 沒有加LOCAL_PRIVILEGED_MODULE := true 就是默認在system/app裏面
LOCAL_PRIVILEGED_MODULE := true 模塊裝入system/priv-app
===========================
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) 預置APK使得用戶可以卸載,恢復出廠設置時不能恢復。指定拷貝的路徑,如果路徑不存在自己創建
===========================
LOCAL_CERTIFICATE := PRESIGNED 表示 這個apk已經簽過名了,系統不需要再次 簽名;
LOCAL_CERTIFICATE := platform
就代表使用platform來簽名,這樣的話這個apk就擁有了和system相同的簽名,因爲系統級別的簽名也是使用的platform來簽名,此時使用android:sharedUserId="android.uid.system"纔有用!
===========================
LOCAL_MODULE_TAGS :=user eng tests optional
當前模塊所包含的標籤,一個模塊可以包含多個標籤。標籤的值可能是eng、user、debug、development、optional。其中,optional是默認標籤。
user: 指該模塊只在user版本下才編譯
eng: 指該模塊只在eng版本下才編譯
tests: 指該模塊只在tests版本下才編譯
optional:指該模塊在所有版本下都編譯
===========================
LOCAL_REQUIRED_MODULES := SoundRecorder  
//表示該模塊需要SoundRecorder模塊,在系統編譯的時候就會將SoundRecorder放入到system.img中,如果單獨編譯mm的話就不會關心SoundRecorder
===========================
LOCAL_PROGUARD_FLAG_FILES := proguard.flags 和 proguard.flags文件 簡單點說,proguard是用來做Java代碼混淆的一個工具。比如,我們在 Android 的項目中使用了JNI,當使用了proguard後,會發現native方法有很多變量找不到,仔細分析後你會發現,原因是被progurad優化掉了。所以,我們建議在JNI應用中應該慎用progurad。
針對Android 選擇user版本進行編譯的時候,會出現proguard錯誤,我們需要知道的事情
1.proguard是做什麼的,他的作用是將Java代碼進行混淆的工具
2.因爲proguard是混淆工具,所以android的mk文件也對其支持爲兩種方式:
  1.指定不需要混淆的native方法與變量的proguard.flags文件如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
2.制定編譯的工程,不要使用代碼混淆的工具進行代碼混淆如:LOCAL_PROGUARD_ENABLED := disabled
  3.不設置,默認使用LOCAL_PROGUARD_ENABLED := full.即將該工程代碼全部混淆
===========================
include $(call all-makefiles-under,$(LOCAL_PATH))
 如果當前目錄下有文件需要編譯,而且在當前目錄下還有子目錄,子目錄中也有文件需要編譯,那麼當前目錄下的Android.mk除了要包含編譯當前目錄下文件的語句,同樣也要包含告訴編譯器在編譯完當前目錄下的文件後,繼續向子目錄深入的語句。
=========
LOCAL_MODULE_STEM
表示編譯鏈接後的目標文件的文件名,不帶後綴
=========
LOCAL_JAVA_LIBRARIES 是添加的動態庫,
LOCAL_STATIC_JAVA_LIBRARIES是添加的靜態庫(編譯會以拷貝的方式加到需要他的應用中)
=======
LOCAL_OVERRIDES_PACKAGES需要說明一下,此變量可以使其他的模塊不加入編譯
如: 源碼中DeskClock的android.mk有
LOCAL_OVERRIDES_PACKAGES := AlarmClock
使 AlarmClock不會加入到編譯系統中,不會生成 AlarmClock.apk。
=========
my-dir:返回當前路徑
all-java-files-under:獲得指定目錄及子目錄一所有java文件
all-subdir-c-files:獲得當前目錄下及子目錄下所有c文件
$(call all-Iaidl-files-under, <src>) 獲取指定目錄下的所有AIDL文件
$(call all-makefiles-under, <folder>) 獲取指定目錄下的所有Make文件
$(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>) 獲取Build輸入的目標文件夾路徑
===========
include $(BUILD_PACKAGE) 編譯apk
---
include $(BUILD_PREBUILT) 預置apk
---
include $(BUILD_STATIC_JAVA_LIBRARY) 添加靜態java庫
---
include $(BUILD_EXECUTABLE)  
include $(call all-makefiles-under,$(LOCAL_PATH)) 編譯生成可執行文件
---
include $(BUILD_SHARED_LIBRARY) 編譯生成動態庫
===========
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 無源碼只有apk 的客製化預置情況下用的 大概意思可能是就是Android的apk吧
LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
============
ifeq ($(TARGET_BUILD_VARIANT),user)
WITH_DEXPREOPT := true
DONT_DEXPREOPT_PREBUILTS := true
endif
這兩個組合使用,可以使那些 prebuild的app不會被提前優化(pre-optimized),即就是那些在Android.mk中包含intclude $(BUILD_PREBUILT)的app都不會被提前優化
預編譯的包是指那些在模塊編譯文件中指定爲:include $(BUILD_PREBUILT) 的APK和JAR包等,這在升級包中佔了一大部門; 
DONT_DEXPREOPT_PREBUILTS 變量就可以配置這部門代碼是否進行預編譯優化;
================
有源碼的預置和沒源碼的預置,設置的內容不同


LOCAL_PACKAGE_NAME :=UserManual 有源碼 放在packages/app下面編譯時需要加,直譯(創建APK的名稱)
表示package的名字,這個名字在腳本中將標識這個app或package
======
LOCAL_DEX_PREOPT apk的odex優化開關,默認是false
======
LOCAL_CC 用於指定C編譯器
LOCAL_CXX 用於指定C++編譯器
LOCAL_CPP_EXTENSION 用於指定特殊的C++文件後綴名
LOCAL_CFLAGS C語言編譯時的額外選項
LOCAL_CXXFLAGS C++語言編譯時的額外選項
LOCAL_C_INCLUDE 編譯C和C++程序所需要的額外頭文件
LOCAL_STATIC_LIBRARIES 編譯所需的靜態庫列表
LOCAL_SHARED_LIBRARIES 編譯時所需要的動態庫列表
LOCAL_JAVA_LIBRARIES 編譯時所需要的JAVA類庫
LOCAL_LDLIBS 編譯時所需要的鏈接選項
======
BUILD_HOST_STATIC_LIBRARY
BUILD_HOST_SHARED_LIBRARY
BUILD_STATIC_LIBRARY
BUILD_RAW_STATIC-LIBRARY
BUILD_SHARED_LIBRARY
BUILD_EXECUTABLE
BUILD_RAW_EXECUTABLE
BUILD_HOST_EXECUTABLE
BUILD_PACKAGE
BUILD_HOST_PREBUILT
BUILD_PREBUILT
BUILD_MULTI_PREBUILT
BUILD_JAVA_LIBRARY
BUILD_STATIC_JAVA_LIBRARY
BUILD_HOST_JAVA_LIBRARY
BUILD_DROIDDOC
BUILD_COPY_HEADERS
BUILD_KEY_CHAR_MAP 各種形式的編譯模板,如靜態、動態庫文件,可執行文件,文檔等

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