Android编译系统参考手册

  • Post author:
  • Post category:其他


build/core/base_rules.mk

base_rules.mk里定义了生成某种目标的方式

目标类型:主机上的可执行程序,设备上的可执行程序,apk程序,Java运行库,动态链接库等等

Android编译系统里每一种目标的生成方式对应一个makefile,

示例:如果某个模块需要编译成手机上的二进制程序,它需要include $(BUILD_EXECUTABLE)

而BUILD_EXECUTABLE指向的是$(BUILD_SYSTEM)/executable.mk

所有生成方式对应的makefile都将包含base_rules.mk


LOCAL_PATH

每个模块都在Android.mk里定义,表示模块所在目录


LOCAL_MODULE

LOCAL_MODULE表示模块的名称

LOCAL_MODULE将在每个模块的makefile里定义,如果未定义,编译系统会报错


LOCAL_IS_HOST_MODULE

表示该模块生成的目标是否在主机上运行,


my_prefix

若定义了 LOCAL_IS_HOST_MODULE 为true,那么my_prefix:=HOST_,否则 my_prefix:=TARGET_


my_host

若定义了 LOCAL_IS_HOST_MODULE 为true,那么 my_host:=host-,否则 my_host:=


LOCAL_UNINSTALLABLE_MODULE

表示该模块是否安装至手机,像sdk文档模块不会被安装至手机,因此LOCAL_UNINSTALLABLE_MODULE为true


LOCAL_MODULE_TAGS

模块的tag,为debug eng tests optional samples shell_ash shell_mksh等tag的组合,一个模块可有多个Tag,

注意现在模块现在不能使用user作为模块的Tag,

以前如果使用user做为tag,那么这个模块将被自动安装,

如果想定义自动安装的模块,需要在PRODUCT_PACKAGES变量里添加该模块,

该变量在build/target/product/base.mk和build/target/product/core.mk里有赋值,这是所有产品都将继承的基础配置

另外每个设备可在自己的产品配置文件device_*.mk里设置该变量,添加更多的模块

如果当前目录或者父目录有*_GPL*的文件,那么将自动添加gnu的tag


LOCAL_MODULE_CLASS

将用于决定编译时的中间文件存放的位置

LOCAL_MODULE_CLASS在定义目标生成方式的makefile文件里定义,

比如executable.mk里定义LOCAL_MODULE_CLASS := EXECUTABLES

在recovery模块的Android.mk里定义的LOCAL_MODULE_CLASS有:

LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES

LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES

其它的LOCAL_MODULE_CLASS有

LOCAL_MODULE_CLASS := ETC

LOCAL_MODULE_CLASS := STATIC_LIBRARIES

LOCAL_MODULE_CLASS := EXECUTABLES

LOCAL_MODULE_CLASS := FAKE

LOCAL_MODULE_CLASS := JAVA_LIBRARIES

LOCAL_MODULE_CLASS := SHARED_LIBRARIES

LOCAL_MODULE_CLASS := APPS

对应 Cyanogenmod/target/product/m7ul/obj 的目录

比如说若 LOCAL_MODULE_CLASS := ETC

那么该模块编译的中间文件将存放于

Cyanogenmod/target/product/m7ul/obj/ETC


partition_tag

如果是主机模块,partition_tag将为空,否则如果是设备专有模块,partition_tag:=_VENDOR

否则如果是安装到系统的模块,那么partition_tag将为空(test模块生成的目标只安装至data目录)

否则partition_tag:=_DATA


LOCAL_PROPRIETARY_MODULE

是否是设备专有模块


LOCAL_MODULE_PATH

表示模块生成的目标将最终存放的目录

recovery模块的Android.mk里有

LOCAL_MODULE := nandroid-md5.sh

LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin

说明:nandroid-md5.sh 将存放于out/Cyanogenmod/target/product/m7ul/recovery/root/sbin

如果模块的Android.mk里未定义LOCAL_MODULE_PATH

那么LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS))

在recovery模块里recovery可执行文件相关变量如下:

比如my_prefix为TARGET_,partition_tag为空,LOCAL_MODULE_CLASS为EXECUTABLES

那么LOCAL_MODULE_PATH为$(TARGET_OUT_EXECUTABLES),

值应该为

out/Cyanogenmod/target/product/m7ul/system/bin


module_id

