安卓 build/core/Makefile 以及main.mk

來源:互聯網
上載者:User

標籤:設定   framework   遞迴調用   特定   create   doc   shared   col   fine   

android make 系統總共分為四層

  • arch
  • board
  • device
  • product

在各個字android.mk檔案中引用的定義都存放在./build/core/下!
比如android.mk中的
include $(CLEAR_VARS)
它對應的是在./build/core/config.mk中的CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk
include $(BUILD_PACKAGE)
它對應的是在./build/core/config.mk中的BUILD_PACKAGE:=$(BUILD_SYSTEM)/package.mk

main.mk中的模組
.PHONY:checkbuilt
.PHONY:prebuilt
.PHONY: files
.PHONY: ramdisk
.PHONY: systemimage
.PHONY: userdataimage
.PHONY: bootimage
.PHONY: recoveryimage
.PHONY: droidcore
.PHONY: apps_only
.PHONY: sdk
.PHONY: clean
.PHONY: clobber
.PHONY: modules
.PHONY: showcommands


在一個makefile檔案中,可以一次性的make出多個目標!每個獨立的目標其結構大體如下

LOCAL_PATH:=$(call my-dir) //擷取目前的目錄
#include $(CLEAR_VARS) //make系統為子模組定義了很多的私人變數,這個調用是為了初始化所有的私人變數
...
//裡面的內容根據不同的需要會出現不同的LOCAL變數
...
#include $(BUILD_XXX) //執行編譯任務


編譯APK
LOCAL_SRC_FILES:=$(call all-subdir-java-files)
LOCAL_PACKAGE_NAME:=packageName
include $(BUILD_PACKAGE)

編譯依賴靜態java庫的應用程式
LOCAL_STATIC_JAVA_LIBRARIES:=static-library
LOCAL_SRC_FILES:=$(call all-subdir-java-files)
LOCAL_PACKAGE_NAME:=packageName
include $(BUILD_PACKAGE)

編譯一個需要用平台key簽名的應用程式
LOCAL_SRC_FILES:=$(call all-subdir-java-files)
LOCAL_PACKAGE_NAME:=packageName
LOCAL_CERTIFICATE:=platform
include $(BUILD_PACKAGE)

編譯一個需要特定key的應用程式
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := LocalPackage
LOCAL_CERTIFICATE := vendor/example/certs/app
include $(BUILD_PACKAGE)

添加一個先行編譯應用程式
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE := LocalModuleName
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_MODULE := sample
include $(BUILD_STATIC_JAVA_LIBRARY)


常用的mk分類
Android.mk 用來編譯模組或者apk的,module對應native code,package對應於java
AndroidProducts.mk 設定product,設定系統包含了那些應用
target_<os>-<arch>.mk,host_<os>-<arch>.mk,<os>-<arch>.mk 針對不同的系統和CPU架框進行設定
BoardConfig.mk 設定主板用的,比如driver的選擇

./build/core/Makefile 定義了image是如何產生的

frameworks/base/core/java
擴充SDK時,可以向裡面添加自己的類

make參數
build/envsetup.sh 可以設定環境,運行之後會支援mm命令,使make支援只編譯一個模組
buildspec.mk

使用者也可以通過mm來編譯指定模組,或者通過make clean-module_name來刪除指定模組。

make ONE_SHOT_MAKEFILE=<path to Androiod.mk>

通過 CREATE_MODULE_INFO_FILE,build system會將所有的模組資訊列在$(PRODUCT_OUT)/module-info.txt中

make CREATE_MODULE_INFO_FILE=true 產生單個的image檔案,用以早期的硬體測試
HOST_BUILD_TYPETARGET_BUILD_TYPE 用來設定是debug還是release,debug的帶有調試資訊,這兩個參數也可以在 buildspec.mk中進行設定以防止在別處被重複指定

