Android编译系统参考手册

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值