用于确保每个模块都是唯一的

module_id := MODULE.$(if \

$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)

如果$(module_id)已经定义过,那会提示用户出错

recovery模块的Android.mk里针对recovery可执行文件:

module_id := MODULE.TARGET.EXECUTABLES.RECOVERY

$(MODULE.TARGET.EXECUTABLES.RECOVERY)=$(LOCAL_PATH)

即当前模块路径


intermediates

intermediates := $(call local-intermediates-dir)

例: recovery模块Android.mk里编译Recovery可执行文件:

out/target/product/find5/obj/EXECUTABLES/recovery_intermediates


intermediates.COMMON

intermediates.COMMON := $(call local-intermediates-dir,COMMON)

例: recovery模块Android.mk里编译Recovery可执行文件:

out/target/common/obj/EXECUTABLES/recovery_intermediates


LOCAL_MODULE_STEM

表示编译链接后的目标文件的文件名,不带后缀

LOCAL_MODULE_STEM := $(strip $(LOCAL_MODULE_STEM))

ifeq ($(LOCAL_MODULE_STEM),)

LOCAL_MODULE_STEM := $(LOCAL_MODULE)

endif

例:

recovery模块编译recovery可执行文件:

LOCAL_MODULE_STEM:=recovery


LOCAL_MODULE_SUFFIX

表示编译链接后的目标文件的后缀


LOCAL_INSTALLED_MODULE_STEM

表示要安装的目标文件的文件名,带后缀

LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE_STEM)$(LOCAL_MODULE_SUFFIX)

例:

recovery模块编译recovery可执行文件:

LOCAL_INSTALLED_MODULE_STEM:=recovery


LOCAL_BUILT_MODULE_STEM

表示编译链接后的目标文件的文件名,带后缀

LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM))

ifeq ($(LOCAL_BUILT_MODULE_STEM),)

LOCAL_BUILT_MODULE_STEM := $(LOCAL_INSTALLED_MODULE_STEM)

endif

例:

recovery模块编译recovery可执行文件:

LOCAL_INSTALLED_MODULE_STEM:=recovery


OVERRIDE_BUILT_MODULE_PATH

只有内部动态链接库模块可以使用OVERRIDE_BUILT_MODULE_PATH

OVERRIDE_BUILT_MODULE_PATH := $(strip $(OVERRIDE_BUILT_MODULE_PATH))

ifdef OVERRIDE_BUILT_MODULE_PATH

ifneq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES)

$(error $(LOCAL_PATH): Illegal use of OVERRIDE_BUILT_MODULE_PATH)

endif

built_module_path := $(OVERRIDE_BUILT_MODULE_PATH)

else

built_module_path := $(intermediates)

endif


built_module_path

参见OVERRIDE_BUILT_MODULE_PATH


LOCAL_BUILT_MODULE

表示编译链接后的目标文件(文件路径+文件名)

LOCAL_BUILT_MODULE := $(built_module_path)/$(LOCAL_BUILT_MODULE_STEM)

比如recovery:

LOCAL_BUILT_MODULE 路径;

out/Cyanogenmod/target/product/m7ul/obj/EXECUTABLES/recovery_intermediates/recovery


LOCAL_INSTALLED_MODULE

表示模块的安装路径+文件名

ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))

LOCAL_INSTALLED_MODULE := $(LOCAL_MODULE_PATH)/$(LOCAL_INSTALLED_MODULE_STEM)

endif

示例:

out/Cyanogenmod/target/product/m7ul/system/bin/recovery


LOCAL_INTERMEDIATE_TARGETS

Assemble the list of targets to create PRIVATE_ variables for.

LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE)


LOCAL_INTERMEDIATE_TARGETS

将所有目标添加到变量LOCAL_INTERMEDIATE_TARGETS里

LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE)

LOCAL_INTERMEDIATE_TARGETS += $(proto_java_sources_file_stamp)


aidl_sources

表示所有源代码中的aidl文件

aidl_sources := $(filter %.aidl,$(LOCAL_SRC_FILES))

如果想编译aidl,只需将aidl加入LOCAL_SRC_FILES即可,

frameworks/base/Android.mk里有将aidl文件加入LOCAL_SRC_FILES变量

LOCAL_SRC_FILES += \

core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \

core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \

core/java/android/accounts/IAccountManager.aidl \

