Brooks

珍惜生命中的每一次冲动

0%

Android ADB 常用命令

抓取系统log

1
手机拨号界面输入: '*#*# 284 #*#*' 	#小米手机支持

系统会自动提示:“正在生成bug报告,大概需要1分钟”,文件再sdcard下。包含bugreport内容

错误报告获取

1
adb bugreport <parh>   #导出到指定路径

导出后是一个zip文件,包含data/anr信息

获取设备信息

查询手机发货地址

1
adb shell getprop ro.hw.country		  	#查询手机发货地址

查询CPU位数

1
adb shell getprop ro.product.cpu.abi	  	#查询CPU是32位还是64位

查询EMUI版本

1
adb shell getprop ro.build.version.emui 	#查询EMUI版本

查询设备制造商

1
adb shell getprop ro.product.manufacturer	#查询设备制造商

查询手机品牌

1
adb shell getprop ro.product.brand		#查询手机品牌

查询手机内部代号

1
adb shell getprop ro.product.model		#查询手机内部代号

查询设备名称

1
adb shell getprop ro.product.name			#查询设备名称

查询设备序列号

1
adb shell getprop ro.serialno				#查询设备序列号

获取CPU序列号

1
adb shell cat /proc/cpuinfo

获取CPU核数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
adb shell cat /proc/cpuinfo

processor : 0
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp uscat ilrcpc flagm
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd4c
CPU revision : 0

processor : 1
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp uscat ilrcpc flagm
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd4c
CPU revision : 0

获取应用CPU负载率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
adb shell top  #查看对应进程cpu负载率,除以核数。(127 / 700 = 18.1%)

Tasks: 384 total, 2 running, 382 sleeping, 0 stopped, 0 zombie
Mem: 10785M total, 10367M used, 418M free, 21M buffers
Swap: 4095M total, 0M used, 4095M free, 3409M cached
700%cpu 153%user 3%nice 131%sys 357%idle 32%iow 16%irq 9%sirq 0%host

PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS
7443 u10_a94 20 0 15G 188M 84M S 127 1.7 77:34.03 com.car.guard.sentry
3712 u10_system 20 0 15G 184M 52M S 37.0 1.7 37:00.36 com.xiao.wakeupservice
284 logd 30 10 10G 15M 3.3M S 20.3 0.1 13:28.24 logd
864 cameraserver 20 0 11G 28M 24M S 11.6 0.2 7:09.09 cameraserver
1205 u10_a43 20 0 16G 395M 295M S 8.6 3.6 9:09.33 com.car.map

获取android_id

1
adb shell settings get secure android_id

查询Android系统版本

1
adb shell getprop ro.build.version.release #查询手机Android系统版本

查询设备分辨率

1
adb shell dumpsys window displays

查看设备屏幕密度

1
adb shell wm density

查看显示屏参数

1
2
3
4
5
6
adb shell dumpsys window displays

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
deferred=false layoutNeeded=false

其中 mDisplayId 为 显示屏编号,init 是初始分辨率和屏幕密度,app 的高度比 init 里的要小,表示屏幕底部有虚拟按键,高度为 1920 - 1794 = 126px 合 42dp。

查看UI绘制的各个层级信息

1
adb shell dumpsys SurfaceFlinger

显示wifi信息

1
adb shell dumpsys wifi

磁盘相关信息

1
adb shell dumpsys diskstats

电池相关信息

1
adb shell dumpsys battery

显示accounts信息:

1
adb shell dumpsys account

SELinux运行模式切换

SELinux是Security Enhanced Linux的缩写,是安全强化的Linux,它是由美国国家安全局 (NSA) 开发的,整合到Linux核心的一个模块,是对于强制访问控制(MAC)的实现,是 Linux历史上最杰出的新安全子系统,提供了比传统的UNIX权限更好的访问控制。在SELinux的访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。

java.io.FileNotFoundException: /data/user/10/[package]/files/Movies/localvideo.mp4: open failed: EACCES (Permission denied)

1
2
3
4
5
#进入adb shell下,修改为宽容模式,解决权限问题
adb shell setenforce 0 #转成 Permissive 宽容模式
adb shell setenforce 1 #转成 Enforcing 强制模式

adb shell getenforce #获取当前模式

adb切换屏幕方向

1
2
adb shell settings put system accelerometer_rotation 0
adb shell settings put system user_rotation 1 # 1 / 3

常用命令

显示当前栈顶Activity信息

1
adb shell dumpsys activity top

显示当前Activity调用栈信息

1
2
3
adb shell dumpsys activity activities | grep '* ActivityRecord{'

adb shell dumpsys window | grep mCurrentFocus

当前与用户交互的activity

1
2
3
4
5
#方法一
adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'

#方法二
adb shell dumpsys activity | grep -i run

显示已安装应用列表

