通过init.rc自定义启动.sh脚本以解决Android 5.0数据挂载问题

8次阅读
没有评论

背景:您希望为一款具有厂商bug的Android 5.0设备(中国大陆,MTK平台)进行调试。/data分区因存在某些二进制文件Bug,在执行vold.decrypt=trigger_shutdown_frameworkvold.decrypt=trigger_reset_main时未被正确卸载,导致即使使用fuser -mlsof命令也无法识别出有进程占用该分区。

解决方案一:手动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的触发条件来观察结果。

注意点:

  1. 确保selinux规则允许执行此脚本;
  2. 如若无法通过logcat获取有用信息,请尝试查看内核日志或其他方式检查错误原因,可能需要额外工具或调试技术。
  3. 由于各设备厂商差异较大,在某些特定机型上上述方法可能不适用。务必仔细试验并确认。

请在正式环境中进行此类操作时保持谨慎,并测试各种情景以确保稳定性和安全性。

正文完