背景:您希望为一款具有厂商bug的Android 5.0设备(中国大陆,MTK平台)进行调试。/data分区因存在某些二进制文件Bug,在执行vold.decrypt=trigger_shutdown_framework
或vold.decrypt=trigger_reset_main
时未被正确卸载,导致即使使用fuser -m
和lsof
命令也无法识别出有进程占用该分区。
解决方案一:手动umount操作
为了解决上述问题,可以利用busybox通过命令 busybox umount -l /data
来解除对/data的挂载。然而,此方法仅适用于偶尔需要解密设备的情况,并非理想方案。因此,提出了通过修改init.rc文件来实现自动化的解决方案。
步骤一:确认init.rc添加位置
首先确保您使用Carliv工具正确解包了boot.img并进入ramdisk环境,在init.rc中插入以下代码:
on property:vold.decrypt=trigger_reset_main
start forcedata
class_reset main
on property:vold.decrypt=trigger_load_persist_props
load_persist_props
on property:vold.decrypt=trigger_post_fs_data
trigger post-fs-data
on property:vold.decrypt=trigger_restart_min_framework
class_start main
on property:vold.decrypt=trigger_restart_framework
class_start main
class_start late_start
on property:vold.decrypt=trigger_shutdown_framework
start forcedata
class_reset late_start
class_reset main
根据需求,在trigger_shutdown_framework
行添加自定义服务启动。接下来需要在相应文件中声明此服务。
步骤二:创建脚本
在ramdisk中放置名为forcedata.sh的Shell脚本,内容为:
#!/system/bin/sh
# 执行umount操作
busybox umount -l /data
确保给该脚本执行权限:
chmod +x forcedata.sh
步骤三:修改init.rc服务条目
在initrc中添加对forcedata.sh文件的引入:
# 自定义FORCEDATA服务
service forcedata /system/bin/sh /forcedata.sh disabled oneshot
此代码表明系统将仅运行一次名为forcedata的服务。
步骤四:应用并验证修改
完成所有更改后,重新打包ramdisk,并将其合并至boot.img中。重启设备并在特定情况下监视vold.decrypt=trigger_shutdown_framework
的触发条件来观察结果。
注意点:
- 确保selinux规则允许执行此脚本;
- 如若无法通过logcat获取有用信息,请尝试查看内核日志或其他方式检查错误原因,可能需要额外工具或调试技术。
- 由于各设备厂商差异较大,在某些特定机型上上述方法可能不适用。务必仔细试验并确认。
请在正式环境中进行此类操作时保持谨慎,并测试各种情景以确保稳定性和安全性。