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

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/

时间: 2024-11-05 00:41:48

安卓 build/core/Makefile 以及main.mk的相关文章

ASP.NET Core 中的 Main 方法

ASP.NET Core 中的 Main 方法 在 ASP.NET Core 项目中,我们有一个名为Program.cs的文件.在这个文件中,我们有一个public static void Main()方法 . public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder Create

6.ASP.NET Core中的Main方法

在这篇文章中,我将带领大家详细学习ASP.NET Core 中的Main方法.在这篇文章中,我将向大家详细介绍下面几个问题: ASP.NET Core Main方法的重要性 为什么我们在ASP.NET Core中会有一个Main方法? 当你运行一个ASP.NET Core应用程序的时候,背后发生了什么? 为了解释这些问题,我们首先打开,在之前的文章中,新建的空模板的ASP.NET Core项目. 你可以看到我们有一个Program类文件,里面包含图中所示的代码. 从上图中,我们可以看到程序包含一

/build/core/config.mk

# 如果定义了ANDROID_BUILD_SHELL,则ANDROID_BUILD_SHELL # 否则使用默认的/bin/bash ifdef ANDROID_BUILD_SHELL SHELL := $(ANDROID_BUILD_SHELL) else SHELL := /bin/bash endif # Utility variables. empty := space := $(empty) $(empty) comma := , # Note that make will eat t

剖析安卓build系统的设计思想以及案例模拟

1.引言 安卓系统在根目录中只有一个Makefile文件,每个模块只有一个android.mk文件,这是Makefile文件的一个片段,为什么要这么设计呢?这种设计方式解决了什么问题呢?相信读完本文将会找到这些问题的答案. 2.问题的提出 对于一个小菜鸟来说,最先想到的方案是为每个模块写一个makefile,示例工程如下: Project ----Makefile ----ant ----Makefile ----main.c ----bee ----Makefile ----parse.c -

android编译系统的makefile文件Android.mk写法如下

(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:LOCAL_PATH:=$(call my-dir)上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径. (2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束.include $(CLEAR_VARS)

关于s5pv210的配置、编译过程中相关文件的分析(Makefile、config.mk、mkconfig)

uboot为用户提供两种编译方式,一种是在uboot当前目录下进行编译,第二种方式就是将编译生成的文件输出到指定的目录下. 1) Add O= to the make command line # 'make O=/tmp/build all' # # 2) Set environement variable BUILD_DIR to point to the desired location # 'export BUILD_DIR=/tmp/build' # 'make' # # The se

makefile 与android.mk中加信息打印

makefile里面加打印: [table]@echo ' zImage - Compressed kernel image' android.mk里面加信息打印: $(warning TEXT......) 这个函数被运行的时候.会输出:TEXT......,可是make会继续运行下去. $(error TEXT......) 这个函数被运行的时候,会输出:TEXT.......而且终止make的运行. 当中"TEXT....."能够替换为对变量的取值来输出变量的信息,比如:$(wa

makefile 与android.mk中加打印信息

[table]@echo ' zImage - Compressed kernel image' android.mk里面加打印信息: $(warning TEXT......) 这个函数被执行的时候,会输出:TEXT......,但是make会继续执行下去. $(error TEXT......) 这个函数被执行的时候,会输出:TEXT......,并且终止make的执行. 其中“TEXT.....”可以替换为对变量的取值来输出变量的信息,例如:$(warning $(VAR)),那么该函数执

【转】Android编译系统详解(三)——编译流程详解

原文网址:http://www.cloudchou.com/android/post-276.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 1.概述 编译Android的第三步是使用mka命令进行编译,当然我们也可以使用make –j4,但是推荐使用mka命令.因为mka将自动计算-j选项的数字,让我们不用纠结这个数字到底是多少(这个数字其实就是所有cpu的核心数).在编译时我们可以带上我们需要编译的目标,假设你想生成recovery,那么使用mka recov