core/java/android/accounts/IAccountManagerResponse.aidl \

core/java/android/accounts/IAccountAuthenticator.aidl \

如果没有定义 TARGET_BUILD_APPS 变量,说明要编译framework.jar,那么将

LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS)

在base_rules里定义了如何将aidl文件编译成java文件的方式,包括文件依赖


logtags_sources

表示源代码中的logtags文件

frameworks/base/Android.mk里有将logtas文件加入LOCAL_SRC_FILES变量

LOCAL_SRC_FILES += \

core/java/android/content/EventLogTags.logtags \

core/java/android/speech/tts/EventLogTags.logtags \

core/java/android/webkit/EventLogTags.logtags \

在base_rules里定义了如何将logtag文件编译成java文件的方式,包括文件依赖

logtags文件最终会被logcat程序使用到


proto_sources

表示源代码中的proto文件

在definitions里定义了all-proto-files-under方法添加所有proto文件

在./hardware/ril/mock-ril/Android.mk里有调用该方法

在base_rules里定义了如何将.proto文件编译成java文件的方式,包括文件依赖


LOCAL_INTERMEDIATE_SOURCE_DIR

表示编译生成的源文件存放目录

LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src

例:out/target/common/obj/EXECUTABLES/recovery_intermediates/src


LOCAL_JAVA_RESOURCE_DIRS

java资源文件所在目录


all_java_sources

所有Java源代码

Compile .java files to .class


LOCAL_JAR_MANIFEST

java库用的manifest

示例:

inputmethods/LatinIME/tools/maketext/Android.mk:20:LOCAL_JAR_MANIFEST := etc/manifest.txt

inputmethods/LatinIME/tools/dicttool/Android.mk:29:LOCAL_JAR_MANIFEST := etc/manifest.txt


full_static_java_libs

编译为java静态库


Target:  clean-$(LOCAL_MODULE)

定义一个模块的清除目标,如:recovery模块,有对应的clean-recovery

如果在编译时用mka clean-recovery,将清除编译recovery时产生的文件,

包括编译中间文件和编译目标文件


LOCAL_CHECKED_MODULE

需要检查的模块

ifndef LOCAL_CHECKED_MODULE

ifndef LOCAL_SDK_VERSION

LOCAL_CHECKED_MODULE := $(LOCAL_BUILT_MODULE)

endif

endif


LOCAL_DONT_CHECK_MODULE

如果定义了该变量,那么模块将不被检查

ifdef LOCAL_DONT_CHECK_MODULE

LOCAL_CHECKED_MODULE :=

endif


ALL_MODULES

所有的(LOCAL_MODULE)都会被加入ALL_MODULES变量

ALL_MODULES += $(LOCAL_MODULE)


ALL_MODULES.$(LOCAL_MODULE).CLASS

将LOCAL_MODULE_CLASS加入到ALL_MODULES.$(LOCAL_MODULE).CLASS管理,

这样可以得到所有模块的所有CLASS

ALL_MODULES.$(LOCAL_MODULE).CLASS := \

$(ALL_MODULES.$(LOCAL_MODULE).CLASS) $(LOCAL_MODULE_CLASS)

示例:

ALL_MODULES.recovery.CLASS = EXECECUTABLE

一个模块可能既编译为手机上的可执行程序,又编译为电脑上的可执行程序

故此ALL_MODULES.recovery.CLASS 可能由多个CLASS组合


ALL_MODULES.$(LOCAL_MODULE).PATH

所有模块路径

ALL_MODULES.$(LOCAL_MODULE).PATH := \

$(ALL_MODULES.$(LOCAL_MODULE).PATH) $(LOCAL_PATH)

示例:

ALL_MODULES.recovery.PATH bootable/recovery


ALL_MODULES.$(LOCAL_MODULE).TAGS

所有模块的所有TAGS

ALL_MODULES.$(LOCAL_MODULE).TAGS := \

$(ALL_MODULES.$(LOCAL_MODULE).TAGS) $(LOCAL_MODULE_TAGS)

示例:

ALL_MODULES.recovery.TAGS eng


ALL_MODULES.$(LOCAL_MODULE).CHECKED

所有模块的所有是否被检查属性

ALL_MODULES.$(LOCAL_MODULE).CHECKED := \

$(ALL_MODULES.$(LOCAL_MODULE).CHECKED) $(LOCAL_CHECKED_MODULE)

