1. 认识mmc-utils工具链在Android嵌入式开发中mmc-utils是一个专门用于管理和调试eMMC存储设备的实用工具集。它就像一把瑞士军刀能帮我们完成从基础信息读取到高级分区操作的各种任务。我第一次接触这个工具是在调试一块工业级嵌入式主板时当时需要验证eMMC的寿命状态正是mmc-utils的extcsd read命令帮我找到了关键参数。这个工具链最核心的可执行文件是mmc_utils它支持20种操作指令包括读写extcsd寄存器相当于eMMC的身份证配置写保护区域管理RPMB安全分区执行固件更新(FFU)控制缓存功能对于嵌入式开发者来说最大的挑战在于如何将这个工具链移植到目标平台。由于Android系统的特殊环境直接使用PC版的预编译二进制文件是行不通的必须针对目标平台的CPU架构进行交叉编译。接下来我会详细分享整个实战过程。2. 搭建交叉编译环境2.1 获取源码与基础准备首先需要获取mmc-utils的源代码。官方仓库托管在GitHub上我们可以通过git命令获取最新版本git clone https://github.com/mhei/mmc-utils.git cd mmc-utils这里有个小技巧建议使用-b参数指定稳定版本分支避免使用可能不稳定的master分支。我在实际项目中就曾因为使用master分支遇到过奇怪的段错误问题。对于Android平台编译有两种主要方式集成到AOSP构建系统适合需要长期维护的项目使用NDK独立编译适合快速验证和调试2.2 依赖项检查在开始编译前需要确保系统已安装必要的工具链对于AOSP方式需要完整Android源码和对应版本的编译环境对于NDK方式至少需要NDK r20版本验证NDK是否安装成功的命令$NDK_HOME/ndk-build --version3. Android源码集成编译3.1 源码集成到AOSP将mmc-utils作为外部模块集成到AOSP是最规范的做法。具体步骤在AOSP源码的external目录下创建mmc-utils文件夹将源码复制到该目录添加Android.mk构建文件关键配置示例LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE : mmc_utils LOCAL_SRC_FILES : mmc.c mmc_cmds.c LOCAL_CFLAGS : -Wall -Werror include $(BUILD_EXECUTABLE)3.2 解决编译错误在实际编译过程中你可能会遇到两个典型错误错误1htobe32等函数未定义解决方法是在mmc_cmds.c中添加头文件#include endian.h错误2结构体未完全初始化需要修改mmc.c中的commands数组初始化方式为每个结构体成员显式赋值。具体修改可以参考原始文章中的diff片段。3.3 编译与部署完成代码修改后在AOSP根目录执行source build/envsetup.sh lunch 你的设备配置 mmm external/mmc-utils编译成功后生成的二进制文件位于out/target/product/设备名/system/bin/mmc_utils部署到设备的命令adb push mmc_utils /system/bin/ adb shell chmod x /system/bin/mmc_utils4. NDK独立编译方案对于不需要集成到完整AOSP系统的场景使用NDK独立编译更加高效。4.1 准备NDK编译环境首先设置NDK环境变量export NDK_HOME/path/to/your/ndk export TOOLCHAIN$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_644.2 修改Makefile将原始Makefile调整为交叉编译版本关键修改点CC $(TOOLCHAIN)/bin/aarch64-linux-android21-clang CFLAGS -pie -fPIE LDFLAGS -static4.3 交叉编译命令执行编译make clean make all生成的二进制文件需要通过adb推送到设备adb push mmc_utils /data/local/tmp/ adb shell chmod x /data/local/tmp/mmc_utils5. 实战应用技巧5.1 常用命令示例查看eMMC基本信息mmc_utils extcsd read /dev/block/mmcblk0设置临时写保护mmc_utils writeprotect user set temp 0 100 /dev/block/mmcblk0RPMB分区操作示例mmc_utils rpmb write-key /dev/block/mmcblk0rpmb key.bin5.2 调试技巧遇到问题时可以增加调试输出mmc_utils -d extcsd read /dev/block/mmcblk0对于复杂的操作建议先用-n参数进行dry-run测试mmc_utils -n gp create -y 1024 1 0 0 /dev/block/mmcblk05.3 性能优化在频繁操作时可以启用缓存提升性能mmc_utils cache enable /dev/block/mmcblk0但要注意某些关键操作如分区修改前应该禁用缓存mmc_utils cache disable /dev/block/mmcblk06. 常见问题解决问题1权限不足解决方案adb root adb remount问题2版本不兼容建议检查eMMC芯片规格和mmc-utils版本的匹配性。我曾经遇到过新版工具不支持旧版eMMC的情况这时需要回退到旧版工具。问题3操作失败某些eMMC操作需要先解锁mmc_utils writeprotect user set none 0 0 /dev/block/mmcblk0对于嵌入式开发者来说掌握mmc-utils的交叉编译和使用技巧能极大提升存储相关功能的开发效率。我在多个车载和工控项目中都深度使用过这套工具链它的稳定性和功能性经受住了严苛环境的考验。特别是在处理eMMC寿命预警、安全分区配置等场景时mmc-utils展现出了不可替代的价值。