安卓车机系统adb shell cmd 源码原理分析

车载测试-常用adb命令和使用场景 有些系统日志开发需要有指定目录的日志,直接使用pull下拉,然后压缩上传到bug附件里面: adb pull /data/xx/ D:\xx\xx。adb shell input swipe 100 100 100 100 1000 //在 100 100 位置长按 1000毫秒。4)删除包:adb shell rm /system/app/xxxxxx/xxxxxx.apk。2)获取此要卸载的包名的地址:adb shell pm path 包名。-d 允许进行将见状,也就是安装的比手机上带的版本低。 阅读详情

hi,粉丝朋友们大家好!
上一次视频分享了input专题课中input命令在android 12的更新,因为原来课程是基于android 10 (可以加我扣:2102309716 优惠购买)
https://ke.qq.com/course/package/77595?tuin=7d4eb354
https://www.bilibili.com/video/BV1aK41117mw/
具体input命令的更新大家看以上视频既可以,顺便补充一下视频中流程图:
在这里插入图片描述

本文主要来补充一下视频中没有详细讲解的cmd命令
一般cmd命令使用格式一般是:
adb shell cmd xxxx
这里xxx其实一般是我们的系统服务名字,其跨进程课中servicemanager列表中保存的所有服务名字

然后他就会触发对应服务的onShellCommand方法,这个时候相当于和dumpsys命令非常类似,dumpsys命令是会触发到对应的服务的dump方法
https://blog.youkuaiyun.com/learnframework/article/details/122596598
那么下面来源码级别分析一下cmd命令,因为上面都是大概的讲解,没有拿出源码来证明。

代码路径:
frameworks/native/cmds/cmd/main.cpp

#include <unistd.h>

#include "cmd.h"

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);
}

这里可以看出主要执行的是cmdMain方法

int cmdMain(const std::vector<std::string_view>& argv, TextOutput& outputLog, TextOutput& errorLog,
            int in, int out, int err, RunMode runMode) {
    sp<ProcessState> proc = ProcessState::self();
    proc->startThreadPool();

#if DEBUG
    ALOGD("cmd: starting");
#endif
    sp<IServiceManager> sm = defaultServiceManager();
    //ignoe
    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;
    }

    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);
    }

    //ignoe
    sp<MyShellCallback> cb = new MyShellCallback(errorLog);
    sp<MyResultReceiver> result = new MyResultReceiver();
    // TODO: block until a result is returned to MyResultReceiver.
    status_t error = IBinder::shellCommand(service, in, out, err, args, cb, result);
     //ignoe
    cb->mActive = false;
    status_t res = result->waitForResult();
#if DEBUG
    ALOGD("result=%d", (int)res);
#endif
    return res;
}

cmdMain的代码其实也简单,主要做了以下几步工作:
1、解析出cmd命令后面的服务字符,根据这个服务字符去servicemanager寻找对应service,返回对应的BpBinder
2、获取了BpBinder后调用IBinder::shellCommand方法,这个方法是最为关键,它会调用到服务端的onShellCommand方法
3、等带服务返回结果

这里继续看看IBinder::shellCommand怎么调用的到服务端的:

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);
}

这里大家如果学习过跨进程专题应该非常熟悉这个,可以看到最后其实是构造了一个Parcel调用了transact方法进行传递,当transact调用完成后就会到服务端的transact再调用到onShellCommand

车载测试之adb命令篇(1) 了解adb是什么?为什么车载测试行业需要用到?怎么下载及安装? 阅读详情

相关推荐

车载测试——你需要掌握的Adb命令

写这篇文章主要目的——熟练adb命令是每个车载测试工程师必备的基础技能。

gaven_gu的专栏 5723

Android Adb 源码分析(一)

扭起屁股得意洋洋最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔谁知,好景不长,user版本发布之后,各种bug接踵而来,但是因为user版本权限的原因,我们之前保留在/data/logs/下面的日志不能pull出来,定位问题非常困难不得不想到的解决方案第一个办法:我们想到的第一个办法就是更改data目录的权限,改成system用户,但是因为data下面的logs目录的文件是root权限,获取日