示例:

ALL_MODULES.recovery.CHECKED

out/Cyanogenmod/target/product/m7ul/obj/EXECUTABLES/recovery_intermediates/recovery


ALL_MODULES.$(LOCAL_MODULE).BUILT

所有模块的所有生成路径

ALL_MODULES.$(LOCAL_MODULE).BUILT := \

$(ALL_MODULES.$(LOCAL_MODULE).BUILT) $(LOCAL_BUILT_MODULE)

示例:

out/Cyanogenmod/target/product/m7ul/obj/EXECUTABLES/recovery_intermediates/recovery


ALL_MODULES.$(LOCAL_MODULE).INSTALLED

所有模块的各自安装路径

ALL_MODULES.$(LOCAL_MODULE).INSTALLED := \

$(strip $(ALL_MODULES.$(LOCAL_MODULE).INSTALLED) $(LOCAL_INSTALLED_MODULE))

示例:

out/Cyanogenmod/target/product/m7ul/system/bin/recovery


ALL_MODULES.$(LOCAL_MODULE).REQUIRED

所有模块的各自依赖模块

ALL_MODULES.$(LOCAL_MODULE).REQUIRED := \

$(ALL_MODULES.$(LOCAL_MODULE).REQUIRED) $(LOCAL_REQUIRED_MODULES)

binary.mk:

LOCAL_REQUIRED_MODULES += $(installed_shared_library_module_names)


ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS

所有模块的EVENT_LOG_TAGS

ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS := \

$(ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS) $(event_log_tags)

event_log_tags := $(addprefix $(LOCAL_PATH)/,$(logtags_sources))


ALL_MODULES.$(LOCAL_MODULE).INTERMEDIATE_SOURCE_DIR

所有模块的生成代码的目录集合

ALL_MODULES.$(LOCAL_MODULE).INTERMEDIATE_SOURCE_DIR := \

$(ALL_MODULES.$(LOCAL_MODULE).INTERMEDIATE_SOURCE_DIR) $(LOCAL_INTERMEDIATE_SOURCE_DIR)

LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src


ALL_MODULES.$(LOCAL_MODULE).MAKEFILE

所有模块各自的makefile集合

ALL_MODULES.$(LOCAL_MODULE).MAKEFILE := \

$(ALL_MODULES.$(LOCAL_MODULE).MAKEFILE) $(LOCAL_MODULE_MAKEFILE)

举例:

bootable/recovery/Android.mk


ALL_MODULES.$(LOCAL_MODULE).OWNER

所有模块各自的OWNER

ifdef LOCAL_MODULE_OWNER

ALL_MODULES.$(LOCAL_MODULE).OWNER := \

$(sort $(ALL_MODULES.$(LOCAL_MODULE).OWNER) $(LOCAL_MODULE_OWNER))

endif

三星glaxsy2有定义LOCAL_MODULE_OWNER变量

./vendor/samsung/galaxys2-common/proprietary/Android.mk:21:LOCAL_MODULE_OWNER := samsung


INSTALLABLE_FILES.$(LOCAL_INSTALLED_MODULE).MODULE

所有模块各自安装的名字

INSTALLABLE_FILES.$(LOCAL_INSTALLED_MODULE).MODULE := $(LOCAL_MODULE)

例子:

INSTALLABLE_FILES.out/Cyanogenmod/target/product/m7ul/system/bin/recovery.MODULE:=recovery


ALL_MODULE_TAGS

所有模块的所有TAGS

ALL_MODULE_TAGS := $(sort $(ALL_MODULE_TAGS) $(LOCAL_MODULE_TAGS))

例:

ALL_MODULE_TAGS debug eng tests optional samples shell_ash shell_mksh


ALL_MODULE_TAGS.$(tag)

每个Tag对应的模块安装路径集合

$(foreach tag,$(LOCAL_MODULE_TAGS),\

$(eval ALL_MODULE_TAGS.$(tag) := \

$(ALL_MODULE_TAGS.$(tag)) \

$(LOCAL_INSTALLED_MODULE)))


ALL_MODULE_NAME_TAGS.$(tag)

每个TAG对应的模块集合

$(foreach tag,$(LOCAL_MODULE_TAGS),\

$(eval ALL_MODULE_NAME_TAGS.$(tag) += $(LOCAL_MODULE)))