阶段七:关键教训与踩坑记录
7.1 致命错误:删除 .so 库
事件
在系统裁剪过程中,误删了 /system/lib/*.so 动态链接库。
后果
所有动态链接命令全部失效:
ls— CANNOT LINK EXECUTABLE: could not load library "libcutils.so"df— 同上busybox— CANNOT LINK EXECUTABLE: could not load library "libc.so"mount— 同上
原因
Android 的大部分命令都是动态链接的,依赖 /system/lib/ 下的 .so 库:
libc.so— C 标准库libcutils.so— Android C 工具库libm.so— 数学库libdl.so— 动态链接库liblog.so— 日志库- 等等
恢复方法
- 进入恢复模式
- 刷原版 OTA 恢复
- 重新应用修改
教训
绝对不能删除 /system/lib/*.so!
7.2 conf 分区清零陷阱
事件
尝试清零 conf 分区来重置恢复机制。
命令
bash
dd if=/dev/zero of=/dev/block/conf bs=4096 count=1024后果
每次启动都触发恢复模式。
原因
清零后 MonitorFailedNum=0,条件 SafeErrCode(0) >= MonitorFailedNum(0) = TRUE,每次都触发恢复。
正确做法
bash
# 写入正确的值
echo -e "[System]\nWorkMode=0\nSafeErrCode=0\nMonitorFailedNum=255\n" > /tmp/conf_fix.txt
dd if=/tmp/conf_fix.txt of=/dev/block/conf bs=4096教训
conf 分区不能清零,必须写入正确的值。
7.3 删除关键 APK 导致崩溃
事件
删除以下 APK 后系统崩溃:
- MainControl.apk
- netmanager.apk
- NaAgent.apk
- StbConfig.apk
后果
系统运行约 2 分钟后重启,触发恢复模式。
原因
这些 APK 提供系统服务,删除后服务启动失败 → ext4 错误 → set_fs_safe_mode 触发 → 恢复模式。
教训
在内核 Patch 之前,不能删除这些关键 APK。
7.4 boot.img 修改导致 junk 错误
事件
修改 ramdisk 后重新打包 boot.img,出现 "Initramfs unpacking failed: junk in compressed archive" 错误。
原因
- 修改 ramdisk 后 gzip 大小改变
- 新的 gzip 比原始小
- 后面有零填充
- 内核 gzip 解压器拒绝尾部数据
尝试的解决方案
- 调整压缩级别(level 9 → level 6)— 减少了 junk 但仍有 785 字节
- 添加填充文件 — 复杂且不可靠
最终解决方案
二进制 Patch 内核,禁用 set_fs_safe_mode,从根源解决问题。
教训
修改 boot.img 的 ramdisk 会改变 gzip 大小,导致 junk 错误。
7.5 2 分钟重启现象
现象
删除 framework 文件后,系统运行约 2 分钟后重启。
分析
- 删除 framework 文件
- 某些服务尝试访问这些文件
- ext4 检测到文件缺失
- 触发 ext4 错误处理
- set_fs_safe_mode 拦截
- SafeErrCode++
- 2 分钟后达到阈值
- 触发恢复
解决方案
二进制 Patch 内核,禁用 set_fs_safe_mode。
7.6 安全删除清单
可以安全删除的
APK:
- 所有 IPTV APK
- 所有 priv-app APK
- framework JAR/APK
二进制:
- Android 框架服务(surfaceflinger, drmserver 等)
- Android CLI 工具(am, pm, wm 等)
- ZTE 专用工具(MainCenter, hgAgent 等)
- 媒体/显示相关(screencap, screenrecord 等)
资源:
- 字体(/system/fonts/*)
- 媒体文件(/system/media/*)
- DRM/EGL 库(/system/lib/drm, egl)
- 音效库(/system/lib/soundfx)
配置:
- IPTV 配置文件
- 启动脚本(已删除的服务脚本)
绝对不能删除的
库:
- /system/lib/*.so — 所有动态链接库
二进制:
- sh — shell
- toolbox — 基本命令提供者
- servicemanager — IPC 核心
- vold — 存储管理
- adbd — ADB 远程访问
- busybox — 基本工具
- daemonsu — root 权限
- mount/umount — 文件系统挂载
- reboot — 重启
- setprop/getprop — 属性操作
- start/stop — 服务控制
- insmod/rmmod/lsmod — 内核模块
- ifconfig/route/netcfg/netd — 网络
- dhcpcd/wpa_supplicant/wpa_cli — WiFi/DHCP
- ip/iptables/ip6tables — 防火墙
- ping/netstat/iftop/iperf — 网络工具
- e2fsck/mkswap — 文件系统工具
- ps/df/ls/cat/echo/rm/mkdir — 基本命令
- chmod/chown/sleep/sync/top/touch — 工具命令
- uptime/vdc/vmstat — 系统信息
7.7 恢复方法
方法 1:进入恢复模式
bash
# 串口进入 u-boot
# 按任意键中断自动启动
safe方法 2:刷原版 OTA
- 进入恢复模式
- 选择 apply update from sdcard
- 选择 ota.zip
- 等待完成
方法 3:直接 dd 刷分区
bash
# 刷入原版 boot
dd if=/storage/usb0/boot_backup.bin of=/dev/block/boot bs=4096 conv=fsync
# 刷入原版 conf
dd if=/storage/usb0/conf_backup.bin of=/dev/block/conf bs=4096方法 4:U-boot 恢复
- 串口进入 u-boot
- 使用 tftp 或 USB 加载镜像
- 刷入分区
7.8 最佳实践
修改前备份
bash
# 备份 boot
dd if=/dev/block/boot of=/storage/usb0/boot_backup.bin bs=4096
# 备份 conf
dd if=/dev/block/conf of=/storage/usb0/conf_backup.bin bs=4096
# 备份 system(如果需要)
dd if=/dev/block/system of=/storage/usb0/system_backup.img bs=4096分批删除
每次删除少量文件,重启验证:
- 删除 APK → 重启验证
- 删除二进制 → 重启验证
- 删除资源 → 重启验证
验证命令
bash
# 检查空间
df /system
# 检查进程
ps
# 检查服务
getprop init.svc.zygote
getprop init.svc.surfaceflinger
# 检查 conf
hexdump -C /dev/block/conf | tail -20测试稳定性
删除文件后等待 3 分钟,确认系统不会重启。
阶段七完成:关键教训与踩坑记录