kunkliu的博客 3788

ADB源码(android / platform / system / core)

adb源码官网:https://android.googlesource.com/platform/system/core/可在以上链接获取adb源码集成到项目中。若下载失败可以下载上面的附件。

Android ADB 源码分析总结

Android之ADB总结 本文内容如下: 1. makefile分析及总结 2. adb框架介绍  3. adbd源码分析        3.1 adbd初始化流程分析         3.2 adb shell流程分析     ...

kunkliu的博客 3867

RDMA 出现背景、如何实现?如何测试连通性?

文章目录一、背景:1、传统的 网络通信:2、传统网络通信的问题:二、RDMA :1、出现背景:2、RDMA 简介:3、如何工作:4、RDMA 与 Infiniband 的关系:5、支持 RDMA 的其他协议:6、RDMA 的优势:7、通过 Infiniband 实现 RDMA :8、如何测试 RDMA 连通性:   一、背景: 1、传统的 网络通信:     &n...

郑泽林 2162

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

我是一条寻水的鱼 2979

RootlessJamesDSP:安卓无Root音频增强技术解析

数字信号处理(DSP)是提升移动设备音质的核心技术,其原理在于对PCM音频流进行实时滤波、均衡与空间渲染。在安卓平台,传统DSP方案常依赖Root权限,带来系统不稳定、安全策略冲突与售后风险等工程痛点。RootlessJamesDSP通过深度利用Android 8.0+原生Audio HAL重定向机制与Audio Policy Manager动态路由能力,在不修改/system分区、不启用su、不降级SELinux的前提下,实现全局、低延迟、高兼容的音频处理。该方案兼顾开发者可集成性与OEM预装可行性,适用

weixin_34224941的博客 219

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))

程序需求,需要完成task与task之间  字符数组的数据传输 比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组 具体的程序示意如下: 图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的

faguoduifangui的博客 4540

ShellCommand执行流程

为了方便调试系统服务,系统提供了shellcommand调试框架,我们使用的am、pm等都有使用这种功能,其他系统服务比如shortcutservice则是使用cmd命令来调试,具体的架构类图和流程如下,整体流程比较简单,所以这里就不具体展开。 Cmd.cpp (frameworks\native\cmds\cmd) Java层的系统服务只需要实现onShellCommand 用...

寧靜致遠 4733

物料帐配置之 重估消耗

物料帐配置 ML material ledger

SAP刺客的博客 5912

Valgrind 从入门到精通:内存调试和性能分析

Valgrind 提供了强大的 API,允许开发者编写自定义的检查工具。通过扩展 Valgrind,可以针对特定场景实现更精准的检测。

大模型大数据攻城狮的专栏 1217

Android-源码分析-adb

adb

深度安全实验室 641

ue 蓝图 c++ websocket 事件回调

ue 蓝图 c++ websocket 事件回调

jacke121的专栏 166

android程序执行adb shell命令(实例源码),Android 常用adb shell 命令(转)(示例代码)

调试Android程序有时需要adb shell 命令,adb全称Android Debug Bridge ,就是起到调试桥的作用。通过adb我们可以在Eclipse中通过DDMS来调试Android程序,说白了就是debug工具。adb通过监听Socket TCP 5554等端口让IDE和Qemu通讯。默认情况下当我们运行Eclipse时adb进程就会自动运行。adb是一个C/S模式的程序,由三...

weixin_31900373的博客 1804

微信小程序 - 实现仿小红书轮播图组件功能,类似小红书笔记页面图片展示播放效果,微信小程序仿小红书幻灯片轮播支持视频播放、图片预览,自动适应图片或视频大小可左右滑动切换(小程序精美轮播图,丝滑切换)

