1. 为什么需要裁剪Android系统当你拿到一台全新的Android手机时可能会惊讶地发现系统已经占用了好几个GB的存储空间。但对于物联网设备、工控机或专用终端来说这些标配功能反而成了负担。我去年接手一个智能售货机项目时就遇到了这样的困扰设备只需要基础的网络连接和支付功能但标准AOSP系统却自带电话、蓝牙、相机等完全用不上的模块。系统裁剪的本质是按需定制。就像装修毛坯房时商用办公室不需要厨房灶台儿童卧室也不需要酒柜吧台。通过裁剪我们能够将系统体积从2GB压缩到300MB左右内存占用降低40%以上启动时间缩短30%-50%电池续航提升20%-30%对移动设备尤为重要最近给医院定制的一批医疗平板就是典型案例。去掉相机、蓝牙等模块后不仅符合医疗隐私要求待机时间还从8小时延长到了12小时。这种优化在资源受限的嵌入式设备上效果更为显著。2. 搭建裁剪实验环境2.1 硬件准备建议我强烈建议先用模拟器练手。真机调试时遇到过bootloader锁导致的变砖事故最后只能找厂家救砖。准备清单如下开发机16核CPU/32GB内存/500GB SSD的Ubuntu工作站我用的联想P520测试设备Pixel 3解锁bootloader或QEMU模拟器备用电源长时间编译时突然断电会毁掉整个构建目录提示新建虚拟机时记得分配200GB以上虚拟磁盘AOSP源码编译产物实际占用约180GB2.2 源码获取与编译第一次同步源码时建议使用清华镜像源加速repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r41 repo sync -j20 --no-tags --no-clone-bundle编译环境配置有个小技巧安装完JDK后运行以下命令避免版本冲突sudo update-alternatives --config javac sudo update-alternatives --config java基础编译命令看似简单但有几个易错点source build/envsetup.sh lunch aosp_x86_64-eng # 模拟器版本 make -j16 21 | tee build.log # 保存日志方便排查遇到ninja错误时先尝试m clean再重新编译。有次我卡在out of memory错误三天最后发现是swap分区没启用。3. 系统裁剪实战步骤3.1 应用层瘦身技巧在device/generic/common/device.mk中PRODUCT_PACKAGES列表就像系统的购物车。通过grep命令可以快速定位模块grep -r PRODUCT_PACKAGES device/这些应用通常可以安全移除Calculator, Calendar, Email (替换为第三方轻量版)MusicFX, SoundRecorder (多媒体设备除外)BasicDreams, PhotoTable (屏保功能)QuickSearchBox (占用资源大户)但要注意这些关键组件SettingsProvidor (系统设置存储)DocumentsUI (文件选择器)PackageInstaller (应用安装器)我曾移除后者导致无法安装APK最后不得不重新编译整个系统。3.2 服务层精简化框架层裁剪就像拆乐高得先理清模块依赖。推荐两个实用工具make deps-license # 生成依赖关系图 ./development/tools/bootjars/bootjars.sh --generate # 检查启动类禁用服务的三种方式对比方法操作位置风险效果配置文件覆盖overlay/res/values/config.xml低隐藏功能入口权限声明product_copy_files添加硬件描述文件中系统级禁用源码移除PRODUCT_PACKAGES列表删除高彻底清除最近做车载系统时通过以下配置成功禁用蓝牙!-- device/car/common/overlay/framework/base/core/res/res/values/config.xml -- bool nameconfig_bluetooth_adapter_quick_switchfalse/bool integer nameconfig_bluetooth_max_connected_audio_devices0/integer3.3 底层深度优化HAL层裁剪能带来显著性能提升但风险也最高。建议按这个顺序操作在BoardConfig.mk禁用硬件支持BOARD_HAVE_BLUETOOTH : false BOARD_USES_GENERIC_AUDIO : true移除对应的HAL服务# 查找所有HAL服务 find . -name *.rc | xargs grep service | grep hal精简内核配置make menuconfig # 交互式禁用驱动模块有个坑要注意相机HAL移除后扫码功能会异常。我们最后保留了camera.provider但移除了camera.device。4. 物联网设备定制实例去年为智能农业传感器定制系统时最终镜像只有217MB。关键配置如下继承最简配置$(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk)自定义产品定义PRODUCT_PACKAGES \ dhcpcd \ iptables \ libjsoncpp \ libprotobuf-cpp-full \ libwebrtc \ wpa_supplicant禁用图形系统PRODUCT_SYSTEM_SERVER_COMPILER_FILTER : speed-profile PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER : everything TARGET_USES_HWC2 : false测试时发现adb无法连接原因是selinux策略需要调整adb shell setenforce 0 # 临时关闭selinux audit2allow -i avc.log # 生成新策略5. 避坑指南与调试技巧5.1 常见编译错误处理模块缺失错误在build/target/product/core.mk中添加依赖签名验证失败删除out目录下的verified模块缓存头文件找不到检查是否误删了include目录5.2 启动问题排查三板斧查看内核日志adb shell dmesg | grep -i error分析系统服务adb shell service list adb shell dumpsys activity services检查SELinux拒绝记录adb shell cat /proc/kmsg | grep avc5.3 性能调优参数在product.mk中添加这些配置可提升20%性能PRODUCT_PROPERTY_OVERRIDES \ dalvik.vm.dex2oat-flags--compiler-filtereverything \ pm.dexopt.first-bootextract \ pm.dexopt.bootverify \ pm.dexopt.installspeed-profile记得每次修改后执行make installclean # 保留配置的增量清理系统裁剪就像外科手术需要精准下刀。建议准备两套代码仓库一套保持原始状态用于对照另一套用于修改测试。当遇到无法启动的情况时对比两个系统的差异是最快的定位方法。