0. android build system编译系统有趣的几点心得

1. Android编译mormake命令

1.1 Android老版本(7之前)

mormake命令等效于make -f build/core/main.mk

1.2 Android新版本

mormake命令等效于out/soong_ui --make-mode

2. Android.mk

2.1 Android.mk基本用法回顾

Android.mk基本格式

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
................  
LOCAL_xxx       := xxx  
LOCAL_MODULE    := hello-jni  
LOCAL_SRC_FILES := hello-jni.c  
LOCAL_xxx       := xxx  
................  
include $(BUILD_SHARED_LIBRARY)  
2.1.1 LOCAL_PATH变量

LOCAL_PATH变量,设置该模块的路径

$(call my-dir)调用my-dir的函数获得当前.mk文件的路径。(在definitions.mk中定义)

2.1.2 include $(CLEAR_VARS)

清空了除了LOCAL_PATH之外的所有LOCAL_xxx变量的值

2.1.3 LOCAL_xxx打头的变量

模块的编译设置

LOCAL_NAME        模块名字
LOCAL_SRC_FILES   模块源文件
LOCAL_MODULE_PATH 指定模块生成的目标文件的存放位置
2.1.4 include $(BUILD_xxx)

它负责收集所有LOCAL_XXX信息。并决定该模块到底要编译什么。

2.2 Android.mk的include行为分析

2.2.1 Android.mk中include $(CLEAR_VARS)

Android.mkinclude $(CLEAR_VARS)相当于build/make/core/clear_vars.mk

build/make/core/clear_vars.mk文件把所有LOCAL_xxx打头的变量清理了一遍

大家把这个文件看一眼就明白为什么了,因为他把所有的LOCAL_xxx打头的变量赋值为空值

NOTE:LOCAL_PATH变量除外

2.2.2 Android.mk中include $(BUILD_xxx)

Android.mkinclude $(BUILD_PREBUILT)相当于include $(BUILD_PREBUILT)

2.2.3 config.mk定义了CLEAR_VARSBUILD_xxx等变量

build/make/core/config.mk文件中定义了CLEAR_VARSBUILD_PREBUILT等变量

代码如下

# ###############################################################
# Build system internal files
# ###############################################################

BUILD_COMBOS:= $(BUILD_SYSTEM)/combo

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_HEADER_LIBRARY:= $(BUILD_SYSTEM)/header_library.mk
BUILD_AUX_STATIC_LIBRARY:= $(BUILD_SYSTEM)/aux_static_library.mk
BUILD_AUX_EXECUTABLE:= $(BUILD_SYSTEM)/aux_executable.mk
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk
BUILD_RRO_PACKAGE:= $(BUILD_SYSTEM)/build_rro_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_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk
BUILD_NATIVE_BENCHMARK := $(BUILD_SYSTEM)/native_benchmark.mk
BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk
BUILD_FUZZ_TEST := $(BUILD_SYSTEM)/fuzz_test.mk
BUILD_HOST_FUZZ_TEST := $(BUILD_SYSTEM)/host_fuzz_test.mk
.......省略

2.3 Android.mk递归到子目录编译

Android.mk包含子目录中的.mk文件

include $(call all-makefiles-under,$(LOCAL_PATH))
or
include $(call all-subdir-makefiles)

3 Android.bp

3.1 .bp.mk关系

Android.bpAndroid.mk的对照关系

/build/soong/androidmk/cmd/androidmk/android.go 中定义了如下关系

String类型:

"LOCAL_MODULE":                  "name",
"LOCAL_CXX_STL":                 "stl",
"LOCAL_MULTILIB":                "compile_multilib",
"LOCAL_ARM_MODE_HACK":           "instruction_set",
"LOCAL_SDK_VERSION":             "sdk_version",
"LOCAL_MIN_SDK_VERSION":         "min_sdk_version",
"LOCAL_NDK_STL_VARIANT":         "stl",
"LOCAL_JAR_MANIFEST":            "manifest",
"LOCAL_CERTIFICATE":             "certificate",
"LOCAL_PACKAGE_NAME":            "name",
"LOCAL_MODULE_RELATIVE_PATH":    "relative_install_path",
"LOCAL_PROTOC_OPTIMIZE_TYPE":    "proto.type",
"LOCAL_MODULE_OWNER":            "owner",
"LOCAL_RENDERSCRIPT_TARGET_API": "renderscript.target_api",
"LOCAL_NOTICE_FILE":             "notice",
"LOCAL_JAVA_LANGUAGE_VERSION":   "java_version",
"LOCAL_INSTRUMENTATION_FOR":     "instrumentation_for",
"LOCAL_MANIFEST_FILE":           "manifest",

"LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING": "dex_preopt.profile",
"LOCAL_TEST_CONFIG":                      "test_config",

列表类型:

