从零开始自定义安卓系统(4) product配置详解


从零开始自定义安卓系统(4) product配置详解

前言

在学习修改一样东西时, 最好的方法之一就是搞懂他到底可以干什么. 而不是跟一个教程学一个选项,再跟另一个教程再学一个选项, 结果问到可以做XX么, 还是无法回答.

当然,并不需要记住具体操作, 只需要对可以做什么有印象就可以了.

AndroidProducts.mk

读取product的代码位于build/make/core/product_config.mkbuild/make/core/product.mk

其中只使用了这三个变量

1
2
3
4
PRODUCT_MAKEFILES
COMMON_LUNCH_CHOICES
# 选择使用starlark配置 可以无视
STARLARK_OPT_IN_PRODUCTS

PRODUCT_MAKEFILES

然后根据选择读取对应的mk文件

build/make/core/product.mk定义product自身的属性了

1
2
3
4
# 单个值的列表
_product_single_value_vars
# 列表值的列表
_product_list_vars

完整列表如下

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# _product_single_value_vars
# 定义产品名称和系统名称  如果没定义sytem会自动使用上面的值
PRODUCT_NAME
PRODUCT_MODEL
PRODUCT_DEVICE
PRODUCT_MANUFACTURER
PRODUCT_BRAND
PRODUCT_SYSTEM_NAME
PRODUCT_SYSTEM_MODEL
PRODUCT_SYSTEM_DEVICE
PRODUCT_SYSTEM_BRAND
PRODUCT_SYSTEM_MANUFACTURER

# aapt资源打包工具选项
PRODUCT_AAPT_PREF_CONFIG

# 系统特性例如 电视/手表系统
PRODUCT_CHARACTERISTICS

# 系统证书
PRODUCT_DEFAULT_DEV_CERTIFICATE

# 系统支持的vboot选项 也就是常说的解锁bl锁 
PRODUCT_SUPPORTS_BOOT_SIGNER
PRODUCT_SUPPORTS_VBOOT
PRODUCT_SUPPORTS_VERITY
PRODUCT_SUPPORTS_VERITY_FEC
PRODUCT_VBOOT_SIGNING_KEY
PRODUCT_VBOOT_SIGNING_SUBKEY
PRODUCT_VERITY_SIGNING_KEY

# system jar选项
PRODUCT_BROKEN_SUBOPTIMAL_ORDER_OF_SYSTEM_SERVER_JARS
# 强制允许system jar
PRODUCT_BROKEN_DEPRECATED_MK_SYSTEM_SERVER_JARS

# 顾名思义就是一大堆验证分区选项 
PRODUCT_SYSTEM_VERITY_PARTITION
PRODUCT_VENDOR_VERITY_PARTITION
PRODUCT_PRODUCT_VERITY_PARTITION
PRODUCT_SYSTEM_EXT_VERITY_PARTITION
PRODUCT_ODM_VERITY_PARTITION
PRODUCT_VENDOR_DLKM_VERITY_PARTITION
PRODUCT_ODM_DLKM_VERITY_PARTITION
PRODUCT_SYSTEM_DLKM_VERITY_PARTITION

# debug选项
PRODUCT_SYSTEM_SERVER_DEBUG_INFO
PRODUCT_OTHER_JAVA_DEBUG_INFO
PRODUCT_MINIMIZE_JAVA_DEBUG_INFO

# dex优化选项
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
PRODUCT_DEX_PREOPT_BOOT_FLAGS
PRODUCT_DEX_PREOPT_PROFILE_DIR
PRODUCT_DEX_PREOPT_GENERATE_DM_FILES
PRODUCT_DEX_PREOPT_NEVER_ALLOW_STRIPPING
PRODUCT_DEX_PREOPT_RESOLVE_STARTUP_STRINGS

# boot镜像选项
PRODUCT_EXPORT_BOOT_IMAGE_TO_DIST
PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE
PRODUCT_USES_DEFAULT_ART_CONFIG

PRODUCT_SYSTEM_SERVER_COMPILER_FILTER

# 文件系统选项
PRODUCT_SYSTEM_BASE_FS_PATH
PRODUCT_VENDOR_BASE_FS_PATH
PRODUCT_PRODUCT_BASE_FS_PATH
PRODUCT_SYSTEM_EXT_BASE_FS_PATH
PRODUCT_ODM_BASE_FS_PATH
PRODUCT_VENDOR_DLKM_BASE_FS_PATH
PRODUCT_ODM_DLKM_BASE_FS_PATH
PRODUCT_SYSTEM_DLKM_BASE_FS_PATH

# 系统支持的安卓 api lever
PRODUCT_SHIPPING_API_LEVEL

# art 选项 (是一个dex运行技术)
PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD
PRODUCT_ART_USE_READ_BARRIER
# 设置系统镜像预留空间
PRODUCT_SYSTEM_HEADROOM

