继续分析 twrp ui.xml中的相关内容,以<page name="reboot">为讲解内容

    <object type="button"><highlight color="%highlight_color%" /><condition var1="tw_reboot_system" var2="1" /><placement x="%col1_x%" y="%row1_y%" /><font resource="font" color="%button_text_color%" /><text>System</text><image resource="main_button" /><actions><action function="set">tw_back=reboot</action><action function="set">tw_action=reboot</action><action function="set">tw_action_param=system</action><action function="set">tw_has_action2=0</action><action function="set">tw_text1=No OS Installed! Are you</action><action function="set">tw_text2=sure you wish to reboot?</action><action function="set">tw_action_text1=Rebooting...</action><action function="set">tw_complete_text1=Rebooting...</action><action function="set">tw_slider_text=Swipe to Reboot</action><action function="page">rebootcheck</action></actions></object><object type="button"><highlight color="%highlight_color%" /><condition var1="tw_reboot_poweroff" var2="1" /><placement x="%col2_x%" y="%row1_y%" /><font resource="font" color="%button_text_color%" /><text>Power Off</text><image resource="main_button" /><actions><action function="set">tw_back=reboot</action><action function="set">tw_action=reboot</action><action function="set">tw_action_param=poweroff</action><action function="set">tw_has_action2=0</action><action function="set">tw_text1=No OS Installed! Are you</action><action function="set">tw_text2=sure you wish to power off?</action><action function="set">tw_action_text1=Turning Off...</action><action function="set">tw_complete_text1=Turning Off...</action><action function="set">tw_slider_text=Swipe to Power Off</action><action function="page">rebootcheck</action></actions></object><object type="button"><highlight color="%highlight_color%" /><condition var1="tw_reboot_recovery" var2="1" /><placement x="%col1_x%" y="%row2_y%" /><font resource="font" color="%button_text_color%" /><text>Recovery</text><image resource="main_button" /><actions><action function="set">tw_back=reboot</action><action function="set">tw_action=reboot</action><action function="set">tw_action_param=recovery</action><action function="set">tw_has_action2=0</action><action function="set">tw_text1=No OS Installed! Are you</action><action function="set">tw_text2=sure you wish to reboot?</action><action function="set">tw_action_text1=Rebooting...</action><action function="set">tw_complete_text1=Rebooting...</action><action function="set">tw_slider_text=Swipe to Reboot</action><action function="page">rebootcheck</action></actions></object><object type="button"><highlight color="%highlight_color%" /><condition var1="tw_reboot_bootloader" var2="1" /><placement x="%col2_x%" y="%row2_y%" /><font resource="font" color="%button_text_color%" /><text>Bootloader</text><image resource="main_button" /><actions><action function="set">tw_back=reboot</action><action function="set">tw_action=reboot</action><action function="set">tw_action_param=bootloader</action><action function="set">tw_has_action2=0</action><action function="set">tw_text1=No OS Installed! Are you</action><action function="set">tw_text2=sure you wish to reboot?</action><action function="set">tw_action_text1=Rebooting...</action><action function="set">tw_complete_text1=Rebooting...</action><action function="set">tw_slider_text=Swipe to Reboot</action><action function="page">rebootcheck</action></actions></object>

tw_actoin=reboot传入的是命令,tw_action_param=system 传入的是参数

