IT评测·应用市场-qidao123.com

标题: Android 自定义shell命令 [打印本页]

作者: 渣渣兔    时间: 2024-12-28 07:13
标题: Android 自定义shell命令
模拟触摸、按键等操作,直接在命令行输入对应命令即可。命令行怎样识别并操作此命令,实行操作的是shell程序,还是java程序?是不是可以添加自定义的命令?
以下在Android13的代码中分析input命令
Android体系中利用了一款叫mksh的shell程序,用于交互式的命令解释器。
mksh

        mksh是一款开源的命令解释器(shell),aosp中的源码路径是external/mksh,编译后会在/system/bin下生成 "sh"可实行程序,init.rc中设置了开机启动这个二进制程序。当"sh"启动后,终端工具上就会出现我们常知的命令解释器,可以输入shell命令举行操作。
        init.rc中定义了名为"console"的service,service对应的可实行程序是sh这个二进制,这个二进制程序由 exteranl/mksh/Android.bp定义。
  1. service console /system/bin/sh
  2.     class core
  3.     console
  4.     disabled
  5.     user shell
  6.     group shell log readproc
  7.     seclabel u:r:shell:s0
复制代码
 src/main.c中定义一些指令
  1. static const char *initcoms[] = {
  2.         Ttypeset, Tdr, initvsn, NULL,
  3.         Ttypeset, Tdx, "HOME", TPATH, TSHELL, NULL,
  4.         Ttypeset, "-i10", "COLUMNS", "LINES", "SECONDS", "TMOUT", NULL,
  5.         Talias,
  6.         "integer=\\\\builtin typeset -i",
  7.         "local=\\\\builtin typeset",
  8.         /* not "alias -t --": hash -r needs to work */
  9.         "hash=\\\\builtin alias -t",
  10.         "type=\\\\builtin whence -v",
  11.         "autoload=\\\\builtin typeset -fu",
  12.         "functions=\\\\builtin typeset -f",
  13.         "history=\\\\builtin fc -l",
  14.         "nameref=\\\\builtin typeset -n",
  15.         "nohup=nohup ",
  16.         "r=\\\\builtin fc -e -",
  17.         "login=\\\\builtin exec login",
  18.         "ll=\\ls -all",
  19.         NULL,
  20.          /* this is what AT&T ksh seems to track, with the addition of emacs */
  21.         Talias, "-tU",
  22.         Tcat, "cc", "chmod", "cp", "date", "ed", "emacs", "grep", "ls",
  23.         "make", "mv", "pr", "rm", "sed", Tsh, "vi", "who", NULL,
  24.         NULL
  25. };
复制代码
 可在此处添加命令。如:ll=ls -all
cmd命令的入口在frameworks/native/cmds/cmd,在cmd.cpp的cmdMain方法中,根据命令获取对应service
  1. int cmdMain(const std::vector<std::string_view>& argv, TextOutput& outputLog, TextOutput& errorLog, int in, int out, int err, RunMode runMode) {
  2.     sp<ProcessState> proc = ProcessState::self();
  3.     proc->startThreadPool();
  4.     ......
  5.     sp<IServiceManager> sm = defaultServiceManager();
  6.     if (sm == nullptr) {
  7.         ALOGW("Unable to get default service manager!");
  8.         errorLog << "cmd: Unable to get default service manager!" << endl;
  9.         return 20;
  10.     }
  11.     int argc = argv.size();
  12.     if (argc == 0) {
  13.         errorLog << "cmd: No service specified; use -l to list all running services. Use -w to start and wait for a service." << endl;
  14.         return 20;
  15.     }
  16.     ......
  17.     const auto cmd = argv[serviceIdx];
  18.     Vector<String16> args;
  19.     String16 serviceName = String16(cmd.data(), cmd.size());
  20.     ......
  21.     sp<IBinder> service;
  22.     if(waitForService) {
  23.         service = sm->waitForService(serviceName);
  24.     } else {
  25.         service = sm->checkService(serviceName);
  26.     }
  27.     ......
  28.     status_t error = IBinder::shellCommand(service, in, out, err, args, cb, result);
复制代码
起首获取ServiceManage,根据命令获取对应的service,sm->checkService(serviceName);
通过service实行命令IBinder::shellCommand(service, in, out, err, args, cb, result);
因此实行cmd命令的是Java程序,假如实行input命令,须要一个service,体系中InputManagerService处理cmd命令
  1.     @Override
  2.     public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
  3.             String[] args, ShellCallback callback, ResultReceiver resultReceiver) {
  4.         new InputShellCommand().exec(this, in, out, err, args, callback, resultReceiver);
  5.     }
复制代码
最终InputShellCommand实行命令。
此时命令行还不能识别input命令。须要要添加命令入口
frameworks/base/cmds/input,
  1. #!/system/bin/sh
  2. cmd input "$@"
复制代码
添加自定义shell命令步骤:
1.创建service,添加到servicemanager中
2.创建命令实行类ShellCommand
3.添加cmd入口脚本

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4