当前位置: 首页 > news >正文

【Android cmd命令的执行流程】

代码路径

/frameworks/native/cmds/cmd/

执行逻辑

main.cpp 将参数转化为c++格式

int main(int argc, char* const argv[]) {signal(SIGPIPE, SIG_IGN);std::vector<std::string_view> arguments;arguments.reserve(argc - 1);// 0th argument is a program name, skipping.for (int i = 1; i < argc; ++i) {arguments.emplace_back(argv[i]);}return cmdMain(arguments, android::aout, android::aerr, STDIN_FILENO, STDOUT_FILENO,STDERR_FILENO, RunMode::kStandalone);
}

cmd.cpp 查找对应的服务,并调用IBinder::shellCommand命令


int cmdMain(const std::vector<std::string_view>& argv, TextOutput& outputLog, TextOutput& errorLog,int in, int out, int err, RunMode runMode) {...sp<IServiceManager> sm = defaultServiceManager();...int argc = argv.size();
// 通过 -l 列出 支持的服务if ((argc == 1) && (argv[0] == "-l")) {Vector<String16> services = sm->listServices();services.sort(sort_func);outputLog << "Currently running services:" << endl;for (size_t i=0; i<services.size(); i++) {sp<IBinder> service = sm->checkService(services[i]);if (service != nullptr) {outputLog << "  " << services[i] << endl;}}return 0;}
// 通过使用 -w 等待服务启动bool waitForService = ((argc > 1) && (argv[0] == "-w"));int serviceIdx = (waitForService) ? 1 : 0;const auto cmd = argv[serviceIdx];Vector<String16> args;
// 获得服务名称String16 serviceName = String16(cmd.data(), cmd.size());for (int i = serviceIdx + 1; i < argc; i++) {args.add(String16(argv[i].data(), argv[i].size()));}sp<IBinder> service;if(waitForService) {service = sm->waitForService(serviceName);} else {service = sm->checkService(serviceName);}...
// 发送agras到对应的服务// TODO: block until a result is returned to MyResultReceiver.status_t error = IBinder::shellCommand(service, in, out, err, args, cb, result);...status_t res = result->waitForResult();return res;
}

Binder.cpp 发送服务到对应的服务

status_t IBinder::shellCommand(const sp<IBinder>& target, int in, int out, int err,Vector<String16>& args, const sp<IShellCallback>& callback,const sp<IResultReceiver>& resultReceiver)
{Parcel send;Parcel reply;send.writeFileDescriptor(in);send.writeFileDescriptor(out);send.writeFileDescriptor(err);const size_t numArgs = args.size();send.writeInt32(numArgs);for (size_t i = 0; i < numArgs; i++) {send.writeString16(args[i]);}send.writeStrongBinder(callback != nullptr ? IInterface::asBinder(callback) : nullptr);send.writeStrongBinder(resultReceiver != nullptr ? IInterface::asBinder(resultReceiver) : nullptr);// 发送到对应的服务return target->transact(SHELL_COMMAND_TRANSACTION, send, &reply);
}

每个service会有一个接口,如PackageManagerShellCommand.java , 其Handler会继承自BasicShellCommandHandler.java中的基类, 而上面的transact会调用到基类中的exec函数, 代码路径aosp/frameworks/libs/modules-utils/java/com/android/modules/utils;

    public int exec(Binder target, FileDescriptor in, FileDescriptor out, FileDescriptor err,String[] args) {String cmd;int start;if (args != null && args.length > 0) {cmd = args[0];start = 1;} else {cmd = null;start = 0;}init(target, in, out, err, args, start);mCmd = cmd;int res = -1;res = onCommand(mCmd);return res;}

其中onCommand是抽象函数,每个继承自该类的类会重写函数;

举例调用

以adb shell cmd package compile -m speed-profile -f com.tencent.mm 为例
当调用到该命令之后, 会调用到PackageManagerShellCommand.java中的onCommand函数, 从而会调用到各个函数
在这里插入图片描述

http://www.dtcms.com/a/434808.html

相关文章:

  • c++26新功能—constexpr在稳定排序中的应用
  • AI生成悬疑故事
  • 泰山派rk3566烧录
  • Phpstudy博客网站apache2日志分析python代码
  • asp网站程序优点做App和网站 聚马
  • 免费软件下载网站入口正能量微信开发公众平台
  • 【系统重装】Windows无法安装到这个磁盘提示选中的磁盘具有MBR分区表解决方法(亲测有效)
  • MySQL 查询与更新语句执行过程深度解析:从原理到实践​
  • Bella Beauty – Aesthetic Medical Clinic WordPress Theme: A Practical
  • 洗车店会员管理系统数据分析
  • 门户网站的意思wordpress 导航 防刷新
  • 虚幻基础:角色受击
  • unordered_set 与unordered_multiset?我们该如何选择
  • 网站建设与维护是什么可以在线观看的免费资源
  • Windows系统下的Git安装(2025年6月更新)
  • Protobuf知识总结
  • 网站的关键词在哪里设置南阳微网站建设
  • GPT‑5 都更新了些什么?
  • 晋中路桥建设集团网站tuzicms做企业手机网站如何
  • 2013 年真题配套词汇单词笔记(考研真相)
  • 女生做网站编辑公司网站开发多少钱
  • 记录GoLang创建文件并写入文件的中文乱码错误!
  • ISO 27001 信息安全管理体系 (ISMS) 建设与运营
  • TCP 的韧性:端网关系对传输协议的影响
  • 怎么创网站赚钱网站美工工作流程
  • malloc:arena
  • 第12课:构建对话记忆:打造多轮对话RAG机器人
  • 大良营销网站建设如何模板网站没有源代码
  • 归并排序的递归和非递归实现
  • 天津建设网站个人主页网页设计模板免费