Adb

2016/08/01

#Android Debug Bridge http://developer.android.com/guide/developing/tools/adb.html

官方文档

一 介绍

Android调试桥接器,简称adb,用于管理模拟器或真机状态的工具。采用CS模式。

客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像ADB插件和DDMS这样的Android工具也可以调用adb客户端。

服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。

守护进程部分,运行于模拟器或手机的后台。

当启动adb客户端时,客户端首先检测adb服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的TCP5037端口,并且监听从adb客户端发来的命令——所有的adb客户端都使用5037端口与adb服务端通信。

接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描5555-5585之间的奇数号端口来搜索模拟器或手机,一旦发现adb守护进程,就通过此端口进行连接。需要说明的是,每一个模拟器或手机使用一对有序的端口,偶数号端口用于控制台连接,奇数号端口用于adb连接,例如:

Emulator 1, console: 5554

Emulator 1, adb: 5555

Emulator 2, console: 5556

Emulator 2, adb: 5557 …

即如果模拟器与adb在5555端口连接,则其与控制台的连接就是5554端口。

当服务端与所有的模拟器建立连接之后,就可以使用adb命令来控制或者访问了。因为服务端管理着连接并且可以接收到从多个adb客户端的命令,所以可以从任何一个客户端或脚本来控制任何模拟器或手机设备。

下文介绍了可以用来管理模拟器或手机的这些adb命令。如果是在Eclipse并且安装了ADT插件的环境下开发Android应用程序,就不需要从命令行使用adb了,ADT插件已经提供了透明的集成。不过,还是可以在调试等需要的时候直接使用adb。

二 命令

2.1 常用

  • adb devices 查看设备列表
  • 序列号 serialNumber–由adb创建的使用控制台端口号的用于唯一标识的一个设备字符串,格式为**<设备类型>-<端口号>**,如emulator-5554.
  • adb [-d|-e|-s <serialNumber>] <command> 操作指定device;如adb -s emulator-5554 install hello.apk
  • -d 仅对USB设备有效,多个USB设备会报错;-e 多个模拟器也会报错; -s 如果不指定设备会返回错误
  • adb get-serialno // 获取设备的ID和序列号serialNumber
  • adb reboot* 重启设备
  • adb reboot bootloader* 重启到bootloader,即刷机模式
  • adb reboot recovery* 重启到recovery,即恢复模式
  • adb root* 以root权限重启adb服务
  • adb wait-for-device* // 在模拟器/设备连接之前把命令转载在adb的命令器中
  • adb shell cat /sys/class/net/wlan0/address 获取mac地址
  • adb shell cat /proc/cpuinfo 获取cpu序列号

  • aapt d badging <apkfile> 获取apk的packagename 和 classname
  • adb install <apkfile> 安装apk
  • adb install -r <apkfile> 保留数据和缓存文件,重新安装apk,
  • adb install -s <apkfile> 安装apk到sd卡
  • adb shell am start -n <package_name>/.<activity_class_name> 启动应用
  • adb uninstall <package> 卸载app
  • adb uninstall -k <package> 卸载app但保留数据和缓存文件
  • adb ppp 通过usb启动ppp

2.2 文件