1
adb shell pm list package | grep live

显示包详情信息

1
adb shell dumpsys package <packagename>		#adb shell dumpsys package com.brooks.live

显示APK版本信息

1
2
3
4
5
6
7
8
9
10
11
#已安装情况下
adb shell dumpsys package com.brooks.live | grep version

versionCode=1000004 minSdk=30 targetSdk=31
versionName=1.0.4
signatures=PackageSignatures{85fc893 version:2, signatures:[b4addb29], past signatures:[]}


#未安装情况下
aapt dump badging live.apk

显示app内部目录

1
2
3
4
5
6
7
8
9
10
11
adb shell run-as <package> ls

app_libs
app_textures
app_webview
cache
databases
files
lib
lib-main
shared_prefs

文件导入导出

1
2
3
4
5
adb push [path] [device path]   #导入
adb pull [device path] [path] #导出

# adb push ~/work/test.log /sdcard
# adb pull /sdcard/tracker.txt ~/work

Monkey 压力测试

1
2
3
4
adb shell monkey -p <packagename> -s 200 --throttle 50 --monitor-native-crashes -v -v 5000

adb shell monkey -p <packagename> -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > ./java_monkey_log.txt

生成签名

1
2
# cmd:生成签名:
keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

标准hprof-conv文件转换

1
2
#Android studio 转换 hprof-conv文件
hprof-conv.exe com.brooks.car.hprof convert.hprof

设备总内存获取

内存不足时:会出现异常,卡顿、触发LMK杀死应用,【IO流 读取 /proc/meminfo文件信息 第一行就是】

1
2
3
4
5
6
7
8
$ cat proc/meminfo      
MemTotal: 1530888 kB
MemFree: 292248 kB
MemAvailable: 614972 kB
Buffers: 4192 kB
Cached: 368056 kB
SwapCached: 0 kB
Active: 885152 kB

获取应用内存占用

1
2
3
4
5
6
7
adb shell procrank  #查看PPS数值

PID Vss Rss Pss Uss Swap PSwap USwap ZSwap cmdline
1205 17113044K 407852K 294355K 288540K 0K 0K 0K 0K com.car.map
790 18023492K 362496K 210291K 189340K 0K 0K 0K 0K system_server
3712 15599836K 192076K 105658K 103276K 0K 0K 0K 0K com.iv.wakeupservice
7443 16020644K 186840K 89517K 83484K 0K 0K 0K 0K com.car.guard.sentry

Dvm最大可用内存:

1
adb shell getprop | grep dalvik.vm.heapsize

单个程序限制最大可用内存:

1
adb shell getprop|grep heapgrowthlimit

强制关闭一个应用程序:

1
2
3
adb shell ps -ef | grep <packagename> #查看应用进程

adb shell am force-stop <packagename> #杀死应用进程

查看占用内存前6的app

1
adb shell top -m 6

截屏命令:

1
2
3
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell rm /sdcard/screen.png

输入文本

在焦点处于某文本框时,可以通过 input 命令来输入文本。

1
adb shell input text hello #hello会出现在文本框中

获取指定App启动耗时

1、查看Logcat

在Android Studio Logcat中过滤关键字“Displayed”,可以看到对应的冷启动耗时日志。

2、adb shell

1
2
3
4
5
6
7
8
9
adb shell am start -W [packageName]/[MainActivity]

#ThisTime
最后一个Activity启动耗时。
#TotalTime
所有Activity启动耗时。
#WaitTime
AMS启动Activity的总耗时。

一般来说,只需查看得到的TotalTime,即应用的启动时间,其包括 创建进程 + Application初始化 + Activity初始化到界面显示 的过程。

获取指定App内存信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
adb shell dumpsys meminfo <pid> 	#输出指定pid的某一进程
adb shell dumpsys meminfo --package <packagename> #输出指定包名的进程,可能包含多个进程

$ adb shell dumpsys meminfo com.brooks.test
Applications Memory Usage (in Kilobytes):
Uptime: 68996621 Realtime: 68996621

** MEMINFO in pid 7916 [com.brooks.test] **
Pss Private Private Swap Rss Heap Heap Heap
Total Dirty Clean Dirty Total Size Alloc Free
------ ------ ------ ------ ------ ------ ------ ------
Native Heap 10890 10848 0 0 14292 18160 16525 1634
Dalvik Heap 2545 2348 0 0 17612 6568 3284 3284
Dalvik Other 10825 10728 0 0 17180

......

App Summary
Pss(KB) Rss(KB)
------ ------
Java Heap: 4132 21992
Native Heap: 10848 14292
Code: 10340 118912
Stack: 552 564
Graphics: 49668 49668
Private Other: 11256
System: 7404
Unknown: 21904

[TOTAL PSS: 94200] TOTAL RSS: 227332 TOTAL SWAP (KB): 0
.....

