Jan 28, 2024
从零开始自定义安卓系统(4) product配置详解
从零开始自定义安卓系统(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文件添加的非产品级的设置了