//android中,sdcard代表内置存储,不同系统中tf卡的设备名可能不同,使用查看。可以使用adb pull 或者 push与设备传输文件。

  • adb pull <remote> <local> 从设备中复制文件到本地,local不写默认当前路径,adb pull /sdcard/data/add.txt ,可使用pwd查看当前目录
  • adb push <local> <remote> 复制一个文件到设备上,可指定路径
  • adb shell ls mnt 查看所有存储设备名。
  • adb remount 将system分区重新挂载为可读写分区,重新加载硬盘
  • adb push <local> <remote> 从本地复制文件到设备
  • adb pull <remote> <local> 从设备复制文件到本地
  • adb shell ls 列出目录下的文件和文件夹,等同于dos中的dir命令
  • adb shell ls -a查看目录下的文件
  • adb shell cd <folder> 进入文件夹,等同于dos中的cd 命令
  • adb shell rename path/oldfilename path/newfilename 重命名文件
  • adb shell rm /system/avi.apk 删除system/avi.apk
  • adb shell rm -r <folder> 删除文件夹及其下面所有文件
  • adb shell mv path/file newpath/file 移动文件
  • adb shell chmod 777 /system/fonts/DroidSansFallback.ttf 设置文件权限
  • adb shell mkdir path/foldelname 新建文件夹
  • adb shell cat <file> 查看文件内容
  • adb shell cat /data/misc/wifi/*.conf 查看wifi密码
  • adb bugreport 查看bug报告
  • adb shell cat /system/build.prop 获取设备名称
  • adb shell getprop读取系统的各种配置文件信息
  • getprop ro.product.locale
  • adb shell getprop persist.sys.country
  • adb shell getprop persist.sys.language 语言
  • adb shell getprop ro.product.model
  • grep查找特定内容

2.3 config

  • adb help 输出adb支持的命令
  • adb version adb的版本号
  • adb get-state adb设备的状态
  • free显示当前进程内存使用情况
  • top显示瞬间的进程的资源占用等信息
  • adb shell top 查看设备cpu和内存占用情况
  • adb shell top -m 6 查看占用内存前6的app
  • adb shell top -n 1 刷新一次内存信息,然后返回
  • adb shell procrank 查询各进程内存使用情况
  • ps显示进程的自身标识信息
  • adb shell ps 查看进程列表
  • adb shell ps -x [PID] 查看指定进程状态
  • adb shell ps | (grep <packageName> / findStr <关键字>) 查看某一程序的进程
  • adb shell ps -x [PID]查看指定进程状态
  • adb shell kill [PID]杀死进程
  • adb shell service list 查看后台services信息
  • adb shell cat /proc/meminfo 查看当前内存占用
  • adb shell cat /proc/iomem 查看IO内存分区
  • adb shell kill [pid] 杀死一个进程

2.4 adb shell

adb提供了shell在设备上的各种命令,这些命令的二进制形式存在于这个路径 /system/bin/... 无论是否进入adb远程shell,都可以使用shell命令来执行。

  • adb [-d/-e/-s (serialNumber)] shell <shellCommand> 未进入远程shell时可执行
  • adb [-d/-e/-s (serialNumber)] shell 启动远程shell
  • 退出 ctrl + D 或者 exit。
  • start/kill-server 开始、停止adb
  • 【setprop KEY VALUE】设置key的property值位value
  • 【getprop KEY】获取该key的property值
  • 【getevent】获取所有事件
  • 【watchprops】监听property值的变化
  • 【stop SERVER】强行停止某一个服务
  • 【start SERVER】启动某一个服务
  • 【ioctl】控制设备
  • 【rm /path/filename】从终端删除一个文件
  • 【mkdir】新建一个目录或者文件
  • 【cp】拷贝文件
  • 【dd】复制文件
  • 【mv】移动目录文件,或者改名
  • 【cat】查看文件内容
  • 【ipconfig】查看更改网络接口地址和参数
  • 【ping】检测网络状态
  • 【netstat】查看网络状态
  • 【telnet】登录远程主机
  • 【sqlite3 /path/DATABASENAME.db】打开某一个数据库。之后即可使用select,insert,delete等数据库操作命令
  • 【tcpdump -p -nnn -vvv -s 0 -w /PATH/NAME.pcap port 80 and tcp】网络调试抓包
  • 【gst-launch playbin uri=file:///system/media/audio/bootaudio.mp3】gst多媒体框架,播放音频文件
  • 【alsa_amixer】音频调试命令,可以切换声道,调节音量,切换设备。不同的芯片厂家的参数设置有所不同。
  • 【alsa_aplay -D AndroidPlayback_Speaker_normal /cache/music/dial/0.wav】通过alsa播放pcm码流。
  • 【alsa_arecord】通过alsa实现录音
  • 【stack –symbols-dir=./out/target/product/NAME/symbols ramdump】查看调用堆栈
  • 【exit】退出shell

从远程shell检查sqlite3 数据库

通过远程shell,可以使用sqlite3命令行程序来管理由应用程序创建的SQLite数据库。 sqlite3 工具包含很多有用的命令,例如 .dump 用于输出表格的内容,.schema 用于为已经存在的表输出 SQL CREATE 语句。 并且该工具也提供了联机执行SQLite命令的能力。

使用 sqlite3时,向前文描述的那样进入模拟器的远程shell,然后使用sqlite3 命令。也可以在调用 sqlite3时指定数据库的全路径。SQLite3数据库存储在/data/data//databases/路径下。

adb -s emulator-5554 shell
sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit 

一旦运行了 sqlite3,就可以使用 sqlite3 命令,退出并返回远程shell可以使用 exit 或 CTRL+D。

使用Monkey进行UI或应用程序测试

  • ` adb shell monkey -v -p your.package.name 500` 对程序进行强制测试500次

Monkey是运行于模拟器或手机上的一个程序,通过生成伪随机的大量的系统级的用户事件流来模拟操作,包括单击、触摸、手势等。从而为正在开发中的应用程序通过随机响应进行压力测试。

最简单使用monkey的方式是通过下面的命令行,它可以运行指定的应用程序并向其发送500个伪随机事件。

2.5 adb logcat(shell环境下直接用logcat)

  • adb logcat [<option>] ... [<filter-spec>] ... 输出日志信息
  • adb logcat -v time -s TAGNAME 显示自定义的TAGNAME并显示时间
  • 过滤日志: V – 明细,D(Debug),I(info), W(Warning),E(Error), F(), S 无记载. 通过运行logcat ,可以获得一个系统中使用的标记和优先级的列表,观察列表的前两列,给出的格式是/

这里是一个日志输出的消息,优先级是“I”,标记是“ActivityManager”:

I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action…} 如果想要减少输出的内容,可以加上过滤器表达式进行限制,过滤器可以限制系统只输出感兴趣的标记-优先级组合。

过滤器表达式的格式是tag:priority … ,其中tag是标记, priority是最小的优先级, 该标记标识的所有大于等于指定优先级的消息被写入日志。也可以在一个过滤器表达式中提供多个这样的过滤,它们之间用空格隔开。

下面给出的例子是仅输出标记为“ActivityManager”并且优先级大于等于“Info”和标记为“MyApp”并且优先级大于等于“Debug”的日志:

adb logcat ActivityManager:I MyApp:D *:S

上述表达式最后的 *:S 用于设置所有标记的日志优先级为S,这样可以确保仅有标记为“View”(译者注:应该为ActivityManager,原文可能是笔误)和“MyApp”的日志被输出,使用 *:S 是可以确保输出符合指定的过滤器设置的一种推荐的方式,这样过滤器就成为了日志输出的“白名单”。

下面的表达是显示所有优先级大于等于“warning”的日志:

adb logcat *:W

如果在开发用电脑上运行 logcat (相对于运行运程shell而言),也可以通过ANDROID_LOG_TAGS环境变量设置默认的过滤器表达式:

export ANDROID_LOG_TAGS=”ActivityManager:I MyApp:D *:S”

需要注意的是,如果是在远程shell或是使用adb shell logcat 命令运行logcat , ANDROID_LOG_TAGS 不会导出到模拟器或手机设备上。

控制日志格式

日志消息在标记和优先级之外还有很多元数据字段,这些字段可以通过修改输出格式来控制输出结果, -v 选项加上下面列出的内容可以控制输出字段:

  • brief — 显示优先级/标记和原始进程的PID (默认格式)
  • process — 仅显示进程PID
  • tag — 仅显示优先级/标记
  • thread — 仅显示进程:线程和优先级/标记
  • raw — 显示原始的日志信息,没有其他的元数据字段
  • time — 显示日期,调用时间,优先级/标记,PID
  • long —显示所有的元数据字段并且用空行分隔消息内容

可以使用 -v启动 logcat来控制日志格式:

[adb] logcat [-v ] 例如使用 thread 输出格式:

adb logcat -v thread 注意只能在 -v 选项中指定一种格式。

Viewing Alternative Log Buffers

Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b 选项,以下是可以指定的缓冲区:

  • radio — 查看包含在无线/电话相关的缓冲区消息
  • events — 查看事件相关的消息
  • main — 查看主缓冲区 (默认缓冲区)

-b 选项的用法:

[adb] logcat [-b ] 例如查看radio缓冲区:

adb logcat -b radio

查看stdout和stderr

默认的,Android系统发送 stdout 和 stderr (System.out 和 System.err) 输出到 /dev/null。 在 Dalvik VM进程,可以将输出复制到日志文件,在这种情况下,系统使用 stdout 和 stderr标记写入日志,优先级是I。

要想使用这种方式获得输出,需要停止运行中的模拟器或手机,然后使用命令 setprop 来允许输出重定位,示例如下:

$ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 系统会保留这一设置直到模拟器或手机退出,也可以在设备中增加/data/local.prop以使得这一设备成为默认配置。

Logcat命令选项列表

  • -b 加载不同的缓冲区日志,例如 event 或radio。main 缓冲区是默认项,参见Viewing Alternative Log Buffers.
  • -c 清空(刷新)所有的日志并且退出
  • -d 在屏幕上输出日志并退出
  • -f 将日志输出到文件,默认输出是stdout.
  • -g 输出日志的大小
  • -n 设置最大的循环数据,默认是4,需要-r选项
  • -r 循环日志文件,默认是16,需要 -f 选项
  • -s 设置默认的过滤器为无输出
  • -v 设置输出格式,默认的是brief,支持的格式列表参见Controlling Log Output Format.

2.8 am

  • adb shell am
  • am start -n {packageName}/{packageName}.{activityName}启动
  • am force-stop {packageName}停止应用相关进程
  • am startservice -n {packageName}/{packageName}.{serviceName}
  • am broadcast -a <Broadcast action> 如 android.net.conn.CONNECTIVITY_CHANGE
  • am broadcast -a NotifyServiceStart/Stop
  • am kill-all杀死后台所有的进程
  • am kill <package> 杀死指定的包的进程
  • am display-size WxH改变显示的分辨率
  • am display-density <dpi>改变显示的density

2.8 pm

  • adb shell pm command
  • pm uninstall [-k] packageName卸载,如 pm uninstall -k com.lq.he.test
  • pm install [-l] [-r] path -r表示重新安装,如 pm install -r user/test.apk
  • cp user/test.apk /data/app 安装
  • rm -f /data/app/test.apk 卸载
  • pm list packages [-f] 获取设备的所有安装包
  • pm list permission-groups 获取权限
  • pm list permissions [-g] [-f] [-d] [-u] [GROUP]
  • pm list instrumentation [-f] [TARGET-PACKAGE]

  • pm list features输出系统的所有功能
  • pm list libraries输出当前设备支持的所有库
  • pm users输出系统上所有的用户
  • pm path package 某个包的路径,如pm path com.lq.he.test–package:/system/app/Test/Test.apk
  • clear package删除与软件包关联的所有数据
  • pm enable package_or_component 启用指定的软件包或组件
  • pm disable package_or_component 停用
  • pm disable-user [options] package_or_component要停用的用户
  • pm grant package_name permission向应用授权
  • pm revoke package_name permission撤销权限
  • pm set-install-location location更改默认安装位置
  • pm get-install-location返回安装的位置
  • pm set-permission-enforced permission [true/false]指定是否应强制执行给定的权限
  • pm trim-caches desired_free_space减少缓存文件以达到给定的可用空间
  • pm create-user user_name使用给定的user_name创建新用户
  • pm remove-user user_id移除指定user_id的用户
  • pm get-max-users输出设备支持的最大用户数

2.9 screenshot

  • take a screenshot of a device display
  • adb shell screencap /sdcard/screen.png

2.10 video

  • adb shell screenrecord /sdcard/demo.mp4

2.11 dumpsys (DDMS提供的一个集成调试环境)

  • adb shell dumpsys [-t timeout] [--help | -l | --skip 服务 | 服务 | 参数] | -c(指定格式输出) | -H(帮助)]
  • adb shell dumpsys 在屏幕上显示系统数据,如 adb shell dumpsys sensorservice
  • adb shell dumpsys activity显示活动栈信息
    • adb shell dumpsys activity activities
    • adb shell dumpsys activity services [<packagename>]
    • adb shell dumpsys activity top查看栈顶Activity,用来获取包名
  • adb shell dumpsys cpuinfo 查看CPU信息
  • adb shell dumpsys input为输入组件提供系统数据
  • adb shell dumpsys -l 输出系统服务的完整的列表

2.11.1 测试UI性能

  • adb shell dumpsys gfxinfo packageName指定包的UI性能数据
  • adb shell dumpsys gfxinfo packageName framestats最近帧中跟踪和调试

2.11.2 网络诊断

  • adb shell dumpsys netstats detail设备的网络使用情况统计信息
  • adb shell dumpsys package com.example.myapp | grep userId

2.11.3 监测电量

  • adb shell dumpysy batterystats options
  • adb shell dumpsys batterystats --charged packageName
    • 电池相关事件的历史记录
    • 设备的全局统计信息
    • 每个UID和系统组件近似的功耗
    • 每个应用的数据包的移动的毫秒数
    • 系统UID汇总统计信息
    • 应用UID汇总统计信息
  • adb shell dumpsys batterystats --checkin检查机器友好的输出

2.11.4 查看内存分配

  • procstats: adb shell dumpsys procstats --hour 33个小时内的内存使用情况
  • meminfo: adb shell dumpsys meminfo packageName|pid [-d]具体应用的内存信息
    • 一般只关心Pss TotalPrivate Dirty(实际的内存)。
    • Dalvik Heap分配应用中使用的RAM。
      • Private Dirty(实际的内存),由你自己分配和任何Zygote分配组成,只承担你的应用的堆。
      • Heap Alloc是Dalvik和本机堆分配器为各个应用分配的内存量。共享。
    • .so .dex mmap私有。
      • RAM用于映射.so和.dex代码。
    • .oat mmap代码图像使用的RAM数量,基于多个应用的预加载类。共享。
    • .art mmap堆使用的RAM数量,基于多个应用的预加载类。共享。
    • .Heap应用的堆内存量。不包括对象和大对象空间。
    • .LOSART大对象(>12kb的基本数组分配)空间使用的RAM量。包括Zygote大对象。
    • .GC垃圾回收的开销成本,没有任何方法可以减少这种开销。、
    • .JINCache这是JIN数据和代码缓存使用的内存量。通常为0,因为应用将在安装时编译。
    • .Zygote合子空间使用的内存量。Zygote空间是在设备启动时创建的,并永远不会分配。
    • .NonMovingART不移动空间使用的RAM数量。非移动空间包含特殊的不可移动对象,如字段和方法。可以减少。
    • .IndirectRefART简介参考表使用的RAM数量。很小。可通过减少本地和全局JNI引用的数量来减少。
    • Unknown系统无法分类。
    • TOTAL是PSS(总比例集大小)字段的总和。你的进程使用的PSS RAM。
    • ViewRootImpl处于活动状态的根视图数量。每个根视图都有一个窗口相关。分析view相关的OOM。
    • AppContexts Activity当前应用的Context和Activity对象的数量。可识别Activity由于静态引用而无法GC引起的OOM。

2.12 其他shell命令

  • adb shell ls /system/bin
  • adb dumpstate 将状态输出到文件
  • adb dmesg 在屏幕上输出核心调试信息
  • adb start/stop 启动或停止设备

三 使用实例

  1. adb shell am start -W packagename/activity计算apk启动时间。

    adb shell am start -W com.lq.test/com.lq.test.MainActivity
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp= com.lq.test/.MainActivity }
    Status: ok
    Activity: com.lq.test/.ui.MainActivity
    ThisTime: 609
    TotalTime: 710
    WaitTime: 728
    Complete
    
  2. adb shell dumpsys batterystats电量消耗
  3. AS no debuggable applications 解决办法: Tools->Android->Enable ADB Integration。在设备上重新安装一遍加上 debuggable true,并且关闭其他adb端口

  4. Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 因为这个APP是通过系统内置的APP 转自 http://blog.csdn.net/ouyang_peng/article/details/50419276

    直接使用adb uninstall com.he.demo   
    会导致 Failure [DELETE_FAILED_INTERNAL_ERROR] 
    第一步:先把原来已经存在的相同包名的APK删除,如:adb shell rm system/app/demo/demo.apk
    第二步:将data/data/目录下该应用的包名的目录删除掉,如:adb shell rm -rf data/data/com.he.demo/
    第三步:重启Android手机  adb reboot
    第四步:再重新安装该APK
    

    ``` 另一种解决办法 **办法1: settings->applications->mange applications-> select the application->select “unistall”. **办法2**: http://blog.csdn.net/he315889714/article/details/38519101 一、删除Android系统下的软件,使用adb shell进入系统,然后使用命令重新挂载“/system”目录为读写权限,具体操作及命令如下: 1、 adb shell 2、切换到root权限:root@android:/ # su
    3、重新挂载:root@android:/ # mount -o remount,rw rootfs /system/
    4、进入系统安装目录:root@android:/ # cd system/app
    5、查看apk包:root@android:/ # ls
    6、删除apk包:rm -r com.he.demo.apk 注:删除apk包后,系统中的应用会自动删除卸载的,无需手动卸载 二、删除包后,运行程序调试会出现INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误; 主要原因是你删除了apk包,但是系统中还有安装信息没有删除; 利用adb shell进入系统,进入/data/app或者/data/data,删除跟你安装的apk同样的包名 1、进入adb shell 2、进入程序安装信息目录 root@android:/ # cd data/data
    3、删除apk信息 root@android:/data/data # rm -r com.he.demo 4、修改/data/system/packages.xml中安装包信息,将xml导出到当前文件夹中 adb pull/data/system/packages.xml .
    5、编辑xml删除与之前删除apk的信息 找到你需要的包名,删除的一段数据。例如:

保存package.xml 6.最后将xml导入系统中 adb push packages.xml /data/system
7.设置完成了一定要重启手机:adb reboot



5.  `adb opendir failed ,permission denied `

	```
1.adb devices 查看所有虚拟设备
2.adb -s 设备名称 shell  进入真机(设备名称为真机的设备名称)
3.cd data 进入data目录
4.ls  查看当前目录的所有文件  (此时会提示adb opendir failed ,permission denied)注意:这时可以输入su,并按回车键
5.cd  data 重新进入data目录
6.ls  查看当前目录的所有文件  此时就能看到此文件夹下的所有文件了
7.cd  data 进入data/data目录
8.cd  com.he.lq.demo  进入程序中
9.cd shared_prefs  进入shared_prefs目录
10.cat  xx.xml   查看xx.xml文件中的内容
*****如果是db, 或者其他不能使用cat的文件,可以导出
1.cd data/data/com.he.lq.demo/databases
1.cp XXX.db /sdcard
2 adb pull /sdcard/XXX.db

文内导航