在Recovery模式下使用Shell显示消息的方法探究

2次阅读
没有评论

如何在recovery模式下使用Shell脚本显示消息

在手机安装定制ROM或者进行特殊操作时,有时需要在recovery模式的界面上提示用户某些信息或执行特定任务。本文将探讨如何解决用户在recovery模式中使用Shell脚本(sh文件)显示信息的问题。

问题描述

在编写一个Shell脚本后,运行时发现信息并没有在recovery界面上正确地显现出来,而只是记录在了终端日志中。其提供的Shell脚本和相关代码是这样的:

Shell脚本 (test.sh)

#!/sbin/sh
if [ ! -e "/efs/imei/mps_code.dat" ]; then
    mount /efs
fi
csc_id=`cat /efs/imei/mps_code.dat`
echo "$csc_id" > /tmp/csc_id.prop
echo "Your active csc is $csc_id"

初始化脚本

/prebuilt/sdcard.img
&mount(format=/dev/block/mmcblk0p26) (maxproto=HFS+ uid=11027 gid=10054)
&umount("/data")
ui_print("-- Mount partitions...")
run_program("/sbin/busybox", "mount", "/system")
run_program("/sbin/busybox", "mount", "/data")
package_extract_dir("test", "/tmp")
set_perm(0, 0, 0755, "/tmp/test.sh")
ui_print("run test.sh")
/run_program("/tmp/test.sh")
ui_print("END OF PROCESS")
unmount("/data")
unmount("/system")

用户还尝试使用echo命令来输出信息,然而只有echo的记录出现在日志中,并没有实际呈现在recovery界面上。

问题分析

根据提供的信息,我们发现直接在Shell脚本中使用的echo命令只会在终端或日志中打印内容而不会显示在用户可见界面上。这是因为在执行Shell脚本的过程中,任何标准输出(包含echo的输出)都有可能被重定向到其他地方或者未被捕获。

解决方案

为了从recovery Shell中将信息传递给用户的界面显示区,你需要使用TWRP提供的ui_print命令。此方法已经被成功应用在SuperSU等工具中,其具体用法如下:

  1. 设置文件执行权限
    确保你的脚本具有正确的执行权限。

  2. 编写使用ui_print的Shell脚本(test.sh):
    sh
    #!/sbin/sh
    if [ ! -e "/efs/imei/mps_code.dat" ]; then
    mount /efs
    fi
    csc_id=`cat /efs/imei/mps_code.dat`
    ui_print "Your active csc is $csc_id"

  3. 确保在初始化脚本中正确设置OUTFD变量(如果需要)。根据TWRP文档或者相关代码示例进行适当调整。

  4. 运行并检查结果:通过执行上述配置好的Shell脚本,验证信息是否能在recovery界面显示出来。

注意:

  • 确保你的脚本文件路径指向正确。
  • ui_print命令是TWRP提供的特定命令,如果是在其他框架或是固件下可能不适用,需根据实际情况调整代码逻辑。

通过正确的配置与应用ui_print这些步骤可以让你的Shell脚本成功在recovery界面上显示信息。

正文完