天道酬勤,学无止境

Stop buffering of adb shell output

I observed this new behavior in adb v1.0.39. The command:

adb shell getevent -l

gives the output below:

Observe that the last line is incomplete. This happens on many different devices. The same command is working without buffering in adb v1.0.32.

How do I stop adb shell output buffering in adb v1.0.39?

标签

评论

Use adb exec-out instead of adb shell command to force the new adb to use the raw mode and avoid stdout buffering.

For more info read comments in adb/daemon/shell_service.cpp

I don't see this behavior using adb 1.0.41.

Only while using tr which I use to delete "\r". In this case I use:

adb command ... | stdbuf -o0 tr -d $'\r'

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • adb常用操作指令
    adb常用操作指令 一. 基本指令二. adb shell 下的 am 与 pmampm 三. 模拟用户事件四. logcat日志五. 常用节点六. 远程ADB七. 常用操作示例八.附表 adb 的全称为 Android Debug Bridge,译为 android调试桥,就是在android系统中起到调试桥的作用。通过adb我们可以在Eclipse中方便通过DDMS来调试Android程序,说白了就是debug工具。 一. 基本指令 进入指定设备 adb -s serialNumber shell查看版本 adb version查看日志 adb logcat查看设备 adb devices连接状态 adb get-state启动ADB服务 adb start-server停止ADB服务 adb kill-server电脑推送到手机 adb push local remote手机拉取到电脑 adb pull remote local 二. adb shell 下的 am 与 pm 注:am和pm命令必须先切换到adb shell模式下才能使用 am am 全称 activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。当你在adb shell命令下执行am命令: am <command>
  • Android Camera简单整理(四)-Android Camera性能Debug经验
    针对手机厂商相机性能优化部分进行重点总结记录 Android Camera性能Debug经验 一.相机性能场景二.相机性能debug工具及方案建议1.dumpsys media.camera1.1 qcom机器1.2 mtk机器 2.systrace3.perfetto4.SimplePerf,火焰图5.Android sudio profile6.Qcom Perfdump工具7.Cpu dump工具8. CpuFloat & PerfMon+ Apk9.查看视频文件丢帧情况工具10.perflock 及 thermal Debug11.内存监控11.1 procrank11.2 top11.3 ION内存信息11.4 Gpu内存信息 12.GAPID 三.基础知识补充 一.相机性能场景 类别场 景耗时重点建议启动类热启动App代码优化精简显示,内存预分配,cpu perflock boost冷启动本质上做成热启动,一般都让相机在后台被杀后过几分钟自动重启,由于是系统平台应用,做到这点不是很难切换类模式切换要经过开关Camera过程cpu perflock boost,减少无用初始化,耗时久的可考虑并行化初始化前后置切换要经过开关Camera过程同一型号手机可能摄像头马达不一样,滚珠式或弹簧式,在弹簧式马达下电关闭相机时如果一下子收回会有摄像头撞击的声音,因此一般让其分步下电
  • 将stdout重定向到Android NDK中的logcat(Redirect stdout to logcat in Android NDK)
    问题 我无法让Nexus S(运行Android 4.0)将本机stdout消息重定向到logcat。 我读到我需要这样做: $ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 但是,这似乎不起作用。 (尽管确实破坏了JUnit,如此处所述,所以它并非没有效果。) 供参考,这是我的代码: package com.mayastudios; import android.util.Log; public class JniTester { public static void test() { Log.e("---------", "Start of test"); System.err.println("This message comes from Java."); void printCMessage(); Log.e("---------", "End of test"); } private static native int printCMessage(); static { System.loadLibrary("jni_test"); } } 和JNI .c文件: JNIEXPORT void JNICALL Java_com_mayastudios
  • ADB操作指令详解
    ADB全称:Android Debug Bridge, Android 调试桥,顾名思义就是PC端和手机之间的桥梁。 接下来总结下我们在开发及测试过程中常用的一些ADB命令。 1、查看版本 adb version Android Debug Bridge version 1.0.36 2、查看连接设备 adb devices List of devices attached 418dd4df device 3、安装apk adb install <apkfile> 如 adb install test.apk 如果不是当前目录,则后面需要跟路径名。如:adb install E:\android_demo\test.apk adb install -r <apkfile> 保存数据和缓存文件,覆盖安装,替换之前的版本 adb install -s <apkfile> 安装在sd卡中 4、卸载apk adb uninstall <package> adb uninstall -k <package> 卸载,但保留数据和缓存文件 需要注意的是,卸载程序时 adb install 后面的参数不是.apk, 而是AndroidManifest文件中<manifest>节点下, package元素指定的名字。如 adb uninstall com.iflytek
  • 7. subprocess
    一、介绍 subprocess模块可以生成新的进程,连接到它们的input/output/error管道,同时获取它们的返回码。 二、基本操作方法 1. subprocess的run、call、check_call、check_output函数 subprocess.run(args[, stdout, stderr, shell ...]):执行args命令,返回值为CompletedProcess类; 若未指定stdout,则命令执行后的结果输出到屏幕上,函数返回值CompletedProcess中包含有args和returncode; 若指定有stdout,则命令执行后的结果输出到stdout中,函数返回值CompletedProcess中包含有args、returncode和stdout; 若执行成功,则returncode为0;若执行失败,则returncode为1; 若想获取args命令执行后的输出结果,命令为:output = subprocess.run(args, stdout=subprocess.PIPE).stdout subprocess.call(args[, stdout, ...]):执行args命令,返回值为命令执行状态码; 若未指定stdout,则命令执行后的结果输出到屏幕; 若指定stdout,则命令执行后的结果输出到stdout; 若执行成功
  • Logcat的大小限制是多少?如何更改其容量?(What is the size limit for Logcat and how to change its capacity?)
    问题 我相信Logcat是一家循环存储,我想知道覆盖它之前的限制是多少。 据推测这意味着其时间范围将根据使用情况而变化。 有什么办法可以扩大产能? 回答1 要查看大小,请使用-g $ adb logcat -g ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b 回答2 从Android 5.0开始,开发人员选项显示/允许增加环形缓冲区的大小。 回答3 如前所述,您可以使用logcat -g查看循环缓冲区的大小。 在我的Galaxy Nexus上,它是256 KB: shell@android:/ $ logcat -g /dev/log/main: ring buffer is 256Kb (255Kb consumed), max entry is 4096b, max payload is 4076b /dev/log/system: ring buffer is 256Kb (0Kb consumed), max entry is 4096b, max payload is 4076b 如果您需要保存的连续日志的时间长于此时间,则可以打开一个新的adb shell并键入 logcat -f myfile.log 此命令将持续不断地将日志条目重定向到文件myfile.log
  • Android-拉SQlite数据库android设备(Android - Pulling SQlite database android device)
    问题 我到处都看过了,找不到真正的准确答案,也没有找到有关如何执行此操作的教程。 是否有可能以任何方式拉入Android设备的数据库而无需将其root? 我只需要以任何方式提取该数据以便将其收集到我的PC上,那么我该如何执行呢? 我是否需要对应用程序或您知道的任何方法进行重新编程,但是请记住不要生根设备。 谢谢 回答1 实现所需目标的一种常用方法是使用ADB pull命令。 在大多数情况下,我更喜欢的另一种方法是通过代码将数据库复制到SD卡: try { File sd = Environment.getExternalStorageDirectory(); if (sd.canWrite()) { String currentDBPath = "/data/data/" + getPackageName() + "/databases/yourdatabasename"; String backupDBPath = "backupname.db"; File currentDB = new File(currentDBPath); File backupDB = new File(sd, backupDBPath); if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB)
  • Monkey命令参数详解
    Monkey命令参数详解(转载) 什么是monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。 基本语法 $ adb shell monkey [options] 如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部应用程序 $ adb shell monkey -p package -v 500 指定对package这个应用程序进行monkey测试,并向其发送500个伪随机事件。其中 -p 表示对象包包,–v 表示反馈信息级别 命令参数 可以使用命令 adb shell monkey -help 查看命令参数 1、参数: -p 用于约束限制,用此参数指定一个或多个应用。指定应用之后,monkey将只允许系统启动指定的app;如果不指定应用,将允许系统启动设备中的所有应用。 指定一个应用: adb shell monkey -p com.ifeng.news2 100 指定多个应用:adb shell monkey -p com.ifext.news –p com.ifeng.news2 100 不指定应用:adb shell monkey 100 2、参数:-c 用于约束限制
  • 从控制台停止Android应用(Stopping an Android app from console)
    问题 是否可以从控制台停止Android应用程序? 就像是: adb stop com.my.app.package 这样可以大大加快我们的测试过程。 现在,我们每次都卸载/安装该应用程序,以确保手动测试用例以干净状态开头。 回答1 编辑:很久以后,我写了这篇文章并被接受为答案,这个答案中提到, am force-stop命令是由Android团队实施的。 或者:由于您提到要在每次测试运行时都需要一个“干净的adb shell pm clear com.my.app.package ,因此您可以使用adb shell pm clear com.my.app.package ,而不是仅停止应用程序,这将停止应用程序进程并清除所有存储的文件。该应用的数据。 如果您使用的是Linux: adb shell ps | grep com.myapp | awk '{print $2}' | xargs adb shell kill 这仅适用于您在运行Shell时立即具有root用户权限的设备/仿真器。 可以稍微完善一下以预先调用su 。 否则,您可以这样做(手动,或者我想按脚本执行): pc $ adb -d shell android $ su android # ps android # kill <process id from ps output> 回答2 停止应用的干净方法是:
  • 通过adb将触摸事件发送到设备(send touch events to a device via adb [duplicate])
    问题 这个问题已经在这里有了答案: 如何使用ADB使用sendevent命令将触摸事件发送到设备? (6个答案) 2年前关闭。 我正在尝试使用adb shell命令将触摸事件发送到设备,以便可以进行UI测试的一些基本自动化操作。 我已经在之前的一些讨论中关注了这一点。 我确认要获取事件并使用sendevent ,每次触摸发送6个事件(xcoord,ycoord, 2表示新闻, 2表示释放),并且很容易在sendevent使用此信息,但是对于触摸屏设备使用getevent命令似乎产生太多事件。 是否有人设法将触摸事件从adb发送到设备? 您能否分享解决方案。 我正在记录电话上的触摸事件。 之后,我希望将同一事件发送回设备作为UI测试的一部分。 请帮忙 回答1 Android随附可模拟其他输入事件的input命令行工具。 要模拟tap ,请使用: input tap x y 使用adb shell远程运行input命令: adb shell input tap x y 其他选项是: shell@m0:/ $ input input usage: input ... input text <string> input keyevent <key code number or name> input [touchscreen|touchpad|touchnavigation] tap <x
  • 常用adb命令 monkey的使用,以及自动化脚本的编写
    Monkey 地址: https://developer.android.google.cn/studio/test/monkey 介绍:Monkey 是一个在模拟器或设备上运行的程序,可生成伪随机用户事件(例如点击、轻触或手势)流以及很多系统级事件。使用 Monkey 以随机且可重复的方式对正在开发的应用进行压力测试。 https://www.bilibili.com/video/BV1dT4y1j7gH?p=6&spm_id_from=pageDriver 常用adb命令 Adb devices Adb help Adb version Adb kill-server Adb start-server Adb install *.apk 连接逍遥模拟器 adb connect 127.0.0.1:21503 连接夜神模拟器 adb connect 127.0.0.1:62001 多个设备可以选择进入 adb -s emulator-5554 shell 读取电量电压 adb shell dumpsys battery 虽然有root权限,但是仍然不能编辑,需要执行以下命令 设置/system为可读写:adb remount 输出日志 Adb logcat -d -v time>D:/android/android.log 把pc端的文件推送到终端 Adb push d:\xx
  • 通过adb shell am start将数据发送回启动活动的脚本(Send data back to the script which started the activity via adb shell am start)
    问题 我想从adb安装诊断应用程序,并从bash脚本中从中获取数据。 我知道如何从adb启动活动,但是除非找到打印到logcat并解析输出的方法,否则我找不到任何方法来取回数据,但这听起来像是骇客。 有没有一种方法可以从使用adb启动的活动中接收数据? 回答1 如果要发送回自动化脚本的数据可以序列化为长度小于4k的字符串-使用logcat是自然的选择。 只需执行您的活动即可使用Log.i("UNIQUE_TAG", the_data_string_you_want_to_send_back_to_your_script);将数据打印到日志中Log.i("UNIQUE_TAG", the_data_string_you_want_to_send_back_to_your_script); 然后在自动化脚本中使用以下命令捕获输出: # clear the logcat buffer adb logcat -c # start your activity adb shell am start <INTENT> # this line will block until a string with "UNIQUE_TAG" tag and "Info" priority # is printed to the main log adb shell 'logcat -b main -v raw
  • 常用adb命令及monkey命令详解
    一、常用adb命令 1、adb devices:查看已连接的设备 2、adb version:查看adb的版本序列号 3、adb -s <设备名字>:指定某设备做什么(设备名字用1的方法可以查看) 4、adb install <安装包.apk>:安装应用(写清楚apk的完整路径)adb -s <设备名字> install <安装包.apk>:指定设备安装应用 5、adb shell:通过远程shell命令来控制模拟器/设备 6、exit:退出shell远程连接,回到原路径。(Ctrl+d,退出shell,回到默认路径) 7、adb pull <设备端路径> <pc端路径>:将指定的文件从设备/模拟器上拷贝到pc端(后面的pc端路径可以不指定,默认存储在当前路径下)。例: adb pull /sdcard/log.txt c:/monkey 8、adb push <pc端路径> <设备端路径>:将指定的文件从pc端拷贝到设备/模拟器上 9、adb shell pm list packages:列出电脑端所有apk的包名 10、adb logcat:查看pc端的日志输出。adb shell界面只需输入logcat,查看设备端日志输出(退出Ctrl+c) 二、Monkey命令扩展 1、最简单的monkey执行语句:(adb shell)monkey –p com.jianjiexuan
  • Android ADB停止应用程序命令(如“ force-stop”)用于无根设备(Android ADB stop application command like “force-stop” for non rooted device)
    问题 我正在尝试停止Android 2.3.7设备上的应用程序。 但是在此版本的Android中,我无法使用“强制停止”命令。 您是否知道其他方法可以在无根设备上关闭应用程序? 回答1 第一种方式需要root 使用kill : adb shell ps =>将列出设备上所有正在运行的进程及其进程ID adb shell kill <PID> = <PID>使用您的应用程序的进程ID代替<PID> 第二种方式在Eclipse中打开DDMS透视图。 在Devices视图中,您将找到所有正在运行的进程。 选择过程,然后单击“ Stop 。 第三种方式它只会杀死应用程序的后台进程。 adb shell am kill [options] <PACKAGE> =>杀死与(应用程序的程序包名称)关联的所有进程。 此命令仅杀死可以安全杀死并且不会影响用户体验的进程。 选项有: -用户| 全部| 当前:指定要杀死其进程的用户; 所有用户(如果未指定)。 第四种方式需要root adb shell pm disable <PACKAGE> =>禁用给定的包或组件(写为“包/类”)。 第五种方式请注意,只有使用调试键签名的应用程序才支持运行方式。 run-as <package-name> kill <pid> 第六种方式在蜂窝中引入 adb shell am force-stop <PACKAGE>
  • 通过ADB更改设备语言(Change Device language via ADB)
    问题 我想通过亚行更改语言。 我尝试: adb shell setprop persist.sys.language fr;setprop persist.sys.country CA;stop;sleep 5;start 但是我得到了错误: setprop: command not found stop: missing job name Try `stop --help' for more information. start: missing job name Try `start --help' for more information. 怎么了? 我想在物理设备上执行此操作 回答1 您的错误与adb无关。 您只是不了解本地外壳程序如何处理命令。 您正在做的是在本地(在您的PC上)运行以下命令: adb shell setprop persist.sys.language fr setprop persist.sys.country CA stop sleep 5 start 并且您看到的错误消息来自本地外壳程序(即,系统上没有setprop可执行文件,并且start和stop命令具有非可选参数)。 正确的命令是 adb shell "setprop persist.sys.language fr; setprop persist.sys.country CA
  • 如何使用ADB使用sendevent命令将触摸事件发送到设备?(How to use ADB to send touch events to device using sendevent command?)
    问题 我正在尝试使用AndroidDebugBridge将触摸事件发送到设备,以便可以进行UI测试的一些基本自动化操作。 我关注了LINK中的讨论。 我能够使用sendevent在模拟器上模拟触摸,但是无法在设备上执行相同操作。 就像上面的链接一样,仿真器似乎为每次触摸发送6个事件(xcoord,ycoord,2为新闻,2为释放),并且很容易使用此信息发送事件,但是设备触摸屏的getevent似乎产生太多事件。 是否有人设法将触摸从ADB发送到设备? 您能否分享解决方案。 回答1 Android随附可模拟其他输入事件的input命令行工具。 为了模拟点击,它是: input tap x y 您可以使用adb shell(> 2.3.5)远程运行命令: adb shell input tap x y 回答2 为了执行特定操作(例如,打开Web浏览器),您需要首先弄清楚点击的位置。 为此,您可以先运行: adb shell getevent -l 在设备上按所需的位置后,您将看到以下输出: <...> /dev/input/event3: EV_KEY BTN_TOUCH DOWN /dev/input/event3: EV_ABS ABS_MT_POSITION_X 000002f5 /dev/input/event3: EV_ABS ABS_MT_POSITION_Y
  • 10分钟学会python写游戏脚本!Python其实很简单
    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,写几层代码,就可以按照自己的逻辑玩儿游戏了。 当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实现上面的操作。 这两天我写了一个公主连结刷初始号的程序,也不能算写游戏脚本的老手,这篇文章主要是分享一些基础的技术和使用上的心得吧。 准备工作 首先,我们要完成以下准备。 安卓设备一个:模拟器或者真机都可以。安装ADB,并添加到系统的PATH里:adb是用来安装tesseract-ocr,并添加到系统的PATH里:帮助我们实现简单的字符识别安装python3.7以上的版本 这里adb和tesseract我放在百度网盘里了,里面顺便放了一个录制的效果视频。 链接:pan.baidu.com/s/1edTPu2o7… 提取码:33aw 很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍
  • 如何从根到用户模式重新启动ADB?(How to restart adb from root to user mode?)
    问题 有关亚行的基本问题。 adb root以root身份重新启动adb。 但是我想要的是在一段时间后将其重新启动回用户。 我尝试了以下方法: adb kill-server adb start-server 不起作用.. ps -A >记录了adb的进程号并杀死了它。 最后,我重新启动设备。 有什么办法可以使我从root adb返回到一般adb? 谢谢你。 回答1 如果您使用adb root ,则会收到以下消息: C:\>adb root * daemon not running. starting it now on port 5037 * * daemon started successfully * restarting adbd as root 要退出root模式,可以使用: C:\>adb unroot restarting adbd as non root 回答2 adb kill-server和adb start-server仅在PC端控制adb守护程序。 还原由adb root完成的service.adb.root属性更改后,需要在设备本身上重新启动adbd守护进程: ~$ adb shell id uid=2000(shell) gid=2000(shell) ~$ adb root restarting adbd as root ~$ adb shell id
  • 筛选LogCat以仅从Android中的“我的应用程序”中获取消息?(Filter LogCat to get only the messages from My Application in Android?)
    问题 我观察到,当我将Logcat与带有ADT for Android的Eclipse结合使用时,我也会从许多其他应用程序中获取消息。 有没有一种方法可以对此进行过滤,并且仅显示来自我自己的应用程序的消息。 回答1 软件包名称保证是唯一的,因此您可以将Log函数与标记一起用作软件包名称,然后按软件包名称进行过滤: 注意:从Build Tools 21.0.3开始,由于TAGS的字符数限制为23个或更少,因此该功能将不再起作用。 Log.<log level>("<your package name>", "message"); adb -d logcat <your package name>:<log level> *:S -d表示实际设备, -e表示仿真器。 如果运行的仿真器不止1个,则可以使用-s emulator-<emulator number> (例如, -s emulator-5558 ) 示例: adb -d logcat com.example.example:I *:S 或者,如果您正在使用System.out.print将消息发送到日志,则可以使用adb -d logcat System.out:I *:S来仅显示对System.out的调用。 您可以在这里找到所有日志级别和更多信息:https://developer.android.com/studio
  • Android:如何使用ADB Shell启动应用程序(Android: How to strace an app using ADB shell am start)
    问题 我需要有关在SDK仿真器中构建Android应用程序的帮助。 这是我的设置: 我有一个运行Android API 4.03 ADB Shell并连接到模拟器的Android SDK模拟器。 我可以使用ADB安装filename.apk安装APK 我可以使用ADB shell am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList时运行该应用程序am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList 我尝试使用(ADB shell) strace am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList但我什么也没得到! 您如何跟踪Android应用及其安装的运行时行为? (PS测试应用程序位于此处。 回答1 “ am start”命令不会直接运行您的应用程序;而是直接运行您的应用程序。 在您的示例中