diff --git a/Software/Development/OperatingSystem/Android/Build/Android_bp_文件说明.md b/Software/Development/OperatingSystem/Android/Build/Android_bp_文件说明.md index 9de1aee..0cb98aa 100644 --- a/Software/Development/OperatingSystem/Android/Build/Android_bp_文件说明.md +++ b/Software/Development/OperatingSystem/Android/Build/Android_bp_文件说明.md @@ -1,5 +1,7 @@ # Android bp 文件说明 +需要特别说明一点,使用 bp 文件需要通过 go 等方式间接实现条件编译,而 mk 文件直接支持条件编译。 + ## 1.应用配置 ### 1.1.static_executable diff --git a/Software/Development/OperatingSystem/Android/Build/Android_mk_文件说明.md b/Software/Development/OperatingSystem/Android/Build/Android_mk_文件说明.md index 852cd4c..46fd1fa 100644 --- a/Software/Development/OperatingSystem/Android/Build/Android_mk_文件说明.md +++ b/Software/Development/OperatingSystem/Android/Build/Android_mk_文件说明.md @@ -1,8 +1,23 @@ # Android mk 文件说明 -## 1.BOARD 配置 +## 1.基本语法 -### 1.1.BOARD_VENDOR_KERNEL_MODULES +注释文本以 # 开头。 + +## 2.系统模板 + +系统模板包含了最经常被使用的功能,使用前需要先 include: + +```mk +include $(CLEAR_VARS) +include $(BUILD_PREBUILT) +include $(BUILD_EXECUTABLE) +include $(BUILD_SHARED_LIBRARY) +``` + +## 3.BOARD 配置 + +### 3.1.BOARD_VENDOR_KERNEL_MODULES 指示要编译到 Vendor Image 中的独立内核模块,一般结合 TARGET_KERNEL_MODULES_OUT 宏使用: @@ -11,9 +26,94 @@ BOARD_VENDOR_KERNEL_MODULES += \ $(TARGET_KERNEL_MODULES_OUT)/rmouse.ko ``` -## 2.其他配置 +## 4.LOCAL 配置 -### 2.1.LOCAL_LDLIBS +### 4.1.LOCAL_MODULE + +指定模块的名称: + +```mk +LOCAL_MODULE := libdemo +# 或 +LOCAL_MODULE := demo +``` + +### 4.2.LOCAL_MODULE_CLASS + +LOCAL_MODULE_CLASS 用于指定 LOCAL_MODULE_PATH 的路径所在。 + +如果在 Android.mk 没有直接明确 LOCAL_MODULE_PATH 的话,需要通过以下规则来自动生成 base_rules.mk: + +```mk +LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH)) +ifeq ($(LOCAL_MODULE_PATH),) + #LOCAL_MODULE_CLASS := + LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)) + $(info *******//$(LOCAL_MODULE_PATH)) +ifeq ($(strip $(LOCAL_MODULE_PATH)),) + $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS "$(LOCAL_MODULE_CLASS)") + endif +endif +``` + +在不同的 Android.mk 文件中,对于模块 include() 不同的编译类型选项,比如对于 Library 或者 app,execut 等在调用对应的处理 mk 文件时,会默认就指定当前的 LOCAL_MODULE_CLASS 的值,比如 EXECUTABLES、SHARED_LIBRARIES 等。所以在自己编写的 Android.mk 可不显示的指定 LOCAL_MODULE_CLASS 的值。 + +但当遇到 include $(BUILD_PREBUILT) 的预编译选项时不会指定模块模块编译输出的类型 CLASS,需要在自己编写的 Android.mk 中明确指定 LOCAL_MODULE_CLASS 的值如 ETC/APP 等,使其值为非空,从而帮助系统确定 LOCAL_MODULE_PATH 的路径,比如最终编译输出: + +```mk +LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC) +``` + +LOCAL_MODULE_CLASS 可以取以下值: + +* APPS +* EXECUTABLES +* JAVA_LIBRARIES +* SHARED_LIBRARIES +* ETC +* FIRMWARE + +### 4.3.LOCAL_MODULE_TAGS + +一般为 optional。 + +```mk +LOCAL_MODULE_TAGS := optional +``` + +### 4.4.LOCAL_VENDOR_MODULE + +指定是否为 vendor 模块,取值为 true/false。 + +```mk +LOCAL_VENDOR_MODULE := true +``` + +### 4.5.LOCAL_PRELINK_MODULE + +指定是否为 Prelink 模块,利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,取值为 true/false。 + +```bash +LOCAL_PRELINK_MODULE := false +``` + +### 4.6.LOCAL_CFLAGS + +添加 C 编译参数。 + +```mk +LOCAL_CFLAGS := -Wall -O2 -fvisibility=hidden +``` + +### 4.7.LOCAL_CPPFLAGS + +添加 Cpp 编译参数。 + +```mk +LOCAL_CPPFLAGS := -Wall -O2 -fvisibility=hidden -fexceptions +``` + +### 4.8.LOCAL_LDLIBS LOCAL_LDLIBS :链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。且貌似只能链接那些存在于系统目录下本模块需要连接的库。如果某一个库既有动态库又有静态库,那么在默认情况下是链接的动态库而非静态库。 @@ -27,7 +127,7 @@ LOCAL_LDLIBS += -lm –lz –lc -lcutils –lutils –llog 注:如果是非系统的第三方库,貌似只能用 LOCAL_LDFLAGS 方式,LOCAL_LDLIBS 方式不行。 -### 2.2.LOCAL_SHARED_LIBRARIES +### 4.9.LOCAL_SHARED_LIBRARIES LOCAL_SHARED_LIBRARIES 会生成依赖关系,当库不存在时会去编译这个库。 @@ -37,9 +137,9 @@ LOCAL_SHARED_LIBRARIES 会生成依赖关系,当库不存在时会去编译这 LOCAL_SHARED_LIBRARIES := libutils libcutils ``` -### 2.3.LOCAL_LDFLAGS +### 4.10.LOCAL_LDFLAGS -LOCAL_LDFLAGS:这个编译变量传递给链接器一个一些额外的参数,比如想传递而外的库和库路径给 ld,或者传递给 ld linker 的一些链接参数,-On,-EL{B}(大小端字节序),那么就要加到这个上面,如: +LOCAL_LDFLAGS:这个编译变量传递给链接器一个一些额外的参数,比如想传递而外的库和库路径给 ld,或者传递给 ld linker 的一些链接参数,-On,-EL{B}( 大小端字节序 ),那么就要加到这个上面,如: ```mk LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWrecog –EB{EL} –O{n} … @@ -51,9 +151,27 @@ LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWrecog –EB{EL} –O{n} … LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n} ``` -### 2.4.LOCAL_FORCE_STATIC_EXECUTABLE +### 4.11.LOCAL_SRC_FILES -如果编译的可执行程序要进行静态链接(执行时不依赖于任何动态库),则设置 +指定需要编译的源码文件或在 Prebuilt 时指定 ELF 文件等。 + +```mk +LOCAL_SRC_FILES := \ + demo0.c \ + demo1.c +``` + +### 4.12.LOCAL_C_INCLUDES + +指定 C include path。 + +```mk +LOCAL_C_INCLUDES := $(LOCAL_PATH) +``` + +### 4.13.LOCAL_FORCE_STATIC_EXECUTABLE + +如果编译的可执行程序要进行静态链接 ( 执行时不依赖于任何动态库 ),则设置 ```mk LOCAL_FORCE_STATIC_EXECUTABLE = true @@ -62,3 +180,135 @@ LOCAL_FORCE_STATIC_EXECUTABLE = true 目前只有 libc 有静态库形式,这个只有文件系统中 /sbin 目录下的应用程序会用到,这个目录下的应用程序在运行时通常文件系统的其它部分还没有加载,所以必须进行静态链接。 启用该选项后程序将输出到 /sbin 目录下。 + +### 4.14.LOCAL_EXPORT_C_INCLUDE_DIRS + +The LOCAL_EXPORT_C_INCLUDES definition here ensures that any module that depends on the prebuilt one will have its LOCAL_C_INCLUDES automatically prepended with the path to the prebuilt's include directory, and will thus be able to find headers inside that. + +```mk +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES) +``` + +### 4.15.LOCAL_INIT_RC + +指定需要编译的 RC 文件。 + +```mk +LOCAL_INIT_RC := demo.rc +``` + +## 5.调试 + +### 5.1.增加调试信息 + +如下方式可在编译时打印调试信息: + +```mk +$(info a demo string) # 一般打印信息,仅仅是显示调试信息 +$(warning a demo string) # 警告级别打印信息,不会停止脚本运行,一般用于严重警告 +$(error a demo string) # 错误级别,会停止编译直接退出来 +``` + +## 6.参考模板 + +### 6.1.Prebuilt + +```mk +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := libdemo +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_TAGS := optional +LOCAL_VENDOR_MODULE := true +LOCAL_MODULE_PATH_32 := $(TARGET_OUT)/lib +LOCAL_MODULE_PATH_64 := $(TARGET_OUT)/lib64 +LOCAL_MULTILIB := both +LOCAL_SRC_FILES_arm := lib/libdemo.so +LOCAL_SRC_FILES_arm64 := lib64/libdemo.so +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := demo +LOCAL_MODULE_CLASS := EXECUTABLES +LOCAL_MODULE_TAGS := optional +LOCAL_VENDOR_MODULE := true +LOCAL_SRC_FILES := bin/demo +LOCAL_INIT_RC := etc/init/demo.rc +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := demo +LOCAL_SRC_FILES := demo.apk +LOCAL_MODULE_CLASS := APPS +LOCAL_MODULE_TAGS := optional +LOCAL_CERTIFICATE := platform +LOCAL_VENDOR_MODULE := true +LOCAL_DEX_PREOPT := false +LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) +include $(BUILD_PREBUILT) +``` + +### 6.2.C Lib and App + +```mk +LOCAL_PATH := $(call my-dir) + +# demo lib +include $(CLEAR_VARS) +LOCAL_MODULE := libdemo +LOCAL_MODULE_TAGS := optional +LOCAL_VENDOR_MODULE := true +LOCAL_PRELINK_MODULE := false +LOCAL_CFLAGS := -Wall -O2 -fvisibility=hidden +LOCAL_SRC_FILES := demo.cpp +LOCAL_C_INCLUDES := $(LOCAL_PATH) +LOCAL_SHARED_LIBRARIES := +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES) +include $(BUILD_SHARED_LIBRARY) + +# demo app +include $(CLEAR_VARS) +LOCAL_MODULE := demo +LOCAL_MODULE_TAGS := optional +LOCAL_VENDOR_MODULE := true +LOCAL_CFLAGS := -Wall -O2 +LOCAL_SRC_FILES := main.cpp +LOCAL_C_INCLUDES := $(LOCAL_PATH) +LOCAL_SHARED_LIBRARIES := libdemo +LOCAL_INIT_RC := demo.rc +include $(BUILD_EXECUTABLE) +``` + +### 6.3.Cpp Lib and App + +```mk +LOCAL_PATH := $(call my-dir) + +# demo lib +include $(CLEAR_VARS) +LOCAL_MODULE := libdemo +LOCAL_MODULE_TAGS := optional +LOCAL_VENDOR_MODULE := true +LOCAL_PRELINK_MODULE := false +# 使用 try catch 机制需要增加 -fexceptions 否则编译出错:cannot use ‘throw’ with exceptions disabled +LOCAL_CPPFLAGS := -Wall -O2 -fvisibility=hidden -fexceptions +LOCAL_SRC_FILES := demo.cpp +LOCAL_C_INCLUDES := $(LOCAL_PATH) +LOCAL_SHARED_LIBRARIES := +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES) +include $(BUILD_SHARED_LIBRARY) + +# demo app +include $(CLEAR_VARS) +LOCAL_MODULE := demo +LOCAL_MODULE_TAGS := optional +LOCAL_VENDOR_MODULE := true +LOCAL_CPPFLAGS := -Wall -O2 +LOCAL_SRC_FILES := main.cpp +LOCAL_C_INCLUDES := $(LOCAL_PATH) +LOCAL_SHARED_LIBRARIES := libdemo +LOCAL_INIT_RC := demo.rc +include $(BUILD_EXECUTABLE) +``` diff --git a/SpaceMarkdown b/SpaceMarkdown index f438d32..edf0290 100755 Binary files a/SpaceMarkdown and b/SpaceMarkdown differ