当前位置:   article > 正文

Android start stop 命令使用简介_android stop

android stop

源码基于:android R

0. 前言

我们经常在修改framework 重要东西不是直接reboot 平台进行验证,而是使用命令:

stop;start

这样就能达到重启system server 的效果,具体这两个命令是如何执行的?本文来简单分析下。

1. 来源

从平台或者编译后的out 目录下,很轻松地能找到stop 和start 两个可执行文件。

以平台上为例:

  1. lrwxr-xr-x 1 root shell 7 2021-11-01 05:36 start -> toolbox
  2. lrwxr-xr-x 1 root shell 7 2021-11-01 05:36 stop -> toolbox

其实,stop 和start 就是可执行程序toolbox

2. toolbox 的main 程序

源码目录:system/core/toolbox/toolbox.c

  1. #define TOOL(name) int name##_main(int, char**);
  2. int main(int argc, char** argv) {
  3. // Let's assume that none of this code handles broken pipes. At least ls,
  4. // ps, and top were broken (though I'd previously added this fix locally
  5. // to top). We exit rather than use SIG_IGN because tools like top will
  6. // just keep on writing to nowhere forever if we don't stop them.
  7. signal(SIGPIPE, SIGPIPE_handler);
  8. char* cmd = strrchr(argv[0], '/');
  9. char* name = cmd ? (cmd + 1) : argv[0];
  10. for (size_t i = 0; tools[i].name; i++) {
  11. if (!strcmp(tools[i].name, name)) {
  12. return tools[i].func(argc, argv);
  13. }
  14. }
  15. printf("%s: no such tool\n", argv[0]);
  16. return 127;
  17. }

函数很简单,

  • 解析下命令行的第一个参数,并去除路径。如果没有路径,那就直接使用命令,例如start;
  • 通过数组tools的name 匹配到合适的func 并将参数argc和argv 带入执行;

注意代码最开始的TOOL(name),用以声明函数,而tools数组中的func 就是通过TOOL注册,详细看 system/core/toolbox/toolbox.h:

  1. TOOL(getevent)
  2. TOOL(getprop)
  3. TOOL(modprobe)
  4. TOOL(setprop)
  5. TOOL(start)
  6. TOOL(stop)
  7. TOOL(toolbox)

相当于声明了在toolbox.c 最开始声明了一系列的函数:

  1. int getevent_main(int, char**);
  2. int getprop_main(int, char**);
  3. int modprobe_main(int, char**);
  4. int setprop_main(int, char**);
  5. int start_main(int, char**);
  6. int stop_main(int, char**);
  7. int toolbox_main(int, char**);

我们还可以在toolbox.c 中定义了数组tools:

  1. static struct {
  2. const char* name;
  3. int (*func)(int, char**);
  4. } tools[] = {
  5. #define TOOL(name) { #name, name##_main },
  6. #include "tools.h"
  7. #undef TOOL
  8. { 0, 0 },
  9. };

转换为:

  1. static struct {
  2. const char* name;
  3. int (*func)(int, char**);
  4. } tools[] = {
  5. {"getevent", getevent_main},
  6. {"getprop", getprop_main},
  7. {"modprobe", modprobe_main},
  8. ...
  9. { 0, 0 },
  10. };

总结:

  • 在toolbox.c 声明了一系列 *_main 函数,并将其初始化定义在tools 数组中;
  • 每个命令都链接到toolbox,运行toolbox main函数时,根据传入的参数确定 *_main,并执行;

3. start 命令

根据上一节确认start 命令最终会调用到start_main():

  1. extern "C" int start_main(int argc, char** argv) {
  2. return StartStop(argc, argv, true);
  3. }

4. stop 命令

同理,stop 命令最终调用到的是stop_main():

  1. extern "C" int stop_main(int argc, char** argv) {
  2. return StartStop(argc, argv, false);
  3. }

OVER,找到了源头剩下来的代码就简单了,这里不做过多阐述了。根本原理是通过ctl.start 和ctl.stop 来控制service:

  1. std::vector<std::string> services = {
  2. "iorapd",
  3. "netd",
  4. "surfaceflinger",
  5. "audioserver",
  6. "zygote",
  7. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/945112
推荐阅读
相关标签
  

闽ICP备14008679号