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

blue bird

aosptag2

android

1415 Words

2024-01-28 11:10 +0000


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

前言

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

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

AndroidProducts.mk

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

其中只使用了这三个变量

PRODUCT_MAKEFILES
COMMON_LUNCH_CHOICES
# 选择使用starlark配置 可以无视
STARLARK_OPT_IN_PRODUCTS

PRODUCT_MAKEFILES

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

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

# 单个值的列表
_product_single_value_vars
# 列表值的列表
_product_list_vars

完整列表如下

# _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大部分都是编译设置, 魔改最多修改个名字

# _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

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

# 修改prop的 
PRODUCT_SYSTEM_PROPERTIES
PRODUCT_PROPERTY_OVERRIDES

# 添加自己的包
PRODUCT_PACKAGES

# 添加系统服务
PRODUCT_SYSTEM_SERVER_APPS

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