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)))