# adb  key
PRODUCT_ADB_KEYS
# 一个内存分配器 参考 https://source.android.com/docs/security/test/scudo?hl=zh-cn
PRODUCT_DISABLE_SCUDO
# apex压缩设置 参考 https://source.android.com/docs/core/ota/apex?hl=zh-cn
PRODUCT_COMPRESSED_APEX

# ndk版本
PRODUCT_PRODUCT_VNDK_VERSION

# 编译路径设置
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS
# 必须签名
PRODUCT_ENFORCE_ARTIFACT_SYSTEM_CERTIFICATE_REQUIREMENT

# 分区API接口限制 简单来说就是 system分区允许使用内部api userdata分区不允许 
PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE
# 必须执行分区sdk要求
PRODUCT_ENFORCE_INTER_PARTITION_JAVA_SDK_LIBRARY

# 额外下载的apex包
PRODUCT_INSTALL_EXTRA_FLATTENED_APEXES

# 动态分区
PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
PRODUCT_SET_DEBUGFS_RESTRICTIONS
PRODUCT_USE_DYNAMIC_PARTITIONS
PRODUCT_USE_DYNAMIC_PARTITION_SIZE

# 编译镜像设置
PRODUCT_BUILD_SUPER_PARTITION
PRODUCT_BUILD_GENERIC_OTA_PACKAGE
PRODUCT_BUILD_SYSTEM_IMAGE
PRODUCT_BUILD_SYSTEM_OTHER_IMAGE
PRODUCT_BUILD_VENDOR_IMAGE
PRODUCT_BUILD_PRODUCT_IMAGE
PRODUCT_BUILD_SYSTEM_EXT_IMAGE
PRODUCT_BUILD_ODM_IMAGE
PRODUCT_BUILD_VENDOR_DLKM_IMAGE
PRODUCT_BUILD_ODM_DLKM_IMAGE
PRODUCT_BUILD_SYSTEM_DLKM_IMAGE
PRODUCT_BUILD_CACHE_IMAGE
PRODUCT_BUILD_RAMDISK_IMAGE
PRODUCT_BUILD_USERDATA_IMAGE
PRODUCT_BUILD_RECOVERY_IMAGE
PRODUCT_BUILD_BOOT_IMAGE
PRODUCT_BUILD_INIT_BOOT_IMAGE
PRODUCT_BUILD_DEBUG_BOOT_IMAGE
PRODUCT_BUILD_VENDOR_BOOT_IMAGE
PRODUCT_BUILD_VENDOR_KERNEL_BOOT_IMAGE
PRODUCT_BUILD_DEBUG_VENDOR_BOOT_IMAGE
PRODUCT_BUILD_VBMETA_IMAGE
PRODUCT_BUILD_SUPER_EMPTY_IMAGE
PRODUCT_BUILD_PVMFW_IMAGE

# AB分区设置
PRODUCT_VIRTUAL_AB_OTA
PRODUCT_VIRTUAL_AB_COMPRESSION
PRODUCT_VIRTUAL_AB_OTA_RETROFIT
PRODUCT_OTA_FORCE_NON_AB_PACKAGE

# 调试策略
PRODUCT_INSTALL_DEBUG_POLICY_TO_SYSTEM_EXT
# 文件系统完整性设置
PRODUCT_SYSTEM_FSVERITY_GENERATE_METADATA
# 建造模块时从源码建造
PRODUCT_MODULE_BUILD_FROM_SOURCE

可以发现 _product_single_value_vars大部分都是编译设置, 魔改最多修改个名字

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# _product_list_vars

# aapt (Android 资源打包工具) 配置 参考 https://developer.android.com/tools/aapt2?hl=zh-cn
# 例如 := normal ldpi
PRODUCT_LOCALES
PRODUCT_AAPT_CONFIG
# aapt 预编译的dpi
PRODUCT_AAPT_PREBUILT_DPI

# 产品自带的各种packages name
# PRODUCT_PACKAGES := my_module
PRODUCT_HOST_PACKAGES
PRODUCT_PACKAGES
PRODUCT_PACKAGES_DEBUG
PRODUCT_PACKAGES_DEBUG_ASAN
PRODUCT_PACKAGES_DEBUG_JAVA_COVERAGE
PRODUCT_PACKAGES_ENG
PRODUCT_PACKAGES_TESTS
# overlays层 覆盖package文件
PRODUCT_PACKAGE_OVERLAYS
DEVICE_PACKAGE_OVERLAYS
# 覆盖包名
PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES
# 强制指定包名 (默认是模块名)
PRODUCT_PACKAGE_NAME_OVERRIDES
PRODUCT_CERTIFICATE_OVERRIDES

# properties文件设置
# 例如PRODUCT_SYSTEM_PROPERTIES += ro.bluebird = 0
PRODUCT_SYSTEM_PROPERTIES
PRODUCT_SYSTEM_EXT_PROPERTIES
PRODUCT_VENDOR_PROPERTIES
PRODUCT_ODM_PROPERTIES
PRODUCT_PRODUCT_PROPERTIES
# 类似上面 但是弃用了
PRODUCT_SYSTEM_DEFAULT_PROPERTIES