微信小程序,轮播图组件,微信小程序仿小红书轮播图,小红书轮播图仿造,微信小程序轮播图,微信小程序幻灯片,微信小程序高仿小红书轮播图实现,小程序实现类似小红书一样的轮播图组件,轮播图插件,精致轮播图,精美丝滑流畅切换的轮播图,轮播图组件,小红薯轮播图,关于小红书的小程序不同数量的轮播图,展示不一样的轮播指示点的实现,微信小程序仿小红书图片轮播,开发微信小程序模仿小红书,高仿小红书Banner的指示器,小红书小程序笔记详情轮播图指示点的随图片数量的变化动态变化,微信小程序swiper轮播图,js轮播图,html

✅ 精选推荐文章 6930

stm32项目实战(1)光敏电阻的介绍和使用

文章目录前言一、光敏电阻介绍二、cubeMX配置三、代码说明总结 前言 本篇文章我们讲带大家了解光敏电阻的使用 一、光敏电阻介绍 下面是4线光敏电阻实物图 产品接线说明: 1、VCC 接电源正极 3.3-5V 2、GND 接电源负极 3、DO TTL 开关信号输出 (配置为输出模式) 4、AO 模拟信号输出(ADC采样通道) 光敏电阻主要用于检测周围的光照强度,光照强度发生变化那么ADC采样的值也会发送变化。 二、cubeMX配置 简单的配置我们就不多说了主要是ADC采样的配置 这里我采用的是ADC1通道

m0_49476241的博客 1万+

今日学习笔记:车载测试之adb 命令

adb是移动端或者app测试必备命令(android/鸿蒙系统),在现今非常火爆的车载测试中,该技能也是必须要有的。 那么今天就来给大家分享一波车载测试中adb 的学习笔记。

公众号【伤心的辣条】资料领取~ 2368

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android doze模式分析一

一、引言 DOZE是安卓系统从6.0(API级别23)开始引入的对低电和应用待机模式的优化。具体介绍可以参考developers官方文档。 阅读完官文后,思考几个问题: 6.0之前,APP怎么处理可以让系统不休眠? 6.0开始,系统如何解决APP不让系统休眠的问题? 二、问题简答 6.0之前,如果不希望APP运行过程系统休眠,可以通过在APP内申请PowerManager.WakeLock保证...

读书未遍、未敢妄下雌黄 2878

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

车机常用adb 命令总结

安卓系统常用的adb命令

weixin_39852879的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

安卓源代码编译,构建ADB篇

adb编译

weixin_42034644的博客 1524

【Android12】Android Framework系列---Adb和PMS安装apk源码流程

通过adb install安装apk,大概流程是 adb(client)端通过socke命令给adbd(service),然后adbd通过ServiceManager以Binder方式将命令发送给PackageManagerService。PackageManagerService解析命令,复制APK及相关资源到指定路径,并更新系统中APK相关配置信息。

林多 3884

Android framework服务命令行工具框架 - Android13

这里强调“framework服务”,主要就是bin命令模拟framework服务相关的查询和功能,如am\pm\input等;其实质就是 Android 提供了大多数常见的 Unix 命令行工具,说白了就是bin执行程序。而framework服务命令行工具现在一般就是cmdbin执行程序Binder获取对应服务,通过调用对应服务的。

许浑的博客 1230

从DeviceIdle 看dumpsys命令

DeviceIdleController.onShellCommand() Android提供的dumpsys工具能够用于查看感兴趣的系统服务信息与状态,还能够提供服务在adb 后台和用户通过adb命令交互。 比如,最近在看的DeviceIdleController模块,这个模块对DOSE模式实现管理。 其通过dumpsys工具,提供了adb 命令交互设置方式。 用户如何通过dumpsys...

dreamfly130的博客 1439

安卓cmd命令整理系列

一、adb命令查看Activity堆栈 1.命令: adb shell dumpsys activity 2.运行结果:由于执行结果很长,我将有用的分成几张图分别截取出来: 二、adb命令查看数据库明细1.命令:命令1:进入应用的databases目录: .......

叔叔有糖吃的专栏 1万+
上一篇: aosp 12/13/lineageos19.1 framework学习编译刷入小米手机,努比亚
下一篇: android 12/13 分屏设置Task的Bounds区域-系统车机开发必学
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值