获取指定App帧率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
adb shell dumpsys gfxinfo <package> framestats

$ adb shell dumpsys gfxinfo com.brooks.test framestats
Applications Graphics Acceleration Info:
Uptime: 12617763 Realtime: 12617763

** Graphics info for pid 10930 [com.brooks.test] **

Stats since: 10906446516775ns
Total frames rendered: 33
Janky frames: 5 (15.15%) ##帧率
50th percentile: 5ms
90th percentile: 22ms
95th percentile: 44ms
99th percentile: 61ms
.......

修改设备分辨率

1
2
3
4
5
adb shell wm size #查看当前分辨率
adb shell wm size 1920x1280 #修改分辨率

adb shell wm density #查看dpi
adb shell wm density 320 #修改dpi

修改设备时间

1
2
3
adb root 
adb shell date "052513302022.0" #5月25号,下午1点30分

修改日志缓存区大小

1
2
3
4
5
adb logcat -g #命令进行查看缓冲区

adb logcat -G 5M #$修改大小,临时生效

adb shell setprop persist.logd.size 5M #永久生效,需重启

修改日志缓存区大小

1
2
3
4
5
adb logcat -g #命令进行查看缓冲区

adb logcat -G 5M #$修改大小,临时生效

adb shell setprop persist.logd.size 5M #永久生效,需重启

adb Logcat

查看webview log

1
adb logcat -s chromium

导出Log

1
2
3
adb logcat -s *:V > ./live.log #全量log
adb logcat -s *:E > ./live.log #Error级别log
adb logcat -s *:F > ./live.log #Fatal级别log

过滤Log

1
2
3
4
5
adb logcat | grep PK
adb logcat | grep -i PK #忽略大小写

#获取指定包名的log
adb logcat --pid=$(adb shell pidof -s com.mi.XXX)

adb无线调试

1
2
3
4
5
6
7
8
$adb connect <手机ip>:5555  #只要手机不重启,后面就可以不用usb线连接手机了,直接通过网络adb就可以

#如果重复以上步骤还是Offline的话,使用USB 线将设备与电脑连接。应确保连接成功(可运行 adb devices 看是否能列出该设备)。让设备在 5555 端口监听 TCP/IP 连接,PC端命令行输入:
$ adb tcpip 5555


#断开连接
adb disconnect <手机ip>:5555

adb shell prop

需要root, 设置属性值,便于调试

1
2
3
adb shell setprop propname propvalue

$ adb shell setprop live.open.check false #设置属性live.open.check

adb 启动

启动activity

1
2
adb shell am start -n {package}/{全类名activity}
adb shell am start -a { Action名称 } -d {参数}

启动浏览器

1
2
adb shell am start -n com.android.browser/com.android.browser.BrowserActivity  #启动浏览器
adb shell am start -a android.intent.action.VIEW -d http://www.baidu.com #启动浏览器并打开指定网页

启动 Camera

1
adb shell am start -n com.android.camera/com.android.camera.Camera

拨打电话

1
adb shell  am start -a  android.intent.action.CALL -d tel:10086

启动 google map 直接定位到北京

1
adb shell am start -a android.intent.action.VIEW geo:0,0?q=beijing

启动activity通过scheme

1
adb shell am start -d  autocat://findcar

关闭activity

1
2
3
4
adb shell am force-stop {package}

# 如:关闭浏览器
adb shell am force-stop com.android.browser

启动service

1
2
3
4
5
6
7
adb shell am startservice -n {包名}/{包名}.{服务名}

#启动应用中一个service
adb shell am startservice -n com.android.traffic/com.android.traffic.maniservice

#启动service,传入int参数
adb shell am startservice -a{action} --ei type 1

关闭service

1
2
3
adb shell am stop-service -a {action}

adb shell am stop-service -n {包名}/{包名}.{服务名}

卸载应用程序:

1
2
3
4
adb uninstall{package}

#如:卸载浏览器
adb uninstall com.android.browser

发送broadcast:

1
2
3
4
5
6
7
8
adb shell am broadcast -a <广播动作>

#如:发送一个网络变化的广播
adb shell am broadcast -a android.net.conn.CONNECTIVITY_CHANGE

#静态注册,必须加-p指定包名
adb shell am broadcast -a "com.brooks.auto.status" -p com.brooks.car -e topic "brooks"
adb shell am broadcast -a "com.brooks.auto.status" -p com.brooks.car --es topic "brooks"

端口转发

1
2
3
adb shell am broadcast -a NotifyServiceStop
adb forward tcp:12580 tcp:10086
adb shell am broadcast -a NotifyServiceStart
1
echo 111 > a.txt  (向 aa.txt写入 “111”) 只第一行用">" ,换行用">>"

欢迎关注我的其它发布渠道