在gui/actions.cpp 中有如下的函数定义

 1 int GUIAction::doAction(Action action, int isThreaded /* = 0 */)
 2 {
 3     static string zip_queue[10];
 4     static int zip_queue_index;
 5     static pthread_t terminal_command;
 6     int simulate;
 7
 8     std::string arg = gui_parse_text(action.mArg); //这里获取tw_action=的参数即tw_action_param传入的参数
 9
10     std::string function = gui_parse_text(action.mFunction); //获取tw_action传入的函数名字
11
12     DataManager::GetValue(TW_SIMULATE_ACTIONS, simulate);
13
14     if (function == "reboot")
15     {
16             //curtainClose(); this sometimes causes a crash
17
18         sync();
19         DataManager::SetValue("tw_gui_done", 1);
20         DataManager::SetValue("tw_reboot_arg", arg);   //把参数传入到,其中tw_reboot_arg的类型是 map<string, string>
21
22         return 0;
23     }       ... 

好了,再看别外一个文件:

 1 // reboot: Reboot the system. Return -1 on error, no return on success
 2 int TWFunc::tw_reboot(RebootCommand command) //RebootCommand 中一个enum类型,定义在twrp-functions.hpp中
 3 {
 4     // Always force a sync before we reboot
 5     sync();
 6
 7     switch (command) {
 8         case rb_current:
 9         case rb_system:
10             Update_Log_File();
11             Update_Intent_File("s");
12             sync();
13             check_and_run_script("/sbin/rebootsystem.sh", "reboot system");
14             return reboot(RB_AUTOBOOT);
15         case rb_recovery:
16             check_and_run_script("/sbin/rebootrecovery.sh", "reboot recovery");
17             return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "recovery");
18         case rb_bootloader:
19             check_and_run_script("/sbin/rebootbootloader.sh", "reboot bootloader");
20             return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "bootloader");
21         case rb_poweroff:
22             check_and_run_script("/sbin/poweroff.sh", "power off");
23 #ifdef ANDROID_RB_POWEROFF
24             android_reboot(ANDROID_RB_POWEROFF, 0, 0);
25 #endif
26             return reboot(RB_POWER_OFF);
27         case rb_download:
28             check_and_run_script("/sbin/rebootdownload.sh", "reboot download");
29             return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "download");
30         default:
31             return -1;
32     }
33     return -1;
34 }

RebootCommand类型定义如下:

typedef enum {rb_recovery,rb_poweroff,rb_bootloader,rb_download,} RebootCommand;

触发重启进入什么类型的调用在twrp.cpp::main()函数中

定义如下:

    ...// Reboot
    TWFunc::Update_Intent_File(Reboot_Value);TWFunc::Update_Log_File();gui_print("Rebooting...\n");string Reboot_Arg;DataManager::GetValue("tw_reboot_arg", Reboot_Arg);  //这里获取tw_reboot_arg中的变量if (Reboot_Arg == "recovery")TWFunc::tw_reboot(rb_recovery);     //传入enum变量,触发重启进入recovery动作else if (Reboot_Arg == "poweroff")TWFunc::tw_reboot(rb_poweroff);else if (Reboot_Arg == "bootloader")TWFunc::tw_reboot(rb_bootloader);else if (Reboot_Arg == "download")TWFunc::tw_reboot(rb_download);elseTWFunc::tw_reboot(rb_system);...

转载于:https://www.cnblogs.com/sn-dnv-aps/p/3676345.html