其它的一些變數
LOCAL_AAPT_FLAGS
LOCAL_ACP_UNAVAILABL
LOCAL_ADDITIONAL_JAVA_DIR
LOCAL_AIDL_INCLUDES
LOCAL_ALLOW_UNDEFINED_SYMBOLS
LOCAL_ARM_MODE
LOCAL_ASFLAGS
LOCAL_ASSET_DIR
LOCAL_ASSET_FILES 在與BUILD_PACKAGE一起時有效,表示資源檔
LOCAL_BUILT_MODULE_STEM
LOCAL_C_INCLUDES 用來指定外面的標頭檔路徑
LOCAL_CC 可以指定C編譯器
LOCAL_JAR_MANIFEST
LOCAL_JARJAR_RULES
LOCAL_JAR_PATH
LOCAL_SHARED_LIBRARIES 可連結動態庫
LOCAL_SRC_FILES 編譯源檔案
LOCAL_STATIC_JAVA_LIBRARIES
LOCAL_STATIC_LIBRARIES 可連結靜態庫
LOCAL_UNINSTALLABLE_MODULE
LOCAL_WHOLE_STATIC_LIBRARIES 禁止在串連時刪除庫中的無用代碼
LOCAL_FORCE_STATIC_EXECUTABLE 如果編譯的可執行程式要進行靜態連結(執行時不依賴於任何動態庫)
LOCAL_JAVA_LIBRARIES 編譯java應用程式和庫的時候指定包含的java類庫,目前有core和framework兩種
                     多數情況下定義成:LOCAL_JAVA_LIBRARIES := core framework
                     注意LOCAL_JAVA_LIBRARIES不是必須的,而且編譯APK時不允許定義(系統會自動添加)




envsetup.mk主要會讀取由envsetup.sh寫入環境變數中的一些變數來配置 編譯過程中的輸出目錄
config.mk裡面定義了各種module所需要的工具,以及如何來編譯各個模組
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk
以上的*.mk中都包含了base_rules.mk

products設定
./build/target/product/AndroidProducts.mk
module設定
native code和java的一些通用方法都在./build/core/definitions.mk中
BUILD_SHARE_xxx等變數在./build/core/config.mk中
Board
./build/target/board/$(TARGET_DEVICE)/BoardConfig.mk
./vendor/*/$(TARGET_DEVICE)/BoardConfig.mk
rules相關
與 LOCAL_MODULE_TAGS相關的定義


include $(BUILD_STATIC_LIBRARY) 編譯成靜態庫
include $(BUILD_SHARED_LIBRARY) 編譯成動態庫。
include $(BUILD_EXECUTABLE) 編譯成可執行程式

常用函數
call my-dir
call all-subdir-java-files
call all-java-files-under
call all-makefiles-under,$(LOCAL_PATH)
call all-clean-step
call import-module,android/native_app_glue
call inherit-product,xxx.mk
call inherit-product-if-exists
call device-test
call include-path-for,libpagemap
call dist-for-goals,dist_files,$(LOCAL_BUILT_MODULE)
call _add-charger-image,$(_img)
call libfilterfw-all-java-files-under,$(1)
call libfilterfw_to_document,$(LOCAL_PATH)
call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE,true)
call all-named-subdir-makefiles,$(legacy_modules)
call RM;call MKDIR
call emugl-begin-host-shared-library,libEGL_translator
call emugl-import,libOpenglOsUtils
call emugl-end-module
call emugl-export,LDLIBS,-lGL
cal emugl-export,LDFLAGS,$(GL_COMMON_LINKER_FLAGS)
call emugl-set-shared-library-subpath,hw
call emugl-export,C_INCLUDES,$(intermediates)
call all-makefiles-under,$(LOCAL_PATH) 這個和下面的區別還不清楚
call all-subdis-makefiles 這個是通常出現在整個makefile的尾部,以實現遞迴調用子目錄中的makefile,使整個make系統成為一個樹狀結構

轉自 shine80769769.blog.163.com/blog/static/1791482452012619105744163/

安卓 build/core/Makefile 以及main.mk

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.