如何在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等工具中,其具体用法如下:
-
设置文件执行权限:
确保你的脚本具有正确的执行权限。 -
编写使用
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" -
确保在初始化脚本中正确设置
OUTFD
变量(如果需要)。根据TWRP文档或者相关代码示例进行适当调整。 -
运行并检查结果:通过执行上述配置好的Shell脚本,验证信息是否能在recovery界面显示出来。
注意:
- 确保你的脚本文件路径指向正确。
ui_print
命令是TWRP提供的特定命令,如果是在其他框架或是固件下可能不适用,需根据实际情况调整代码逻辑。
通过正确的配置与应用ui_print
这些步骤可以让你的Shell脚本成功在recovery界面上显示信息。