MTK LK 编译Makefile完整解析整体概述MTK平台LittleKernelBL33二级引导器是由编译Makfile脚本build_lk.mk来编译核心特性多LK编译模式LK_MODE一套LK源码编译出不同功能固件普通/解锁/高级菜单/GPT升级/FES工厂模式分离「编译中间产物目录」「系统安装输出目录」支持拼接DTB设备树到LK镜像自动输出logo分区镜像配套清理规则、droidcore打包依赖可配置交叉编译、屏幕分辨率、平台安全开关等编译宏。一、核心变量逐段拆解1. 输出路径分层定义# 系统最终安装路径刷机包/Android系统打包使用 INSTALLED_LK$(LK$(MODE)_TARGET : $(PRODUCT_OUT)/lk$(call to-lower,$(LK_MODE)).img INSTALLED_LOGO$(LK_MODE)_TARGET : $(PRODUCT_OUT)/logo$(call to-lower,$(LK_MODE)).img # 编译中间缓存目录obj中间文件、elf、原始lk.img TARGET_LK$(LK_MODE)_OUT : $(TARGET_OUT_INTERMEDIATES)/LK$(LK_MODE)_OBJ # LK源码根目录区分相对/绝对路径 TARGET_LK$(LK_MODE)_ROOT_OUT : $(if $(filter /% ~%,$(TARGET_LK$(LK_MODE)_OUT)),,$(LK_ROOT_DIR)/)$(TARGET_LK$(LK_MODE)_OUT) # LK源码编译产出原生lk.img未拼接DTB BUILT_LK$(LK_MODE)_TARGET : $(TARGET_LK$(LK_MODE)_OUT)/build-$(LK_PROJECT)/lk.img # 收集所有LK模式全局汇总 ALL_BUILT_LK_TARGET : $(ALL_BUILT_LK_TARGET) $(BUILT_LK$(LK_MODE)_TARGET)分层逻辑BUILT_LKxxx_TARGETLK源码原生编译输出纯净无DTBINSTALLED_LKxxx_TARGET成品镜像 lk原生镜像 DTB拼接存product/out供整机打包logo镜像直接从编译目录复制输出ALL_BUILT_LK_TARGET 全局收集所有模式的编译产物给全局固件脚本遍历。2. 全局编译参数LK_MAKE_OPTION传递给LK顶层Make的编译参数分为通用参数 模式专属开关# 通用基础参数 LK_MAKE_OPTION : $(if $(SHOW_COMMANDS),NOECHO) LK_MAKE_OPTION $(if $(LK_CROSS_COMPILE),TOOLCHAIN_PREFIX$(LK_CROSS_COMPILE)) LK_MAKE_OPTION BOOTLOADER_OUT$(TARGET_LK$(LK_MODE)_ROOT_OUT) LK_MAKE_OPTION ROOTDIR$(LK_ROOT_DIR) LK_MAKE_OPTION LCM_WIDTH$(LCM_WIDTH) LCM_HEIGHT$(LCM_HEIGHT) LK_MAKE_OPTION COMPILER$(LK_ROOT_DIR)/$(SOONG_CLANG)通用参数说明NOECHOSHOW_COMMANDS开启时打印完整编译命令TOOLCHAIN_PREFIX交叉编译器前缀ARM64 clang/gccBOOTLOADER_OUT指定LK编译中间文件输出目录ROOTDIRLK源码根路径LCM_WIDTH/LCM_HEIGHT屏幕分辨率用于开机logo、UI界面COMPILER指定clang编译器路径MT现代平台统一使用LLVM。3. 分LK_MODE 专属编译宏核心业务区分LK_MODE是区分固件功能的核心开关每种模式开启/关闭不同安全、升级、调试功能1_DEF_UNLOCKifeq ($(LK_MODE),_DEF_UNLOCK) LK_MAKE_OPTION MTK_BUILD_DEFAULT_UNLOCKyes endif作用编译默认解锁版LK开机fastboot默认允许unlock解锁关闭部分安全校验多用于工程机、定制开发机量产user版本不会使用此模式。2_ENHANCE_MENUifeq ($(LK_MODE),_ENHANCE_MENU) LK_MAKE_OPTION MTK_BUILD_ENHANCE_MENUyes endif作用增强recovery/ fastboot菜单增加高级调试项、分区擦除、内存读写、产线校准入口工厂调试机型专用。3_DEEP_GPT_UPDATEifeq ($(LK_MODE),_DEEP_GPT_UPDATE) LK_MAKE_OPTION MTK_GPT_UPDATE_SUPPORTyes LK_MAKE_OPTION MTK_BUILD_DEFAULT_UNLOCKyes LK_MAKE_OPTION MTK_SECURITY_SW_SUPPORTno endifGPT分区深度升级专用固件开启完整GPT分区表重写支持默认解锁关闭安全启动SBC无镜像验签仅用于整机OTA大分区重构、产线重分区场景。4_FES工厂烧录模式关键ifeq ($(LK_MODE),_FES) LK_MAKE_OPTION MTK_SECURITY_SW_SUPPORTno LK_MAKE_OPTION CFG_DTB_EARLY_LOADER_SUPPORTno LK_MAKE_OPTION PLATFORM_FASTBOOT_EMPTY_STORAGEyes LK_MAKE_OPTION APPSBOOTHDR_FILES endif工厂产线专用极简LK关闭全部安全启动校验SBC关闭不验镜像关闭DTB早期加载fastboot空存储模式支持空闪存烧写固件移除安卓APP相关驱动镜像体积极小仅产线刷机台使用成品系统不加载该镜像。二、编译规则依赖链从上到下规则1编译原生LK镜像BUILT_LK$(LK_MODE)_TARGET.KATI_RESTAT: $(BUILT_LK$(LK_MODE)_TARGET) $(BUILT_LK$(LK_MODE)_TARGET): PRIVATE_MAKE_OPTION : $(LK_MAKE_OPTION) $(BUILT_LK$(LK_MODE)_TARGET): $(LK_MAKE_DEPENDENCIES) $(hide) mkdir -p $(dir $) $(PREBUILT_MAKE_PREFIX)$(MAKE) -C $(LK_DIR) $(PRIVATE_MAKE_OPTION) $(LK_PROJECT).KATI_RESTATAndroid构建工具标记依赖文件变更时强制重编译依赖LK_MAKE_DEPENDENCIESLK所有源码、头文件、板级配置执行逻辑创建输出目录 → 进入LK源码目录传入所有模式编译参数编译目标工程LK_PROJECT输出无DTB的纯净lk.img。规则2成品LK镜像拼接DTBINSTALLED_LK$(LK_MODE)_TARGET$(INSTALLED_LK$(LK_MODE)_TARGET): $(BUILT_LK$(LK_MODE)_TARGET) $(MTK_LK_DTB_TARGET) $(hide) mkdir -p $(dir $) $(hide) cat $ $(MTK_LK_DTB_TARGET) $关键逻辑依赖LK原生镜像 LK阶段设备树dtbcat二进制拼接lk主体镜像 追加dtb二进制输出到product/out是整机打包、OTA、刷机工具使用的最终lk分区镜像对应你Preloader、TEE链路ATF跳转后运行的BL33就是该镜像。规则3logo镜像输出$(INSTALLED_LOGO$(LK_MODE)_TARGET): $(BUILT_LK$(LK_MODE)_TARGET) $(hide) mkdir -p $(dir $) $(hide) cp -f $(dir $)logo.img $LK编译过程同步生成开机logo图片镜像直接复制到输出目录用于logo分区烧写。规则4清理伪目标 clean-lk.PHONY: lk clean-lk clean-lk$(LK_MODE) clean-lk: clean-lk$(LK_MODE) clean-lk$(LK_MODE): PRIVATE_MODE : $(LK_MODE) clean-lk$(LK_MODE): $(hide) rm -rf $(INSTALLED_LK$(PRIVATE_MODE)_TARGET) $(INSTALLED_LOGO$(PRIVATE_MODE)_TARGET) $(TARGET_LK$(PRIVATE_MODE)_OUT)伪目标执行make clean-lk会删除out目录成品lk/logo镜像全部编译中间obj目录完全清理该模式编译产物。规则5droidcore打包依赖ifneq ($(LK_MODE),_FES) droidcore lk: $(INSTALLED_LK$(LK_MODE)_TARGET) $(INSTALLED_LOGO$(LK_MODE)) endifdroidcore是Android整机打包总目标排除_FES工厂模式量产整机不会打包工厂极简LK正常模式下编译整机时自动同步编译lklogo镜像。三、和之前MT8766整套启动链路联动1.Preloader BL2 加载lk_a/lk_bA/B槽镜像来源就是这份Make输出的INSTALLED_LKxxx_TARGET2.LK_MODE区分量产user默认普通模式开启MTK_SECURITY_SW_SUPPORTLK镜像必须经过OEM签名Preloader/ATF双层验签工程eng_DEF_UNLOCK解锁LK支持fastboot任意擦写产线烧录单独编译_FES极简无安全LKOPT大分区升级_DEEP_GPT_UPDATE3.ATF BL31完成TEE初始化后ERET跳转的入口就是该拼接好LKDTB镜像4.LK内置logo驱动开机画面来自编译同步输出的logo.img。四、总结多模式隔离编译一套源码产出解锁/产线/升级/量产多种LK无需改源码仅切换LK_MODEDTB拼接自动化LK阶段设备树直接二进制拼接无需额外工具处理目录分离中间obj与最终刷机镜像分开清理/打包互不干扰安全开关可配置通过MTK_SECURITY_SW_SUPPORT一键开关LK镜像验签适配量产/工程整机构建联动并入droidcore全量编译自动生成lk分区文件配套完整清理规则开发编译环境易维护。五、易混点BUILT_LK 源码原生镜像无DTB仅编译中间文件INSTALLED_LK 对外成品镜像LKDTB拼接刷机包使用_FES仅工厂使用不会打包进零售整机固件MTK_SECURITY_SW_SUPPORTno 代表关闭安全启动镜像跳过RSA验签仅调试/产线场景使用。
MTK安全启动分析9:MTK LK 编译Makefile完整解析
MTK LK 编译Makefile完整解析整体概述MTK平台LittleKernelBL33二级引导器是由编译Makfile脚本build_lk.mk来编译核心特性多LK编译模式LK_MODE一套LK源码编译出不同功能固件普通/解锁/高级菜单/GPT升级/FES工厂模式分离「编译中间产物目录」「系统安装输出目录」支持拼接DTB设备树到LK镜像自动输出logo分区镜像配套清理规则、droidcore打包依赖可配置交叉编译、屏幕分辨率、平台安全开关等编译宏。一、核心变量逐段拆解1. 输出路径分层定义# 系统最终安装路径刷机包/Android系统打包使用 INSTALLED_LK$(LK$(MODE)_TARGET : $(PRODUCT_OUT)/lk$(call to-lower,$(LK_MODE)).img INSTALLED_LOGO$(LK_MODE)_TARGET : $(PRODUCT_OUT)/logo$(call to-lower,$(LK_MODE)).img # 编译中间缓存目录obj中间文件、elf、原始lk.img TARGET_LK$(LK_MODE)_OUT : $(TARGET_OUT_INTERMEDIATES)/LK$(LK_MODE)_OBJ # LK源码根目录区分相对/绝对路径 TARGET_LK$(LK_MODE)_ROOT_OUT : $(if $(filter /% ~%,$(TARGET_LK$(LK_MODE)_OUT)),,$(LK_ROOT_DIR)/)$(TARGET_LK$(LK_MODE)_OUT) # LK源码编译产出原生lk.img未拼接DTB BUILT_LK$(LK_MODE)_TARGET : $(TARGET_LK$(LK_MODE)_OUT)/build-$(LK_PROJECT)/lk.img # 收集所有LK模式全局汇总 ALL_BUILT_LK_TARGET : $(ALL_BUILT_LK_TARGET) $(BUILT_LK$(LK_MODE)_TARGET)分层逻辑BUILT_LKxxx_TARGETLK源码原生编译输出纯净无DTBINSTALLED_LKxxx_TARGET成品镜像 lk原生镜像 DTB拼接存product/out供整机打包logo镜像直接从编译目录复制输出ALL_BUILT_LK_TARGET 全局收集所有模式的编译产物给全局固件脚本遍历。2. 全局编译参数LK_MAKE_OPTION传递给LK顶层Make的编译参数分为通用参数 模式专属开关# 通用基础参数 LK_MAKE_OPTION : $(if $(SHOW_COMMANDS),NOECHO) LK_MAKE_OPTION $(if $(LK_CROSS_COMPILE),TOOLCHAIN_PREFIX$(LK_CROSS_COMPILE)) LK_MAKE_OPTION BOOTLOADER_OUT$(TARGET_LK$(LK_MODE)_ROOT_OUT) LK_MAKE_OPTION ROOTDIR$(LK_ROOT_DIR) LK_MAKE_OPTION LCM_WIDTH$(LCM_WIDTH) LCM_HEIGHT$(LCM_HEIGHT) LK_MAKE_OPTION COMPILER$(LK_ROOT_DIR)/$(SOONG_CLANG)通用参数说明NOECHOSHOW_COMMANDS开启时打印完整编译命令TOOLCHAIN_PREFIX交叉编译器前缀ARM64 clang/gccBOOTLOADER_OUT指定LK编译中间文件输出目录ROOTDIRLK源码根路径LCM_WIDTH/LCM_HEIGHT屏幕分辨率用于开机logo、UI界面COMPILER指定clang编译器路径MT现代平台统一使用LLVM。3. 分LK_MODE 专属编译宏核心业务区分LK_MODE是区分固件功能的核心开关每种模式开启/关闭不同安全、升级、调试功能1_DEF_UNLOCKifeq ($(LK_MODE),_DEF_UNLOCK) LK_MAKE_OPTION MTK_BUILD_DEFAULT_UNLOCKyes endif作用编译默认解锁版LK开机fastboot默认允许unlock解锁关闭部分安全校验多用于工程机、定制开发机量产user版本不会使用此模式。2_ENHANCE_MENUifeq ($(LK_MODE),_ENHANCE_MENU) LK_MAKE_OPTION MTK_BUILD_ENHANCE_MENUyes endif作用增强recovery/ fastboot菜单增加高级调试项、分区擦除、内存读写、产线校准入口工厂调试机型专用。3_DEEP_GPT_UPDATEifeq ($(LK_MODE),_DEEP_GPT_UPDATE) LK_MAKE_OPTION MTK_GPT_UPDATE_SUPPORTyes LK_MAKE_OPTION MTK_BUILD_DEFAULT_UNLOCKyes LK_MAKE_OPTION MTK_SECURITY_SW_SUPPORTno endifGPT分区深度升级专用固件开启完整GPT分区表重写支持默认解锁关闭安全启动SBC无镜像验签仅用于整机OTA大分区重构、产线重分区场景。4_FES工厂烧录模式关键ifeq ($(LK_MODE),_FES) LK_MAKE_OPTION MTK_SECURITY_SW_SUPPORTno LK_MAKE_OPTION CFG_DTB_EARLY_LOADER_SUPPORTno LK_MAKE_OPTION PLATFORM_FASTBOOT_EMPTY_STORAGEyes LK_MAKE_OPTION APPSBOOTHDR_FILES endif工厂产线专用极简LK关闭全部安全启动校验SBC关闭不验镜像关闭DTB早期加载fastboot空存储模式支持空闪存烧写固件移除安卓APP相关驱动镜像体积极小仅产线刷机台使用成品系统不加载该镜像。二、编译规则依赖链从上到下规则1编译原生LK镜像BUILT_LK$(LK_MODE)_TARGET.KATI_RESTAT: $(BUILT_LK$(LK_MODE)_TARGET) $(BUILT_LK$(LK_MODE)_TARGET): PRIVATE_MAKE_OPTION : $(LK_MAKE_OPTION) $(BUILT_LK$(LK_MODE)_TARGET): $(LK_MAKE_DEPENDENCIES) $(hide) mkdir -p $(dir $) $(PREBUILT_MAKE_PREFIX)$(MAKE) -C $(LK_DIR) $(PRIVATE_MAKE_OPTION) $(LK_PROJECT).KATI_RESTATAndroid构建工具标记依赖文件变更时强制重编译依赖LK_MAKE_DEPENDENCIESLK所有源码、头文件、板级配置执行逻辑创建输出目录 → 进入LK源码目录传入所有模式编译参数编译目标工程LK_PROJECT输出无DTB的纯净lk.img。规则2成品LK镜像拼接DTBINSTALLED_LK$(LK_MODE)_TARGET$(INSTALLED_LK$(LK_MODE)_TARGET): $(BUILT_LK$(LK_MODE)_TARGET) $(MTK_LK_DTB_TARGET) $(hide) mkdir -p $(dir $) $(hide) cat $ $(MTK_LK_DTB_TARGET) $关键逻辑依赖LK原生镜像 LK阶段设备树dtbcat二进制拼接lk主体镜像 追加dtb二进制输出到product/out是整机打包、OTA、刷机工具使用的最终lk分区镜像对应你Preloader、TEE链路ATF跳转后运行的BL33就是该镜像。规则3logo镜像输出$(INSTALLED_LOGO$(LK_MODE)_TARGET): $(BUILT_LK$(LK_MODE)_TARGET) $(hide) mkdir -p $(dir $) $(hide) cp -f $(dir $)logo.img $LK编译过程同步生成开机logo图片镜像直接复制到输出目录用于logo分区烧写。规则4清理伪目标 clean-lk.PHONY: lk clean-lk clean-lk$(LK_MODE) clean-lk: clean-lk$(LK_MODE) clean-lk$(LK_MODE): PRIVATE_MODE : $(LK_MODE) clean-lk$(LK_MODE): $(hide) rm -rf $(INSTALLED_LK$(PRIVATE_MODE)_TARGET) $(INSTALLED_LOGO$(PRIVATE_MODE)_TARGET) $(TARGET_LK$(PRIVATE_MODE)_OUT)伪目标执行make clean-lk会删除out目录成品lk/logo镜像全部编译中间obj目录完全清理该模式编译产物。规则5droidcore打包依赖ifneq ($(LK_MODE),_FES) droidcore lk: $(INSTALLED_LK$(LK_MODE)_TARGET) $(INSTALLED_LOGO$(LK_MODE)) endifdroidcore是Android整机打包总目标排除_FES工厂模式量产整机不会打包工厂极简LK正常模式下编译整机时自动同步编译lklogo镜像。三、和之前MT8766整套启动链路联动1.Preloader BL2 加载lk_a/lk_bA/B槽镜像来源就是这份Make输出的INSTALLED_LKxxx_TARGET2.LK_MODE区分量产user默认普通模式开启MTK_SECURITY_SW_SUPPORTLK镜像必须经过OEM签名Preloader/ATF双层验签工程eng_DEF_UNLOCK解锁LK支持fastboot任意擦写产线烧录单独编译_FES极简无安全LKOPT大分区升级_DEEP_GPT_UPDATE3.ATF BL31完成TEE初始化后ERET跳转的入口就是该拼接好LKDTB镜像4.LK内置logo驱动开机画面来自编译同步输出的logo.img。四、总结多模式隔离编译一套源码产出解锁/产线/升级/量产多种LK无需改源码仅切换LK_MODEDTB拼接自动化LK阶段设备树直接二进制拼接无需额外工具处理目录分离中间obj与最终刷机镜像分开清理/打包互不干扰安全开关可配置通过MTK_SECURITY_SW_SUPPORT一键开关LK镜像验签适配量产/工程整机构建联动并入droidcore全量编译自动生成lk分区文件配套完整清理规则开发编译环境易维护。五、易混点BUILT_LK 源码原生镜像无DTB仅编译中间文件INSTALLED_LK 对外成品镜像LKDTB拼接刷机包使用_FES仅工厂使用不会打包进零售整机固件MTK_SECURITY_SW_SUPPORTno 代表关闭安全启动镜像跳过RSA验签仅调试/产线场景使用。