twrp gui/actions.cpp 中的功能实现 tw_action ,tw_action_param ,第二章相关推荐

  1. css 识别变量中的换行符_Python编程 第二章——变量和简单数据类型

    变量名 变量名只能包含字母.数字.下划线,且不能以数字打头 变量名不能包含空格,一般以_作为分隔 不能使用保留字作为变量名 变量名通常使用小写 文件名 小写字母.下划线 字符串 用单引号或双引号括起的 ...

  2. 管理系统中计算机应用第二章思维导图,第二章 项目范例:剖析网络订票系统 课件(15张PPT)...

    第二章 项目范例:剖析网络订票系统 课件(15张PPT) 2.1 信息系统及其组成 2.2 信息系统的功能 2.3 信息系统中的计算机和移动终端 第二章 信息系统的组成与功能 教材p29-p33 信息 ...

  3. 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )

    文章目录 前言 一.DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 二./bin/dexopt 源码分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ...

  4. Redux中的功能式React式编程简介

    by Bhuvan Malik 通过布凡·马利克(Bhuvan Malik) Redux中的功能式React式编程简介 (An introduction to functional Reactive ...

  5. Cpp中string使用

    Cpp中string的使用 1. 创建和初始化 2. 操作符 3. string和char*的区别 4. 相关操作 4.1 append 添加文本 4.2 assign赋值 4.3 at 4.4 be ...

  6. SpringBoot和Mybatis实现评论楼中楼功能(一张表搞定)

    文章目录 一.数据库设计 二.搭建SpringBoot框架 三.代码编写 零.效果 在网上搜索了很多,发现很多都是用两张表或者使用jpa实现的,本篇文章将讲述使用一张表来实现评论回复楼中楼功能,使用M ...

  7. SpringBoot和Mybatis实现评论楼中楼功能(一张表搞定,含源码)

    原文链接:https://onestar.newstar.net.cn/blog/35 零.效果 在网上搜索了很多,发现很多都是用两张表或者使用jpa实现的,本篇文章将讲述使用一张表来实现评论回复楼中 ...

  8. matlab怎么美化gui按钮,matlab中美化gui

    10分钟搞定matlabGUI 参考文献: MATLAB程序设计教程 李海涛,邓樱 编著 高等教育出版社,2002 2. 菜单方式 在Matlab的主窗口中,选择File菜单中的New菜单项, 再选择 ...

  9. Nature子刊:微生物系统中的功能与功能冗余

    翻译:周之超@UW-Madison 编辑注:该文章发表于2018年的Perspective,目前被引405次.其作者Stilianos Louca大家并不陌生,正是常用微生物物种功能注释软件FAPRO ...

  10. 丰度决定了细菌在复杂群落中的功能作用

    本文转载自"微生态笔记",已获授权 标题:Abundance determines the functional role of bacterial phylotypes in c ...

最新文章

  1. html5通html5通,HTML5 history详解
  2. ​Highmaps网页图表教程之绘图区显示标签显示数据标签定位
  3. Android--多点触控事件捕捉
  4. python工作好找吗-Python好找工作吗 不看会后悔
  5. php解析url并得到url中的参数及获取url参数的四种方式
  6. 云上“炼”码兵器 GitHub Codespaces
  7. Gitlab添加SSH密钥的解决办法
  8. 搭建、使用与维护私有PyPi仓库
  9. Kudu之Tablet的发现过程
  10. 思科路由器的基本配置
  11. iOS 强制屏幕实现旋转功能,超级简单。
  12. 计算机网络高级工程师证书,网络安全高级工程师的证书??
  13. 阻止事件冒泡 阻止浏览器的默认行为
  14. Postgresql语句持续更新
  15. 机器人史宾_史宾机器人:重启
  16. 基于scapy实现随机源IP的DNS发包工具
  17. Topcoder 2016 TCO Algorithm Algo Semifinal 1 Hard ColorfunPath [网络流]
  18. 设计模式-05.01-行为型-观察者模板模式
  19. 2010.10.15_ximo_VMP脱壳后antidump的处理及再谈简单的爆破(带视频)
  20. FPGA学习经典网站推荐

热门文章

  1. ECMAScript——(二)
  2. 大学计算机课程复习--汇编语言
  3. 如何快速清空一个文件内容
  4. linux docker安装_Linux -- Docker安装
  5. ceph搭建_【实战演练】基于各种存储模拟器与软件存储的存储实验07-Ceph分布式存储的3种存储类型使用方法...
  6. 小程序仿微视_争抢流量!腾讯微视也要开始搞短视频带货
  7. python await timeout_python等待10秒执行下一命令的方法
  8. linux系统的总父目录,Linux虚拟文件系统-资料路径名的解析(2)-回退父目录
  9. WEBPACK+ES6+REACT入门(7/7)-React中绑定文本框与state中的值
  10. 开源自动化运维工具_批量与重复运维压力如何破?了解一下这款自动化运维工具...