# 覆盖之前的写入
PRODUCT_PROPERTY_OVERRIDES
PRODUCT_DEFAULT_PROPERTY_OVERRIDES
# 删除之前的写入
PRODUCT_SYSTEM_PROPERTY_BLACKLIST
PRODUCT_VENDOR_PROPERTY_BLACKLIST

# 复制文件到系统里 
# 例子 PRODUCT_COPY_FILES += $(LOCAL_PATH)/test.sh:system/bin/test.sh
PRODUCT_COPY_FILES


# OTA密钥
PRODUCT_OTA_PUBLIC_KEYS
PRODUCT_EXTRA_OTA_KEYS
PRODUCT_EXTRA_RECOVERY_KEYS
# 主线分区开发证书
PRODUCT_MAINLINE_SEPOLICY_DEV_CERTIFICATES

# 资源替换选项
PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS
PRODUCT_ENFORCE_RRO_TARGETS

# sdk设置
PRODUCT_SDK_ATREE_FILES
PRODUCT_SDK_ADDON_NAME
PRODUCT_SDK_ADDON_COPY_FILES
PRODUCT_SDK_ADDON_COPY_MODULES
PRODUCT_SDK_ADDON_DOC_MODULES
PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP
# 默认wifi
PRODUCT_DEFAULT_WIFI_CHANNELS
# sonng空间空间
PRODUCT_SOONG_NAMESPACES

# 限制访问供应商文件
PRODUCT_RESTRICT_VENDOR_FILES
VENDOR_PRODUCT_RESTRICT_VENDOR_FILES
# 上述的例外
VENDOR_EXCEPTION_MODULES
VENDOR_EXCEPTION_PATHS
# 供应商内核头文件
PRODUCT_VENDOR_KERNEL_HEADERS

# boot jar列表
PRODUCT_BOOT_JARS
PRODUCT_BOOT_JARS_EXTRA
# apex格式的
PRODUCT_APEX_BOOT_JARS

# 系统服务设置 
PRODUCT_SYSTEM_SERVER_APPS
PRODUCT_SYSTEM_SERVER_JARS
PRODUCT_STANDALONE_SYSTEM_SERVER_JARS
PRODUCT_SYSTEM_SERVER_JARS_EXTRA
#apex格式的
PRODUCT_APEX_SYSTEM_SERVER_JARS
PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS

# dex优化设置
PRODUCT_DEXPREOPT_SPEED_APPS
PRODUCT_DEX_PREOPT_MODULE_CONFIGS
PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
# dex 优化boot选项
PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION

#  库编译验证选项
PRODUCT_BROKEN_VERIFY_USES_LIBRARIES

# 编译时使用的代码污点库 参考 https://source.android.com/docs/security/test/sanitizers?hl=zh-cn
PRODUCT_SANITIZER_MODULE_CONFIGS
# 例外情况
PRODUCT_INTEGER_OVERFLOW_EXCLUDE_PATHS
# CFI选项 参考 https://source.android.com/docs/security/test/cfi?hl=zh-cn
PRODUCT_CFI_INCLUDE_PATHS
PRODUCT_CFI_EXCLUDE_PATHS

# 需要预编译的系统apk文件
PRODUCT_ALWAYS_PREOPT_EXTRACTED_APK
# 特权模块加载
PRODUCT_LOADED_BY_PRIVILEGED_MODULES

# vndk选项
PRODUCT_EXTRA_VNDK_VERSIONS

#  系统证书白名单
# 都与sing_var变量是否开启有关
PRODUCT_ARTIFACT_SYSTEM_CERTIFICATE_REQUIREMENT_ALLOW_LIST
# 路径白名单
PRODUCT_ARTIFACT_PATH_REQUIREMENT_HINT
PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST
# 强制放入系统分区
PRODUCT_FORCE_PRODUCT_MODULES_TO_SYSTEM_PARTITION
# 强制vintf分区
PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
# tag列表 被bp文件使用
PRODUCT_INCLUDE_TAGS

# 初始化分区的lib白名单
PRODUCT_INTER_PARTITION_JAVA_LIBRARY_ALLOWLIST

虽然设置很多, 但是常用的不多 主要就

1
2
3
4
5
6
7
8
9
# 修改prop的 
PRODUCT_SYSTEM_PROPERTIES
PRODUCT_PROPERTY_OVERRIDES

# 添加自己的包
PRODUCT_PACKAGES

# 添加系统服务
PRODUCT_SYSTEM_SERVER_APPS

当然可以设置的自定义选项远不止这些 例如 TARGET_VENDOR_PROP 来设置prop文件, 这些就是由其他core/*.mk文件添加的非产品级的设置了