Skip to content

阶段七:关键教训与踩坑记录

🕒 Published at:

阶段七:关键教训与踩坑记录 ​

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 — 日志库
  • 等等

恢复方法 ​

  1. 进入恢复模式
  2. 刷原版 OTA 恢复
  3. 重新应用修改

教训 ​

绝对不能删除 /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" 错误。

原因 ​

  1. 修改 ramdisk 后 gzip 大小改变
  2. 新的 gzip 比原始小
  3. 后面有零填充
  4. 内核 gzip 解压器拒绝尾部数据

尝试的解决方案 ​

  1. 调整压缩级别(level 9 → level 6)— 减少了 junk 但仍有 785 字节
  2. 添加填充文件 — 复杂且不可靠

最终解决方案 ​

二进制 Patch 内核,禁用 set_fs_safe_mode,从根源解决问题。

教训 ​

修改 boot.img 的 ramdisk 会改变 gzip 大小,导致 junk 错误。

7.5 2 分钟重启现象 ​

现象 ​

删除 framework 文件后,系统运行约 2 分钟后重启。

分析 ​

  1. 删除 framework 文件
  2. 某些服务尝试访问这些文件
  3. ext4 检测到文件缺失
  4. 触发 ext4 错误处理
  5. set_fs_safe_mode 拦截
  6. SafeErrCode++
  7. 2 分钟后达到阈值
  8. 触发恢复

解决方案 ​

二进制 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 ​

  1. 进入恢复模式
  2. 选择 apply update from sdcard
  3. 选择 ota.zip
  4. 等待完成

方法 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 恢复 ​

  1. 串口进入 u-boot
  2. 使用 tftp 或 USB 加载镜像
  3. 刷入分区

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

分批删除 ​

每次删除少量文件,重启验证:

  1. 删除 APK → 重启验证
  2. 删除二进制 → 重启验证
  3. 删除资源 → 重启验证

验证命令 ​

bash
# 检查空间
df /system

# 检查进程
ps

# 检查服务
getprop init.svc.zygote
getprop init.svc.surfaceflinger

# 检查 conf
hexdump -C /dev/block/conf | tail -20

测试稳定性 ​

删除文件后等待 3 分钟,确认系统不会重启。


阶段七完成:关键教训与踩坑记录