"LOCAL_SRC_FILES":                     "srcs",
"LOCAL_SRC_FILES_EXCLUDE":             "exclude_srcs",
"LOCAL_HEADER_LIBRARIES":              "header_libs",
"LOCAL_SHARED_LIBRARIES":              "shared_libs",
"LOCAL_STATIC_LIBRARIES":              "static_libs",
"LOCAL_WHOLE_STATIC_LIBRARIES":        "whole_static_libs",
"LOCAL_SYSTEM_SHARED_LIBRARIES":       "system_shared_libs",
"LOCAL_ASFLAGS":                       "asflags",
"LOCAL_CLANG_ASFLAGS":                 "clang_asflags",
"LOCAL_CONLYFLAGS":                    "conlyflags",
"LOCAL_CPPFLAGS":                      "cppflags",
"LOCAL_REQUIRED_MODULES":              "required",
"LOCAL_OVERRIDES_MODULES":             "overrides",
"LOCAL_LDLIBS":                        "host_ldlibs",
"LOCAL_CLANG_CFLAGS":                  "clang_cflags",
"LOCAL_YACCFLAGS":                     "yaccflags",
"LOCAL_SANITIZE_RECOVER":              "sanitize.recover",
"LOCAL_LOGTAGS_FILES":                 "logtags",
"LOCAL_EXPORT_HEADER_LIBRARY_HEADERS": "export_header_lib_headers",
"LOCAL_EXPORT_SHARED_LIBRARY_HEADERS": "export_shared_lib_headers",
"LOCAL_EXPORT_STATIC_LIBRARY_HEADERS": "export_static_lib_headers",
"LOCAL_INIT_RC":                       "init_rc",
"LOCAL_VINTF_FRAGMENTS":               "vintf_fragments",
"LOCAL_TIDY_FLAGS":                    "tidy_flags",
// TODO: This is comma-separated, not space-separated
"LOCAL_TIDY_CHECKS":           "tidy_checks",
"LOCAL_RENDERSCRIPT_INCLUDES": "renderscript.include_dirs",
"LOCAL_RENDERSCRIPT_FLAGS":    "renderscript.flags",

"LOCAL_JAVA_RESOURCE_DIRS":    "java_resource_dirs",
"LOCAL_JAVACFLAGS":            "javacflags",
"LOCAL_ERROR_PRONE_FLAGS":     "errorprone.javacflags",
"LOCAL_DX_FLAGS":              "dxflags",
"LOCAL_JAVA_LIBRARIES":        "libs",
"LOCAL_STATIC_JAVA_LIBRARIES": "static_libs",
"LOCAL_JNI_SHARED_LIBRARIES":  "jni_libs",
"LOCAL_AAPT_FLAGS":            "aaptflags",
"LOCAL_PACKAGE_SPLITS":        "package_splits",
"LOCAL_COMPATIBILITY_SUITE":   "test_suites",
"LOCAL_OVERRIDES_PACKAGES":    "overrides",

"LOCAL_ANNOTATION_PROCESSORS": "plugins",

"LOCAL_PROGUARD_FLAGS":      "optimize.proguard_flags",
"LOCAL_PROGUARD_FLAG_FILES": "optimize.proguard_flags_files",

// These will be rewritten to libs/static_libs by bpfix, after their presence is used to convert
// java_library_static to android_library.
"LOCAL_SHARED_ANDROID_LIBRARIES": "android_libs",
"LOCAL_STATIC_ANDROID_LIBRARIES": "android_static_libs",
"LOCAL_ADDITIONAL_CERTIFICATES":  "additional_certificates",

// Jacoco filters:
"LOCAL_JACK_COVERAGE_INCLUDE_FILTER": "jacoco.include_filter",
"LOCAL_JACK_COVERAGE_EXCLUDE_FILTER": "jacoco.exclude_filter",

布尔型:

// Bool properties
"LOCAL_IS_HOST_MODULE":             "host",
"LOCAL_CLANG":                      "clang",
"LOCAL_FORCE_STATIC_EXECUTABLE":    "static_executable",
"LOCAL_NATIVE_COVERAGE":            "native_coverage",
"LOCAL_NO_CRT":                     "nocrt",
"LOCAL_ALLOW_UNDEFINED_SYMBOLS":    "allow_undefined_symbols",
"LOCAL_RTTI_FLAG":                  "rtti",
"LOCAL_NO_STANDARD_LIBRARIES":      "no_standard_libs",
"LOCAL_PACK_MODULE_RELOCATIONS":    "pack_relocations",
"LOCAL_TIDY":                       "tidy",
"LOCAL_USE_CLANG_LLD":              "use_clang_lld",
"LOCAL_PROPRIETARY_MODULE":         "proprietary",
"LOCAL_VENDOR_MODULE":              "vendor",
"LOCAL_ODM_MODULE":                 "device_specific",
"LOCAL_PRODUCT_MODULE":             "product_specific",
"LOCAL_PRODUCT_SERVICES_MODULE":    "product_services_specific",
"LOCAL_EXPORT_PACKAGE_RESOURCES":   "export_package_resources",
"LOCAL_PRIVILEGED_MODULE":          "privileged",
"LOCAL_AAPT_INCLUDE_ALL_RESOURCES": "aapt_include_all_resources",
"LOCAL_USE_EMBEDDED_NATIVE_LIBS":   "use_embedded_native_libs",
"LOCAL_USE_EMBEDDED_DEX":           "use_embedded_dex",

"LOCAL_DEX_PREOPT":                  "dex_preopt.enabled",
"LOCAL_DEX_PREOPT_APP_IMAGE":        "dex_preopt.app_image",
"LOCAL_DEX_PREOPT_GENERATE_PROFILE": "dex_preopt.profile_guided",

"LOCAL_PRIVATE_PLATFORM_APIS": "platform_apis",
"LOCAL_JETIFIER_ENABLED":      "jetifier",

3.2 Android.bp 递归到子目录编译

Android.bp包含子目录中的.bp文件

subdirs = ["*"]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值