[c#][process]下发单个以及同时多条adb指令

2023-10-27

using System.Diagnostics;

private Process cmd_process;

下发单条adb指令

代码示例

       private string GetAdbCommandsArguments(string cmds)
        {
            cmds = cmds.Replace("adb", "");
            cmds = cmds.Trim();
            return cmds;
        }

        public string RunAdbCommands(string cmds)
        {
           
            string returnValue;
            string arguments = GetAdbCommandsArguments(cmds);
            cmd_process = new Process();
            cmd_process.StartInfo.FileName = adb_exe_path;
            cmd_process.StartInfo.UseShellExecute = false;
            cmd_process.StartInfo.CreateNoWindow = true;
            cmd_process.StartInfo.RedirectStandardOutput = true;
            cmd_process.StartInfo.RedirectStandardInput = true;
            cmd_process.StartInfo.RedirectStandardError = true;
            cmd_process.StartInfo.Arguments = arguments;
            try
            {
               
                      
                cmd_process.Start();
                StreamReader reader = cmd_process.StandardOutput;
                returnValue = reader.ReadToEnd();
                reader.Close();
                cmd_process.WaitForExit();
                cmd_process.Close();
            }
            catch (Exception ex)
            {
                returnValue = ex.Message;
            }
            return returnValue;
        }

需要注意

1. cmd_process.StartInfo.FileName = adb_exe_path;

  public string adb_exe_path { get; } = "C:/Users/nick/adb-fastboot/adb.exe";

博主使用的adb.exe是绝对路径。

2. string arguments = GetAdbCommandsArguments(cmds);

     cmd_process.StartInfo.Arguments = arguments;

     这里的argument 为不包含adb 这个字符的argument,比如下发 “adb shell” ,“shell” 为这个程序的argument,因此只要设置cmd_process.StartInfo.Arguments = shell;即可

3.            cmd_process.Start();
                StreamReader reader = cmd_process.StandardOutput;
                returnValue = reader.ReadToEnd();
                reader.Close();
                cmd_process.WaitForExit();
                cmd_process.Close();

在通过读取adb 命令返回的过程中,有可能会出现卡死现象,在操作完 reader.ReadToEnd(),后将reader 关闭,执行reader.Close(); 可以优化这个问题。

同时下发多条adb指令-通过将指令存储在txt文件中,读取文件方式实现

代码示例

       public string RunAdbCommandsFromFiles(string file_name)
        {
            string outPut="";
            Process process = new Process();
            process.StartInfo.FileName = adb_exe_path;
            process.StartInfo.Arguments = "shell";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardInput = true;
            process.StartInfo.RedirectStandardError = true;
            
            process.Start();
            FileStream fs = new FileStream(file_name,FileMode.Open, FileAccess.Read);
            StreamReader read = new StreamReader(fs, Encoding.Default);
            string strReadline;
            
            while ((strReadline = read.ReadLine()) != null)
            {
               process.StandardInput.WriteLine(strReadline);
                   
            }
         
            fs.Close();
            read.Close();
            process.StandardInput.WriteLine("exit");
            process.StandardInput.AutoFlush=true;
            process.StandardInput.Close();
                
            try
            {
                StreamReader output_reader = process.StandardOutput;
                outPut = output_reader.ReadToEnd();
                output_reader.Close();
            }
             catch (Exception e)
            {                
                        return e.Message;
            }
            
         process.WaitForExit();
         process.Close();       
         return outPut;
        }

需要注意

1.  process.StartInfo.FileName = adb_exe_path;

     博主使用的adb.exe是绝对路径。同上

2.  Arguments 设置为shell,文件中写入在实际情况中 adb shell后 直接操作dut的指令

 process.StartInfo.Arguments = "shell";

     FileStream fs = new FileStream(file_name,FileMode.Open, FileAccess.Read);
     StreamReader read = new StreamReader(fs, Encoding.Default);
     string strReadline;      
      while ((strReadline = read.ReadLine()) != null)
      {
               process.StandardInput.WriteLine(strReadline);         
      }
         
       fs.Close();
       read.Close();
       process.StandardInput.WriteLine("exit");
       process.StandardInput.AutoFlush=true;

       process.StandardInput.Close();

  文件内容示例

ls -l  /sys/kernel/debug/XXX1
ls -l  /sys/kernel/debug/XXX2
ls -l  /sys/kernel/debug/XXX3
ls -l  /sys/kernel/debug/XXX4
ls -l  /sys/kernel/debug/XXX5
ls -l  /sys/kernel/debug/XXX6

3. 多条指令可能会遇到内存溢出问题

    //
        // 摘要:
        //     读取来自流的当前位置到结尾的所有字符。
        //
        // 返回结果:
        //     字符串形式的流的其余部分(从当前位置到结尾)。 如果当前位置位于流结尾,则返回空字符串 (“”)。
        //
        // 异常:
        //   T:System.OutOfMemoryException:
        //     没有足够的内存来为返回的字符串分配缓冲区。
        //
        //   T:System.IO.IOException:
        //     出现 I/O 错误。

        public override string ReadToEnd();

通过指令定义,也可以看到,如果执行多条指令后,如果指令返回值很大的情况下,有可能会有没有足够的内存来为返回的字符串分配缓冲区。因此在执行程序出现崩溃的情况时可以考虑是否指令返回信息过大,因此可能通过将指令分流下发来解决该问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[c#][process]下发单个以及同时多条adb指令 的相关文章

  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 无法在 Android 模拟器中安装 apk

    我正在尝试通过 adb shell 在 ICS 模拟器中安装 apk 从一个站点下载 但出现以下错误 失败 INSTALL FAILED UID CHANGED 可能是什么问题 只需 rm r 有问题的数据目录即可 如果您在安装时遇到此错误
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • Android:获取最新意图

    如何获取发送到活动的最后一个意图 的文档onNewIntent 建议我需要做这样的事情 class MyActivity public void onNewIntent Intent intent setIntent intent reac
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 华为OD机试 - 求字符串中所有整数的最小和(Java)

    题目描述 输入字符串s 输出s中包含所有整数的最小和 说明 字符串s 只包含 a z A Z 合法的整数包括 1 正整数 一个或者多个0 9组成 如 0 2 3 002 102 2 负整数 负号 开头 数字部分由一个或者多个0 9组成 如
  • power相关:(一)低功耗设计目的与功耗的类型

    一 低功耗设计的目的 1 便携性设备等需求 电子产品在我们生活中扮演了极其重要的作用 便携性的电子设备便是其中一种 便携性设备需要电池供电 需要消耗电池的能量 在同等电能提供下 低功耗设计的产品就能够工作更长的时间 时间的就是生命 因此低功
  • 【MySQL】使用Visio绘制数据库关系模型图

    使用Visio绘制数据库关系模型图 1 新建项目 文件 新建 软件和数据库 数据库模型图 点击后 出现如下界面 2 绘制 左侧 实体关系 中将 实体 形状拖放到绘制界面 如下图 3 编辑实体名称 如下图 4 编辑列 点击 列 如下图 完成实
  • 【因果推断与机器学习】Causal_inference: Chapter 4

    Chapter4 Estimation 一旦我们找到了识别因果量的策略 我们就需要选择如何使用统计方法估计这些因果量 我们使用受实际计算应用程序启发的示例来描述最常用的方法 首先 我们介绍因果估计的基础知识 如何从已确定的估计值到估计器 我
  • Oracle入门使用

    表空间的创建 普通用户授权 sys登录 grant create tablespace to 用户名 grant drop tablespace to 用户名 给user01 一个临时用户的角色 grant connect to user0
  • make -j时不知道cpu核数设置多大合适

    make j nproc nproc 就是你可以设置的当前机器的最大值了
  • Python使用Psycopg2访问PostgreSQL

    本文将关注 安装Psycopg2并使用其API访问PostgreSQL数据库 然后带您完成数据插入 数据检索 数据更新和数据删除 接下来 它将介绍事务管理 连接池和错误处理技术 以使用PostgreSQL开发健壮的python程序 使用pi
  • Vue性能优化

    Vue 项目性能优化 现在Vue3 0都快发布了为什么还要优化2 0的项目 因为市场上公司90 的项目全是Vue2 0的项目 迁移的话成本太高 所以只能进行性能的优化调整 废话就不多赘述了 直接开始吧 一 活用异步组件 Vue cli打包的
  • CXL 2.0 Device配置空间寄存器组成

    目录 1 配置空间 1 1 PCI Power Management Capability Structure 1 2 PCI Express Capability Structure 2 扩展配置空间 2 1 Virtual Channe
  • Java~实现简单的扑克牌,洗牌,发牌,玩捉鬼游戏(讲解详细,代码齐全)

    目录 一 扑克牌的定义 1 牌的定义 2 玩家的定义 二 扑克牌的操作 初始化 洗牌 发牌等 1 初始化 2 洗牌 3 发牌 三 初始化 洗牌 发牌代码 全 四 捉鬼游戏 首先一副扑克牌是54张 这里我们去掉大小王 也就是52张扑克牌 有
  • layui多文件上传_EasyUI的filebox组件实现多文件上传的步骤

    EasyUI的filebox组件实现多文件上传的步骤 新增回款记录详情里面有个添加回款记录文件的按钮 点击选择文件 文件既可以选择一个也可以选择多个 img 点击并拖拽以移动
  • 锁升级

    synchronized锁升级机制 普通对象对象头 Mark Word与锁息息相关 后面的Klass Word与锁无关 不讨论 Mark Word结构 public class Syn static int a 0 public stati
  • 服务器有时候显示美国,美国服务器不通的情况解决方法

    最近有朋友跟小编反馈美国服务器会出现不通的情况 这是什么原因呢 1 大网络环境的的原因 很多时候 我们是使用移动 电信和联通的线路 电信的是最常用的 突然网络不通的话 检查咨询下机房看是不是环境大网络出现什么异常 有的时候 美国得走的是国际
  • QT跨线程连接信号和槽

    对QT的信号和槽理解较为初级 今天通过多次尝试 终于学会了跨线程连接信号和槽 其基本方法如下 1 无参数传递时 1 定义 signal void signal1 2 连接部分写法 connect p class1 类1的指针 SIGNAL
  • WDK学习笔记_基于区块链溯源系统的后端接口开发

    文章目录 摘要 一 fabric go sdk各个封装函数的功能介绍 1 1 查询指定节点通道是否已经存在 函数 QuerySavedChannel 1 2 创建并加入通道 函数 CreateChannel 1 3 查询指定节点的指定链码是
  • Python类中的self到底是干啥的

    Python类中的self到底是干啥的 Python编写类的时候 每个函数参数第一个参数都是self 一开始我不管它到底是干嘛的 只知道必须要写上 后来对Python渐渐熟悉了一点 再回头看self的概念 似乎有点弄明白了 首先明确的是se
  • Vue语法(四)

    一 组件的自定义事件 1 一种组件间通信的方式 适用于 strong style color red 子组件 gt 父组件 strong 2 使用场景 A是父组件 B是子组件 B想给A传数据 那么就要在A中给B绑定自定义事件 span st
  • 2021-07-21训练日记upc联通数(思维)

    A 联通数 题目描述 数学高手小G最近发现了一种新型的数 他首先在草稿纸写下任意长度的数字串kkkkkkkkkkk 1 k 9 并在其中间添加加号 且相邻两个加号之间至少含有两个数字k 默认数字串第一个数字前与最后一个数字后也有两个加号 然
  • React+antdPro4+TS(typescript)相关(知识点)踩坑记录

    最近公司新开了项目 是后台管理系统 在技术选型上选择的时候 选择了react 然后整体的框架选择的是antd pro 4 这个脚手架搭建出来的单页面应用 要是想要仔细了解antd pro 可以看一下他的官方文档 antd pro 此次开发整
  • [c#][process]下发单个以及同时多条adb指令

    库 using System Diagnostics private Process cmd process 下发单条adb指令 代码示例 private string GetAdbCommandsArguments string cmds