adb命令
adb(wiki)全称为Android Debug Bridge, 是一种功能多样的命令行工具,可让Android设备进行通信。adb 命令可用于执行安装和调试应用等操作,典型的C/S架构:
$提示符普通权限,#表示拥有root权限
USB连上手机后,windows update会自动安装手机驱动,安装成功后,即可看到这台手机设备 注:如果没有自动识别到手机设备,可以点击上方的+添加蓝牙或其他设备按钮来手动查找安装
注:低版本的adb可能有一些问题,建议升级到最新的版本
https://developer.android.com/studio/releases/platform-tools
更多adb命令,请查看:awesome-adb
不同的proc命令得到的各数值的含义详见:https://man7.org/linux/man-pages/man5/proc.5.html
对于进程的proc命令,例如smaps,则搜索:/proc/[pid]/smaps
adb version // 查看adb的版本信息
adb shell stop // 停止adb
adb shell start // 启动adb 注:手机会有一个快速重启的动作
adb shell wm size // 查看手机的分辨率
adb shell wm size 720x1080 // 将手机的分辨率修改为720x1080
adb shell wm size reset // 将手机的分辨率恢复为缺省
adb shell input tap 960 860 // 向手机坐标为(960,860)的位置发送一个点击事件
adb shell input swipe 250 1090 820 1700 // 从坐标为(250,1090)的位置划向(820, 1700)
adb shell input swipe 300 300 300 300 500 // 在坐标为(300, 300)的位置长按500ms
adb install d:\babyclock.apk // 安装d盘下的babyclock.apk文件到正在运行的android设备中 注:需要在开发者模式中打开“USB安装”开关
// -r 覆盖安装,保留数据和缓存文件; -d 解决低版本version问题; -s 安装apk到sd卡
adb install -r d:\babyclock.apk // 覆盖安装盘下的babyclock.apk文件
adb install -t GameApplication-Debug.apk // 当提示如下错误时 -- adb: failed to install GameApplication-Debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI] 需带上参数-t来安装
adb push c:\test.txt /data/local // 将C盘下的test.txt放到正在运行的android设备的/data/local目录中
adb push G: \Intermediate\Android\APK\obj\local\armeabi-v7a\libUE4.so /sdcard/libUE4.so // 拷贝PC上的libUE4.so到手机的/sdcard目录中
adb pull /data/local/test.txt // 将正在运行的android设备的/data/local/test.txt文件传输到本地当前目录中
adb uninstall com.babyclock // 卸载babyclock应用(应用具体名称可在android设备的/data/data目录中去查看)
adb uninstall -k com.babyclock // 卸载babyclock应用(-k表示保留配置与缓存文件)
adb kill-server // 关闭adb服务
adb start-server // 启动adb服务
adb root // 以root方式重启adb(用于缺省非管理员权限的win7、win10系统)
adb unroot // 以非root方式重启adb(用于缺省非管理员权限的win7、win10系统)
adb remount // 将system分区重新挂在为可读写分区
adb reboot // 重启设备
adb reboot bootloader // 以刷机模式重启设备
adb reboot recovery // 以恢复模式重启设备
adb connect 127.0.0.1:5666 // 与本地5666端口上进程进行连接
adb disconnect 127.0.0.1:5666 // 与本地5666端口上进程断开连接
adb reverse tcp:8080 tcp:80 // 将TCP端口从安卓模拟器或设备中映射到localhost adb reverse tcp:{{远程端口}} tcp:{{本地端口}}
例如:Android 设备上运行的 Web 服务器,并且它监听 8080 端口,可以使用这个命令将它映射到本地客户端的 80 端口
adb reverse --list // 列出所有来自模拟器和设备的映射连接
C:\Users\admin\Desktop> adb reverse --list UsbFfs tcp:8080 tcp:80
adb reverse --remove tcp:8080 // 从安卓模拟器或设备移除一个反向socket连接 adb reverse --remove tcp:{{远程端口}}
adb reverse --remove-all // 从安卓模拟器或设备移除所有反向socket连接
adb forward tcp:8888 tcp:9999 // 转发PC机8888端口的数据到手机的9999端口
adb forward --list // 查看转发是否成功 注:19301902614488是手机的设备id
C:\Users\admin\Desktop>adb forward --list 19301902614488 tcp:8888 tcp:9999
adb forward --remove tcp:8888 // 移除tcp:8888的定向绑定
adb forward --remove-all // 移除所有的定向绑定
adb shell // 在运行的android设备中执行shell命令(进入命令模式,用exit退出)
adb -s RW9H8LJZDYEUWCV4 shell // 进入ID码为RW9H8LJZDYEUWCV4的设备中执行shell命令
adb -s 127.0.0.1:5666 shell am broadcast -a android.intent.action.RUN -e cmd 'stat fps' // 对本地5666端口上进程发送stat fps命令
adb -s 346d59dd shell "echo $EXTERNAL_STORAGE" // 查询ID码为346d59dd的设备上外部存储器根目录 返回:/sdcard
adb -s 346d59dd shell rm -r /sdcard/UE4Game/UAGameTest1 // 递归子目录删除346d59dd的设备上的/sdcard/UE4Game/UAGameTest1目录
adb -s f2f53b9e shell getprop ro.product.cpu.abi // 获取cpu的架构 返回:arm64-v8a
adb -s f2f53b9e shell getprop ro.product.cpu.abilist // 获取支持的cpu架构列表 返回:arm64-v8a,armeabi-v7a,armeabi
adb -s f2f53b9e shell getprop ro.product.brand // 获取设备品牌 Xiaomi
adb -s f2f53b9e shell getprop ro.product.model // 获取设备型号 Mi 10
adb.exe -s f2f53b9e shell "echo 'APK: 2020/5/22 19:33:47' > /sdcard/UE4Game/UAGameTest1/APKFileStamp.txt" // 把APK: 2020/5/22 19:33:47覆盖方式写入到/sdcard/UE4Game/UAGameTest1/APKFileStamp.txt
// 将手机上/sdcard/UE4Game/UAGameTest1/Manifest_UFSFiles_Android.txt拷贝到PC上的G:\svn\UAGameTest1\Saved\StagedBuilds\Android_ASTC\Manifest_UFSFiles_Android_346d59dd.txt
adb.exe -s f2f53b9e pull /sdcard/UE4Game/UAGameTest1/Manifest_UFSFiles_Android.txt "G:\svn\UAGameTest1\Saved\StagedBuilds\Android_ASTC\Manifest_UFSFiles_Android_346d59dd.txt"
// 将手机上/sdcard/UE4Game/UAGameTest1/Manifest_NonUFSFiles_Android.txt拷贝到PC上的G:\svn\UAGameTest1\Saved\StagedBuilds\Android_ASTC\Manifest_NonUFSFiles_Android_346d59dd.txt
adb.exe -s f2f53b9e pull /sdcard/UE4Game/UAGameTest1/Manifest_NonUFSFiles_Android.txt "G:\svn\UAGameTest1\Saved\StagedBuilds\Android_ASTC\Manifest_NonUFSFiles_Android_346d59dd.txt“
adb.exe -s f2f53b9e shell cat /sdcard/UE4Game/UAGameTest1/APKFileStamp.txt // 打印出 APK: 2020/5/22 19:33:47
// 将PC上的G:\svn\UAGameTest1\Saved\StagedBuilds\Android_ASTC中的内容拷贝到手机的/sdcard/UE4Game/UAGameTest1目录中
adb.exe -s f2f53b9e push "G:\svn\UAGameTest1\Saved\StagedBuilds\Android_ASTC" "/sdcard/UE4Game/UAGameTest1"
// 删除手机上/sdcard/obb/com.tencent.mf.test1/main.1.com.tencent.mf.test1.obb文件
adb.exe -s f2f53b9e shell rm /sdcard/obb/com.tencent.mf.test1/main.1.com.tencent.mf.test1.obb
// 删除手机上/sdcard/obb/com.tencent.mf.test1/patch.1.com.tencent.mf.test1.obb文件
adb.exe -s f2f53b9e shell rm /sdcard/obb/com.tencent.mf.test1/patch.1.com.tencent.mf.test1.obb
adb.exe -s f2f53b9e shell am start -n com.tencent.mf.test1/com.epicgames.ue4.SplashActivity // 启动com.tencent.mf.test1游戏
adb.exe -s f2f53b9e shell am start -n "com.tencent.mf.test1/com.epicgames.ue4.SplashActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D // 启动com.tencent.mf.test1游戏
adb.exe -s f2f53b9e shell am start -n "com.tencent.mf.test1/com.epicgames.ue4.SplashActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D --ei arg1 100 --es arg2 "Hello World" // 启动com.tencent.mf.test1游戏
Intent intent = getIntent(); int n = intent.getIntExtra("arg1", -1); // 当没有该参数值,使用-1作为缺省值 String s = intent.getStringExtra("arg2");
adb shell pm list packages // 查看所有安装的应用
adb shell pm list packages -f // 查看所有安装应用所在路径
adb shell pm list packages com.tencent.mf.test1 // 查看是否安装com.tencent.mf.test1应用
adb shell dumpsys diskstats // 查看手机存储空间占用情况
adb shell ps -ux // 在运行的android设备中执行shell命令(ps -ux)
adb shell ps | grep com.tencent.tmgp.pubgm // 查看android设备上名为com.tencent.tmgp.pubgm应用的进程信息,可获取进程ID
adb shell ps | find /i "com.tencent.tmgp.pubgm" // 查看com.tencent.tmgp.pubgm进程是否存在
adb shell top -m 8 -d 1 -s cpu -t | egrep "(com.tencent.tmgp.pubgm|IOW|CPU%)" // 查看com.tencent.tmgp.pubgm按cpu消耗降序排序的前8线程(刷新频率为1s)
User 19%, System 10%, IOW 0%, IRQ 3%
User 162 + Nice 0 + Sys 84 + Idle 554 + IOW 0 + IRQ 18 + SIRQ 7 = 825
PID TID USER PR NI CPU% S VSS RSS PCY Thread Proc
25672 30878 u0_a223 10 -10 6% S 1931316K 493784K ta RenderNico com.tencent.tmgp.pubgm
25672 25701 u0_a223 10 -10 4% S 1931316K 493784K ta GameNico com.tencent.tmgp.pubgm
25672 25918 u0_a223 10 -10 1% S 1931316K 493784K ta NativeThread com.tencent.tmgp.pubgm
adb shell top -d 1 -s | egrep "(com.tencent.tmgp.pubgm|IOW|CPU%)" // 查看com.tencent.tmgp.pubgm的进程信息(刷新频率为1s)
User 15%, System 11%, IOW 0%, IRQ 2%
User 344 + Nice 0 + Sys 250 + Idle 1522 + IOW 0 + IRQ 41 + SIRQ 13 = 2170
PID USER PR NI CPU% S #THR VSS RSS PCY Name
25672 u0_a223 10 -10 15% S 100 1933236K 504644K ta com.tencent.tmgp.pubgm
adb shell kill 1535 // 杀掉pid为1535的进程
adb shell free -k // 以KB为单位显示系统当前内存占用
adb shell cat /proc/meminfo // 查看系统当前更详细的内存占用
MemTotal:所有可用RAM大小。
MemFree:LowFree与HighFree的总和,被系统留着未使用的内存。
Buffers:用来给文件做缓冲大小。
Cached:被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus SwapCache)。
SwapCached:被高速缓冲存储器(cache memory)用的交换空间的大小。
已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开I/O端口。
Active:在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。
Inactive:在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。
SwapTotal:交换空间的总大小。
SwapFree:未被使用交换空间的大小。
Dirty:等待被写回到磁盘的内存大小。
Writeback:正在被写回到磁盘的内存大小。
AnonPages:未映射页的内存大小。
Mapped:设备和文件等映射的大小。
Slab:内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。
SReclaimable:可收回Slab的大小。
SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。
PageTables:管理内存分页页面的索引表的大小。
NFS_Unstable:不稳定页表的大小。
adb shell cat /proc/cpuinfo // 查看系统cpu信息
adb shell cat /proc/stat // 查看cpu占用情况
adb shell cat /proc/13083/stat // 获取pid为13083的统计信息
13083 (.tencent.mf.uam) S 796 796 0 0 -1 1077952832 12003 0 707 0 65 16 0 0 20 0 19 0 116060614 5435342848 22202 18446744073709551615 1 1 0 0 0 0 4612 1 1073775864 0 0 0 17 1 0 0 1 0 0 0 0 0 0 0 0 0 0
pid: 进程ID // 13083
comm: task_struct结构体的进程名 // (.tencent.mf.uam)
state: 进程状态, 此处为S
ppid: 父进程ID (父进程是指通过fork方式,通过clone并非父进程) // 796
pgrp:进程组ID // 796
session:进程会话组ID // 0
tty_nr:当前进程的tty终点设备号 // 0
tpgid:控制进程终端的前台进程号 // -1
flags:进程标识位,定义在include/linux/sched.h中的PF_*, 此处等于1077952832
minflt: 次要缺页中断的次数,即无需从磁盘加载内存页. 比如COW和匿名页 // 12003
cminflt:当前进程等待子进程的minflt // 0
majflt:主要缺页中断的次数,需要从磁盘加载内存页. 比如map文件 // 707
majflt:当前进程等待子进程的majflt // 0
utime: 该进程处于用户态的时间,单位jiffies,// 65
stime: 该进程处于内核态的时间,单位jiffies,// 16
cutime:当前进程等待子进程的utime // 0
cstime: 当前进程等待子进程的utime // 0
priority: 进程优先级 // 20
nice: nice值,取值范围[19, -20], // 0
num_threads: 线程个数, // 19
itrealvalue: 该字段已废弃 // 0
starttime:自系统启动后的进程创建时间,单位jiffies,// 116060614
vsize:进程的虚拟内存大小,单位为bytes // 5435342848
rss: 进程独占内存+共享库,单位pages // 22202
rsslim: rss大小上限 // 18446744073709551615
adb shell cat /proc/13083/task/14942/stat // 获取pid为13083,tid为14942的统计信息 格式如上
adb shell cat /proc/31530/status // 查看pid为31530的进程的状态
Name: MainThread-UE4
Umask: 0077
State: S (sleeping)
Tgid: 31530
Ngid: 0
Pid: 31530
PPid: 698
TracerPid: 0
Uid: 10513 10513 10513 10513
Gid: 10513 10513 10513 10513
FDSize: 256
Groups: 3001 3002 3003 9997 20513 50513
VmPeak: 8234340 kB // 虚拟地址空间峰值
VmSize: 8072764 kB // 虚拟地址空间大小
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 542204 kB
VmRSS: 480152 kB
RssAnon: 193292 kB
RssFile: 285684 kB
RssShmem: 1176 kB
VmData: 1922072 kB
VmStk: 8192 kB
VmExe: 28 kB
VmLib: 332512 kB
VmPTE: 2840 kB
VmSwap: 8408 kB
CoreDumping: 0
Threads: 117 // 共创建117个线程
SigQ: 0/29011
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000080001204
SigIgn: 0000000000001001
SigCgt: 0000000e400084f8
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000000000000000
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 2
Speculation_Store_Bypass: thread vulnerable
Cpus_allowed: ff
Cpus_allowed_list: 0-7
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 154686
nonvoluntary_ctxt_switches: 20269
adb shell cat /proc/15592/mountinfo // 查看pid为15592的进程的挂载信息
12255 12254 252:5 / / ro,relatime master:1 - ext4 /dev/block/dm-5 ro,seclabel,discard
12256 12255 0:17 / /dev rw,nosuid,relatime master:2 - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755
12257 12256 0:18 / /dev/pts rw,relatime master:3 - devpts devpts rw,seclabel,mode=600,ptmxmode=000
12258 12256 0:23 / /dev/blkio rw,nosuid,nodev,noexec,relatime master:15 - cgroup none rw,blkio
12259 12256 0:24 / /dev/cg2_bpf rw,nosuid,nodev,noexec,relatime master:16 - cgroup2 none rw
12260 12256 0:25 / /dev/cpuctl rw,nosuid,nodev,noexec,relatime master:17 - cgroup none rw,cpu
12261 12256 0:27 / /dev/cpuset rw,nosuid,nodev,noexec,relatime master:19 - cgroup none rw,cpuset,noprefix,release_agent=/sbin/cpuset_release_agent
12262 12256 0:28 / /dev/freezer rw,nosuid,nodev,noexec,relatime master:20 - cgroup none rw,freezer
12263 12256 0:29 / /dev/memcg rw,nosuid,nodev,noexec,relatime master:21 - cgroup none rw,memory
12264 12256 0:30 / /dev/stune rw,nosuid,nodev,noexec,relatime master:22 - cgroup none rw,schedtune
12265 12256 0:31 / /dev/binderfs rw,relatime master:26 - binder binder rw,max=1048576,stats=global
12266 12256 8:13 / /dev/logfs rw,noatime master:39 - vfat /dev/block/bootdevice/by-name/logfs rw,uid=1000,gid=1000,fmask=0006,dmask=0006,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
12267 12256 0:37 / /dev/usb-ffs/adb rw,relatime master:43 - functionfs adb rw
12268 12256 0:38 / /dev/ffs-diag rw,relatime master:44 - functionfs diag rw
12269 12256 0:39 / /dev/ffs-diag-1 rw,relatime master:45 - functionfs diag_mdm rw
12270 12256 0:40 / /dev/ffs-diag-2 rw,relatime master:46 - functionfs diag_mdm2 rw
12271 12255 0:5 / /proc rw,relatime master:4 - proc proc rw,gid=3009,hidepid=2
12272 12255 0:19 / /sys rw,relatime master:5 - sysfs sysfs rw,seclabel
12273 12272 0:15 / /sys/fs/selinux rw,relatime master:6 - selinuxfs selinuxfs rw
12274 12272 0:9 / /sys/kernel/tracing rw,relatime master:23 - tracefs tracefs rw,seclabel
12275 12272 0:6 / /sys/kernel/debug rw,relatime master:24 - debugfs debugfs rw,seclabel
12276 12275 0:9 / /sys/kernel/debug/tracing rw,relatime master:30 - tracefs tracefs rw,seclabel
12277 12272 0:32 / /sys/fs/fuse/connections rw,relatime master:27 - fusectl none rw
12278 12272 0:33 / /sys/fs/bpf rw,nosuid,nodev,noexec,relatime master:28 - bpf bpf rw
12279 12272 0:34 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime master:29 - pstore pstore rw,seclabel
12280 12272 0:35 / /sys/fs/cgroup rw,relatime master:31 - tmpfs none rw,seclabel,size=3894116k,nr_inodes=973529,mode=750,gid=1000
12281 12280 0:29 / /sys/fs/cgroup/memory rw,relatime master:32 - cgroup none rw,memory
12282 12280 0:28 / /sys/fs/cgroup/freezer rw,relatime master:33 - cgroup none rw,freezer
12283 12255 0:20 / /mnt rw,nosuid,nodev,noexec,relatime master:7 - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755,gid=1000
12284 12283 0:20 /user /mnt/installer rw,nosuid,nodev,noexec,relatime master:13 - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755,gid=1000
12285 12284 0:74 / /mnt/installer/0/emulated rw,nosuid,nodev,noexec,noatime master:50 - fuse /dev/fuse rw,lazytime,user_id=0,group_id=0,allow_other
12286 12285 0:73 /0/Android/data /mnt/installer/0/emulated/0/Android/data rw,nosuid,nodev,noexec,noatime master:51 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
12287 12285 0:73 /0/Android/obb /mnt/installer/0/emulated/0/Android/obb rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=7,derive_gid,default_normal,unshared_obb
12288 12283 0:20 /user /mnt/androidwritable rw,nosuid,nodev,noexec,relatime master:14 - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755,gid=1000
12289 12288 0:74 / /mnt/androidwritable/0/emulated rw,nosuid,nodev,noexec,noatime master:49 - fuse /dev/fuse rw,lazytime,user_id=0,group_id=0,allow_other
12290 12289 0:73 /0/Android/data /mnt/androidwritable/0/emulated/0/Android/data rw,nosuid,nodev,noexec,noatime master:52 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
12291 12289 0:73 /0/Android/obb /mnt/androidwritable/0/emulated/0/Android/obb rw,nosuid,nodev,noexec,noatime master:54 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
12292 12283 259:6 / /mnt/vendor/persist rw,nosuid,nodev,noatime master:35 - ext4 /dev/block/bootdevice/by-name/persist rw,seclabel
12293 12283 0:73 / /mnt/runtime/default/emulated rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
12294 12283 0:73 / /mnt/runtime/read/emulated rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=23,derive_gid,default_normal,unshared_obb
12295 12283 0:73 / /mnt/runtime/write/emulated rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=7,derive_gid,default_normal,unshared_obb
12296 12283 0:73 / /mnt/runtime/full/emulated rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=7,derive_gid,default_normal,unshared_obb
12297 12283 0:74 / /mnt/user/0/emulated rw,nosuid,nodev,noexec,noatime master:48 - fuse /dev/fuse rw,lazytime,user_id=0,group_id=0,allow_other
12298 12297 0:73 /0/Android/data /mnt/user/0/emulated/0/Android/data rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
12299 12297 0:73 /0/Android/obb /mnt/user/0/emulated/0/Android/obb rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
12300 12283 0:73 / /mnt/pass_through/0/emulated rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=7,derive_gid,default_normal,unshared_obb
12301 12255 259:2 / /metadata rw,nosuid,nodev,noatime master:8 - ext4 /dev/block/by-name/metadata rw,seclabel,discard
12302 12255 252:6 / /system_ext ro,relatime master:9 - ext4 /dev/block/dm-6 ro,seclabel,discard
12303 12255 252:7 / /product ro,relatime master:10 - ext4 /dev/block/dm-7 ro,seclabel,discard
12304 12255 252:8 / /vendor ro,relatime master:11 - ext4 /dev/block/dm-8 ro,seclabel,discard
12418 12304 259:54 / /vendor/firmware_mnt ro,relatime master:36 - vfat /dev/block/bootdevice/by-name/modem ro,context=u:object_r:firmware_file:s0,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname=lower,errors=remount-ro
12419 12304 259:52 / /vendor/dsp ro,nosuid,nodev,relatime master:37 - ext4 /dev/block/bootdevice/by-name/dsp ro,seclabel
12420 12304 259:38 / /vendor/bt_firmware ro,relatime master:38 - vfat /dev/block/bootdevice/by-name/bluetooth ro,context=u:object_r:bt_firmware_file:s0,uid=1002,gid=3002,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname=lower,errors=remount-ro
12421 12255 252:9 / /odm ro,relatime master:12 - ext4 /dev/block/dm-9 ro,seclabel,discard
12422 12255 0:21 / /apex rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755
12423 12422 7:48 / /apex/com.android.conscrypt@300000000 ro,nodev,noatime - ext4 /dev/block/loop6 ro,dirsync,seclabel
12424 12422 7:48 / /apex/com.android.conscrypt ro,nodev,noatime - ext4 /dev/block/loop6 ro,dirsync,seclabel
12425 12422 7:56 / /apex/com.android.extservices@300000000 ro,nodev,noatime - ext4 /dev/block/loop7 ro,dirsync,seclabel
12426 12422 7:56 / /apex/com.android.extservices ro,nodev,noatime - ext4 /dev/block/loop7 ro,dirsync,seclabel
12427 12422 7:64 / /apex/com.android.media.swcodec@300000000 ro,nodev,noatime - ext4 /dev/block/loop8 ro,dirsync,seclabel
12428 12422 7:64 / /apex/com.android.media.swcodec ro,nodev,noatime - ext4 /dev/block/loop8 ro,dirsync,seclabel
12429 12422 7:72 / /apex/com.android.resolv@300000000 ro,nodev,noatime - ext4 /dev/block/loop9 ro,dirsync,seclabel
12430 12422 7:72 / /apex/com.android.resolv ro,nodev,noatime - ext4 /dev/block/loop9 ro,dirsync,seclabel
12431 12422 7:80 / /apex/com.android.vndk.v30@1 ro,nodev,noatime - ext4 /dev/block/loop10 ro,dirsync,seclabel
12432 12422 7:80 / /apex/com.android.vndk.v30 ro,nodev,noatime - ext4 /dev/block/loop10 ro,dirsync,seclabel
12433 12422 7:88 / /apex/com.android.sdkext@300000000 ro,nodev,noatime - ext4 /dev/block/loop11 ro,dirsync,seclabel
12434 12422 7:88 / /apex/com.android.sdkext ro,nodev,noatime - ext4 /dev/block/loop11 ro,dirsync,seclabel
12435 12422 7:96 / /apex/com.android.runtime@1 ro,nodev,noatime - ext4 /dev/block/loop12 ro,dirsync,seclabel
12436 12422 7:96 / /apex/com.android.runtime ro,nodev,noatime - ext4 /dev/block/loop12 ro,dirsync,seclabel
12437 12422 7:104 / /apex/com.android.tethering@300000000 ro,nodev,noatime - ext4 /dev/block/loop13 ro,dirsync,seclabel
12438 12422 7:104 / /apex/com.android.tethering ro,nodev,noatime - ext4 /dev/block/loop13 ro,dirsync,seclabel
12439 12422 7:112 / /apex/com.android.adbd@300000000 ro,nodev,noatime - ext4 /dev/block/loop14 ro,dirsync,seclabel
12440 12422 7:112 / /apex/com.android.adbd ro,nodev,noatime - ext4 /dev/block/loop14 ro,dirsync,seclabel
12441 12422 7:120 / /apex/com.android.mediaprovider@301600000 ro,nodev,noatime - ext4 /dev/block/loop15 ro,dirsync,seclabel
12442 12422 7:120 / /apex/com.android.mediaprovider ro,nodev,noatime - ext4 /dev/block/loop15 ro,dirsync,seclabel
12443 12422 7:128 / /apex/com.android.ipsec@300000000 ro,nodev,noatime - ext4 /dev/block/loop16 ro,dirsync,seclabel
12444 12422 7:128 / /apex/com.android.ipsec ro,nodev,noatime - ext4 /dev/block/loop16 ro,dirsync,seclabel
12445 12422 7:136 / /apex/com.android.tzdata@300000000 ro,nodev,noatime - ext4 /dev/block/loop17 ro,dirsync,seclabel
12446 12422 7:136 / /apex/com.android.tzdata ro,nodev,noatime - ext4 /dev/block/loop17 ro,dirsync,seclabel
12447 12422 7:144 / /apex/com.android.art@1 ro,nodev,noatime - ext4 /dev/block/loop18 ro,dirsync,seclabel
12448 12422 7:144 / /apex/com.android.art ro,nodev,noatime - ext4 /dev/block/loop18 ro,dirsync,seclabel
12449 12422 7:152 / /apex/com.android.os.statsd@300000000 ro,nodev,noatime - ext4 /dev/block/loop19 ro,dirsync,seclabel
12450 12422 7:152 / /apex/com.android.os.statsd ro,nodev,noatime - ext4 /dev/block/loop19 ro,dirsync,seclabel
12451 12422 7:160 / /apex/com.android.wifi@300000000 ro,nodev,noatime - ext4 /dev/block/loop20 ro,dirsync,seclabel
12452 12422 7:160 / /apex/com.android.wifi ro,nodev,noatime - ext4 /dev/block/loop20 ro,dirsync,seclabel
12453 12422 7:168 / /apex/com.android.neuralnetworks@300000000 ro,nodev,noatime - ext4 /dev/block/loop21 ro,dirsync,seclabel
12454 12422 7:168 / /apex/com.android.neuralnetworks ro,nodev,noatime - ext4 /dev/block/loop21 ro,dirsync,seclabel
12455 12422 7:176 / /apex/com.android.media@300000000 ro,nodev,noatime - ext4 /dev/block/loop22 ro,dirsync,seclabel
12456 12422 7:176 / /apex/com.android.media ro,nodev,noatime - ext4 /dev/block/loop22 ro,dirsync,seclabel
12457 12422 7:184 / /apex/com.android.i18n@1 ro,nodev,noatime - ext4 /dev/block/loop23 ro,dirsync,seclabel
12458 12422 7:184 / /apex/com.android.i18n ro,nodev,noatime - ext4 /dev/block/loop23 ro,dirsync,seclabel
12459 12422 7:192 / /apex/com.android.permission@300000000 ro,nodev,noatime - ext4 /dev/block/loop24 ro,dirsync,seclabel
12460 12422 7:192 / /apex/com.android.permission ro,nodev,noatime - ext4 /dev/block/loop24 ro,dirsync,seclabel
12461 12422 7:200 / /apex/com.android.apex.cts.shim@1 ro,nodev,noatime - ext4 /dev/block/loop25 ro,dirsync,seclabel
12462 12422 7:200 / /apex/com.android.apex.cts.shim ro,nodev,noatime - ext4 /dev/block/loop25 ro,dirsync,seclabel
12463 12255 0:22 / /linkerconfig rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755
12464 12463 0:22 /default /linkerconfig rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755
12465 12255 0:26 / /acct rw,nosuid,nodev,noexec,relatime master:18 - cgroup none rw,cpuacct
12466 12255 0:14 / /config rw,nosuid,nodev,noexec,relatime master:25 - configfs none rw
12467 12255 259:13 / /cache rw,nosuid,nodev,noatime master:34 - ext4 /dev/block/bootdevice/by-name/cache rw,seclabel
12468 12255 259:15 / /cust ro,nosuid,nodev,noatime master:40 - ext4 /dev/block/bootdevice/by-name/cust ro,seclabel
12469 12255 252:10 / /data rw,nosuid,nodev,noatime master:41 - f2fs /dev/block/dm-10 rw,lazytime,seclabel,background_gc=on,gc_merge,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,checkpoint_merge,fsync_mode=nobarrier
12470 12469 252:10 /data /data/user/0 rw,nosuid,nodev,noatime master:41 - f2fs /dev/block/dm-10 rw,lazytime,seclabel,background_gc=on,gc_merge,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,checkpoint_merge,fsync_mode=nobarrier
12471 12255 0:36 / /data_mirror rw,nosuid,nodev,noexec,relatime master:42 - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=700,gid=1000
12472 12471 252:10 /user /data_mirror/data_ce/null rw,nosuid,nodev,noatime master:41 - f2fs /dev/block/dm-10 rw,lazytime,seclabel,background_gc=on,gc_merge,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,checkpoint_merge,fsync_mode=nobarrier
12473 12472 252:10 /data /data_mirror/data_ce/null/0 rw,nosuid,nodev,noatime master:41 - f2fs /dev/block/dm-10 rw,lazytime,seclabel,background_gc=on,gc_merge,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,checkpoint_merge,fsync_mode=nobarrier
12474 12471 252:10 /user_de /data_mirror/data_de/null rw,nosuid,nodev,noatime master:41 - f2fs /dev/block/dm-10 rw,lazytime,seclabel,background_gc=on,gc_merge,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,checkpoint_merge,fsync_mode=nobarrier
12475 12471 252:10 /misc/profiles/cur /data_mirror/cur_profiles rw,nosuid,nodev,noatime master:41 - f2fs /dev/block/dm-10 rw,lazytime,seclabel,background_gc=on,gc_merge,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,checkpoint_merge,fsync_mode=nobarrier
12476 12255 0:20 /user/0 /storage rw,nosuid,nodev,noexec,relatime master:7 - tmpfs tmpfs rw,seclabel,size=3894116k,nr_inodes=973529,mode=755,gid=1000
12477 12476 0:74 / /storage/emulated rw,nosuid,nodev,noexec,noatime master:48 - fuse /dev/fuse rw,lazytime,user_id=0,group_id=0,allow_other
12478 12477 0:73 /0/Android/data /storage/emulated/0/Android/data rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
12479 12477 0:73 /0/Android/obb /storage/emulated/0/Android/obb rw,nosuid,nodev,noexec,noatime master:47 - sdcardfs /data/media rw,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb
adb shell cat /sys/devices/system/cpu/possible // 查看cpu的核数 返回0-7表示当前cpu为8核
adb shell df -h // 查看磁盘占用情况
Filesystem Size Used Avail Use% Mounted on /dev/block/dm-5 3.9G 3.9G 0 100% / tmpfs 3.7G 1.3M 3.7G 1% /dev tmpfs 3.7G 0 3.7G 0% /mnt /dev/block/dm-6 399M 397M 0 100% /system_ext /dev/block/dm-7 343M 342M 0 100% /product /dev/block/dm-8 1.7G 1.7G 0 100% /vendor /dev/block/dm-9 118M 956K 115M 1% /odm tmpfs 3.7G 0 3.7G 0% /apex none 3.7G 0 3.7G 0% /sys/fs/cgroup /dev/block/sda29 344M 10M 323M 3% /cache /dev/block/sda13 4.9M 320K 4.6M 7% /dev/logfs /dev/block/sda31 976M 763M 187M 81% /cust /dev/block/dm-10 107G 98G 9.2G 92% /data /dev/block/loop6 4.6M 4.6M 0 100% /apex/com.android.conscrypt@300000000 /dev/block/loop7 4.4M 4.3M 0 100% /apex/com.android.extservices@300000000 /dev/block/loop8 18M 18M 0 100% /apex/com.android.media.swcodec@300000000 /dev/block/loop9 2.3M 2.3M 0 100% /apex/com.android.resolv@300000000 /dev/block/loop10 108M 108M 0 100% /apex/com.android.vndk.v30@1 /dev/block/loop11 336K 304K 28K 92% /apex/com.android.sdkext@300000000 /dev/block/loop12 5.5M 5.4M 0 100% /apex/com.android.runtime@1 /dev/block/loop13 740K 712K 16K 98% /apex/com.android.tethering@300000000 /dev/block/loop14 7.5M 7.5M 0 100% /apex/com.android.adbd@300000000 /dev/block/loop15 3.2M 3.1M 0 100% /apex/com.android.mediaprovider@301600000 /dev/block/loop16 564K 536K 20K 97% /apex/com.android.ipsec@300000000 /dev/block/loop17 848K 820K 12K 99% /apex/com.android.tzdata@300000000 /dev/block/loop18 83M 83M 0 100% /apex/com.android.art@1 /dev/block/loop19 1.6M 1.6M 0 100% /apex/com.android.os.statsd@300000000 /dev/block/loop20 4.5M 4.5M 0 100% /apex/com.android.wifi@300000000 /dev/block/loop21 5.2M 5.2M 0 100% /apex/com.android.neuralnetworks@300000000 /dev/block/loop22 4.3M 4.3M 0 100% /apex/com.android.media@300000000 /dev/block/loop23 24M 24M 0 100% /apex/com.android.i18n@1 /dev/block/loop24 4.7M 4.7M 0 100% /apex/com.android.permission@300000000 /dev/block/loop25 232K 92K 136K 41% /apex/com.android.apex.cts.shim@1 /dev/fuse 107G 98G 9.2G 92% /storage/emulated
adb shell procrank // ①获取所有进程内存使用的排行榜(需root权限,否则会显示empty)②输出手机的整个内存使用信息
<empty>
ZRAM: 0K physical used for 464008K in swap (2097148K total swap)
RAM: 7806540K total, 2424876K free, 1268K buffers, 1432820K cached, 9952K shmem, 390424K slab
adb shell uname -a // 查看linux内核信息
Linux localhost 4.19.81-18334340 #1 SMP PREEMPT Wed Apr 1 20:04:36 KST 2020 aarch64
adb shell cat /proc/version // 查看更详细的linux内核信息
Linux version 4.19.81-18334340 (dpi@SWDH7011) (clang version 8.0.12 for Android NDK) #1 SMP PREEMPT Wed Apr 1 20:04:36 KST 2020
adb shell vmstat // 实时动态监视操作系统的虚拟内存和cpu活动
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 857988 482796 5916 4104428 1 3 114 169 0 1530 8 6 86 0
adb shell cat /sys/class/net/wlan0/address // 获取手机wlan mac地址
adb shell ping -c 8 175.27.203.116 // 对ip为175.27.203.116发出ping,共发8个数据包
PING 175.27.203.116 (175.27.203.116) 56(84) bytes of data.
64 bytes from 175.27.203.116: icmp_seq=1 ttl=47 time=65.5 ms
64 bytes from 175.27.203.116: icmp_seq=2 ttl=47 time=34.4 ms
64 bytes from 175.27.203.116: icmp_seq=3 ttl=47 time=47.4 ms
64 bytes from 175.27.203.116: icmp_seq=4 ttl=47 time=68.3 ms
64 bytes from 175.27.203.116: icmp_seq=5 ttl=47 time=75.0 ms
64 bytes from 175.27.203.116: icmp_seq=6 ttl=47 time=45.6 ms
64 bytes from 175.27.203.116: icmp_seq=7 ttl=47 time=49.0 ms
64 bytes from 175.27.203.116: icmp_seq=8 ttl=47 time=61.3 ms
--- 175.27.203.116 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7012ms
rtt min/avg/max/mdev = 34.478/55.880/75.077/12.873 ms
注:RTT(Round-Trip Time): 往返时延。是指数据从网络一端传到另一端再收到接收端确认所需的时间。通常,时延由发送时延、传播时延、排队时延、处理时延四个部分组成。
mdev(Mean Deviation): 表示CMP 包的 RTT 偏离平均值的程度,这个值越大说明你的网速越不稳定。
adb shell ping6 -c 8 www.baidu.com // 对ipv6为www.baidu.com发出ping,共发8个数据包
adb shell run-as com.tencent.tmgp.pubgm cat /proc/26218/limits // 查看pid为26218的进程限值
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 22097 22097 processes
Max open files 4096 4096 files
Max locked memory 67108864 67108864 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 22097 22097 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 40 40
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
adb shell cat /proc/sys/kernel/threads-max // 查看一个进程创建线程数目的上限 需要root权限
adb shell run-as com.tencent.tmgp.pubgm cat /proc/26218/maps // 查看pid为26218的进程的模块信息 注:在高版本android中,maps已被smaps取代,输出结果的可读性更好
adb shell run-as com.tencent.tmgp.pubgm cat /proc/26218/task/20438/status // 查看pid为26218的进程中的线程id为20438的详细信息
adb shell getprop | grep heapgrowthlimit // 查看单个应用的java虚拟机堆内存上限值
adb shell cat /system/build.prop | grep dalvik.vm // 另一种方法查看单个应用的java虚拟机堆内存上限值
dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存限制,
应用如果不想在dalvikheap达到heapgrowthlimit限制的时候出现OOM(Out Of Memory,OutOfMemoryError),
需要在Manifest中的application标签中声明android:largeHeap=“true”,
声明后应用dalvik heap达到heapsize的时候才会出现OOM
除了上面之外,还有以下情况也会出现OOM的报错:
① 超过Max open files限制
触发大量网络连接(每个连接处于独立的线程中)并保持,每打开一个socket都会增加一个fd(/proc/pid/fd下多一项)
注1:不只有这一种增加fd数的方式,也可以用其他方法,比如打开文件,创建handlerthread等等
注2:很多Android手机限制进程fd数量为1024个(新手机很多放开了fd ulimit数量)
② 线程数超限
③ 虚拟地址空间不足 // 对于armv7 32位游戏,总地址空间为4GB,用户空间为3GB
adb shell dumpsys meminfo com.tencent.tmgp.pubgm // 查看android设备上名为com.tencent.tmgp.pubgm应用的内存信息
VSS : Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS : Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS : Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS : Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
USS 是针对某个进程开始有可疑内存泄露的情况,是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放。不过USS需要通过root的手机
① Heap Size、Heap Alloc、Heap Free分别表示历史分配最大值、当前占用的值和释放的值
Native Heap为通过操作系统分配的内存(malloc分配的native对象 如第三方so调用malloc分配的内存,其中最大头是libgles*.so所分配的,它代表显卡driver层工作时分配的内存)
注:opengl是一个client-server架构,server指的是显卡那部分,client指的就是CPU这侧的dirver部分,
很多显示资源不只需要在server部分对应显存分配,同样需要消耗大量的client部分的driver内存。
例如去创建一个新的glbuffer,不管这个buffer实际上有多大,笔者在一些adreno机器上测试它在driver这块都需要分配固定的4096+284k的内存,
因为driver内部要维持一个渲染状态和结构。例如去map一个glbuffer,那么driver这边通常是需要malloc一个这个glbuffer大小的buffer出来,
用来接受你对map结果的写入,driver在合适的时机再同步给server那边的glbuffer。
所以gl的driver部分的内存是不可忽视的一大块,它就是我们前面将的那一节的nativeheap的gles的部分。
Dalvik Heap为通过虚拟机分配的内存 (java对象)
② Shared | Private表示内存是否被共享。被共享过则为Shared,否则为Private
Dirty | Clean表示内存是否被修改过。被修改过则为Dirty,否则为Clean
Shared Dirty:应用进程间共享的写时复制的内存。如:系统库在堆上申请的结构实例
Private Dirty:进程中不能被换出的内存,不与其他进程共享,当进程结束,这部分内存立刻被释放。如:应用在堆上分配的数据。
Shared Clean:共享代码段。如:系统库,boot.vdex、libboost.so
Private Clean:私有代码段。如:应用自己的库,class.dex、libUE4.so
Swap Dirty:基于性能考虑,Android系统不会将Dirty的内存交换到磁盘上,而是使用zram机制压缩部分Dirty不常用的物理内存。
③ Ashmem:/dev/ashmem 进程的匿名共享内存(Anonymous Shared Memory) 除了DVM以外通过asmmem_create_region函数申请的内存映射空间。如:SurfaceFlinger
Gfx dev:/dev/kgsl-3d0 显存。通常是gpu上资源,如:texture、buffer、shader。pmap中显存mmap映射文件(adreno上是kgsl-3d0这个文件)的pss部分
注:android上显存的管理和内存不一样,不是采用虚拟内存映射,缺页后再调入物理内存,而是虚存vs有多大,就直接为其分配多大的物理内存。
Other dev:/dev/* 如:Android属性系统服务和进程间通信的binder机制所用到的设备文件内存映射
.so mmap:so动态链接库 如:/system/lib64/libstdc++.so
.jar mmap:java动态链接库 如:/system/framework/framework.jar
.apk mmap:apk映射 如: /system/framework/framework-res.apk
.ttf mmap:字库 如:/system/fonts/Roboto-BlackItalic.ttf
.dex mmap:dex字节码 如:/system/framework/boot.vdex
.oat mmap:oat机器码 如:/system/framework/arm64/boot-ext.oat
.art mmap:art字节码 如:/system/framework/arm64/boot.art
Other mmap:其他非匿名内存映射的内容。如:Android框架动态链接库/system/framework/*.odex、unicode编码动态链接库/system/usr/*.dat、
[vectors]ARM特有的东西、代码段/system/bin/app_process、运行时链接器/system/bin/linker
EGL mtrack:大概为3个RT的内存大小。例如backbuffer就是从窗口系统中分配的
GL mtrack:显存。只有较新的设备有,统计了那些pss映射为0的部分的vss大小。如果当前android系统不统计该项,可以自己去pmap里面累加
例如:Mali芯片上的这部分显存如下
start end virtual shared shared private private
addr addr size RSS PSS clean dirty clean dirty swap swapPSS object
-------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- ------------------------------
。。。 。。。
5efd83f000 5efd840000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd840000 5efd842000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd842000 5efd844000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd844000 5efd846000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd846000 5efd866000 128 0 0 0 0 0 0 0 0 /dev/mali0
5efd866000 5efd886000 128 0 0 0 0 0 0 0 0 /dev/mali0
5efd886000 5efd8c6000 256 0 0 0 0 0 0 0 0 /dev/mali0
5efd8c6000 5efd906000 256 0 0 0 0 0 0 0 0 /dev/mali0
5efd906000 5efd946000 256 0 0 0 0 0 0 0 0 /dev/mali0
5efd946000 5efd947000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd947000 5efd94a000 12 0 0 0 0 0 0 0 0 /dev/mali0
5efd94a000 5efd94c000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd94c000 5efd94e000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd94e000 5efd94f000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd94f000 5efd950000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd950000 5efd951000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd951000 5efd952000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd952000 5efd954000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd955000 5efd956000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd956000 5efd958000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd958000 5efd95a000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd95a000 5efd95c000 8 0 0 0 0 0 0 0 0 /dev/mali0
5efd95c000 5efd95d000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efd95d000 5efd97d000 128 0 0 0 0 0 0 0 0 /dev/mali0
5efd97d000 5efd9be000 260 0 0 0 0 0 0 0 0 /dev/mali0
5efd9be000 5efda00000 264 0 0 0 0 0 0 0 0 /dev/mali0
5efda00000 5efde41000 4356 0 0 0 0 0 0 0 0 /dev/mali0
5efde41000 5efde42000 4 0 0 0 0 0 0 0 0 /dev/mali0
5efde42000 5efde43000 4 0 0 0 0 0 0 0 0 /dev/mali0
。。。 。。。
-------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- ------------------------------
start end virtual shared shared private private
addr addr size RSS PSS clean dirty clean dirty swap swapPSS object
-------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- ------------------------------
57473904 1595296 1474697 122748 18152 157280 1297116 9772 263 TOTAL
Unknown:匿名内存映射:图形驱动、窗口surfaces、音频缓冲、mmap方式的内存分配。UE的FMalloc分配的内存就在这一块。
④ Java Heap:Dalvik Heap(Private Dirty) // 包含任何写过zygote分配的页面(应用是从zygote fork 出来的)和应用本身分配的。
+ .art mmap(Private Dirty & Private Clean) // 应用的bootimage,任何private页面也算在应用上。
Native Heap:Native Heap(Private Dirty) // 通过libc_malloc库分配的大小
Code:.所有私有静态资源求和
= so mmap(Private Dirty & Private Clean) + .jar mmap(Private Dirty & Private Clean) + .apk mmap(Private Dirty & Private Clean)
+ .ttf mmap(Private Dirty & Private Clean)+ .dex mmap(Private Dirty & Private Clean)+ .oat mmap(Private Dirty & Private Clean)
Stack:Stack(Private Dirty) // 进程栈占用的大小
Graphics:进程在GPU上分配的内存
= Gfx dev(Private Dirty & Private Clean) + .EGL mtrack(Private Dirty & Private Clean) + GL mtrack(Private Dirty & Private Clean)
Private Other: Dalvik Other(Private Dirty & Private Clean) + .Ashmem(Private Dirty & Private Clean) + Other dev(Private Dirty & Private Clean)
+ Other mmap(Private Dirty & Private Clean)+ Unknown(Private Dirty & Private Clean)
System:Pss Total - Java Heap - Native Heap - Code - Stack - Graphics - Private Other
cat /d/kgsl/proc/30968/mem | grep ion // 查看pid为30968的Graphic相关的内存数据 注:需root权限
adb shell run-as com.tencent.mf.uam cat /proc/10894/smaps // 查看pid为10894的完整内存映射信息
。。。 。。。 720a01a000-7b4a01a000 rw-p 00000000 00:00 0 // mmap分配的内存 UE4动态分配的内存都在这里 Size: 38797312 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 247968 kB Pss: 247968 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 247968 kB Referenced: 247680 kB Anonymous: 247968 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me ac 。。。 。。。 7b4b01a000-7b4edaa000 r--p 00000000 fc:08 183957 /data/app/com.tencent.mf.uam-zQVu9J7hHvicOOOfnXqy0w==/lib/arm64/libUE4.so // libUE4.so从开头到代码段的所有内容(含只读数据段 .rodata) // 全局变量 const static FLinearColor DefaultForeground = FLinearColor(0.72f, 0.72f, 0.72f, 1.f); // 局部变量 const char* ConstValue = "Test!"; Size: 63040 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 38208 kB Pss: 38208 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 38208 kB Private_Dirty: 0 kB Referenced: 38208 kB Anonymous: 0 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd mr mw me 7b4edaa000-7b554e3000 r-xp 03d90000 fc:08 183957 /data/app/com.tencent.mf.uam-zQVu9J7hHvicOOOfnXqy0w==/lib/arm64/libUE4.so // 代码段 .text Size: 105700 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 93668 kB Pss: 93668 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 93664 kB Private_Dirty: 4 kB Referenced: 93668 kB Anonymous: 4 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd ex mr mw me 7b554e3000-7b5623d000 r--p 0a4c9000 fc:08 183957 /data/app/com.tencent.mf.uam-zQVu9J7hHvicOOOfnXqy0w==/lib/arm64/libUE4.so // libUE4.so从代码段与数据段之间的所有内容(.plt、.data.rel.ro、.fini_array、.init_array、.dynamic、.got、.got.plt) Size: 13672 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 13672 kB Pss: 13672 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 13672 kB Referenced: 13672 kB Anonymous: 13672 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd mr mw me ac 7b5623d000-7b56265000 rw-p 0b223000 fc:08 183957 /data/app/com.tencent.mf.uam-zQVu9J7hHvicOOOfnXqy0w==/lib/arm64/libUE4.so // 数据段 .data 被赋初值的全局变量、static全局变量、static局部变量存放在这里 // uint32 GFrameNumber = 1; // static int32 MaxDepthBuckets = 10; Size: 160 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 156 kB Pss: 156 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 28 kB Private_Dirty: 128 kB Referenced: 156 kB Anonymous: 128 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me ac 7b56265000-7b56778000 rw-p 00000000 00:00 0 [anon:.bss] // bss段 未赋初值或赋初值为0的全局变量、static全局变量、static局部变量存放在这里 // uint64 GFrameCounter = 0; Name: [anon:.bss] Size: 5196 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 3780 kB Pss: 3780 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 3780 kB Referenced: 3740 kB Anonymous: 3780 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me ac 。。。 。。。 7b5d258000-7b5d352000 rw-p 00000000 00:00 0 // GameThread栈 Size: 1000 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 244 kB Pss: 244 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 244 kB Referenced: 244 kB Anonymous: 244 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me nr 。。。 。。。 7b5d723000-7b5d786000 rw-p 00000000 00:00 0 // TaskGraph栈 Size: 396 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 48 kB Pss: 48 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 48 kB Referenced: 48 kB Anonymous: 48 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me nr 。。。 。。。 7b5da00000-7b5da23000 rw-p 00000000 00:00 0 // PoolThread栈 Size: 140 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 8 kB Pss: 8 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 8 kB Referenced: 8 kB Anonymous: 8 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me nr 。。。 。。。 7bc7000000-7bc7400000 rw-p 00000000 00:00 0 [anon:libc_malloc] // malloc分配的堆内存 注:有多个 // volatile int32* MallocValue = (int32*)malloc(10 * sizeof(int32)); Name: [anon:libc_malloc] Size: 4096 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 2184 kB Pss: 2184 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 2184 kB Referenced: 2168 kB Anonymous: 2184 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 0 kB SwapPss: 0 kB Locked: 0 kB VmFlags: rd wr mr mw me ac 。。。 。。。
/****** VmFlags说明 ******/
rd : readable
wr : writeable
ex : executable
sh : shared
mr : may read
mw : may write
me : may execute
ms : may share
gd : stack segment growns down
pf : pure PFN range
dw : disabled write to the mapped file
lo : pages are locked im memory
io : memroy mapped I/O area
sr : sequential read advise provided
rr : random read advise provided
dc : do not copy area on fork
de : do not expand area on remapping
ac : area is accountable
nr : swap space is not reserved for the area
ht : area uses huge tlb pages
nl : non-linear mapping
ar : architecture specific flag
dd : do not include area into core dump
mm : mixed map area
hg : huge page advise flag
adb shell dumpsys SurfaceFlinger // 显示android设备的Surface信息
adb shell dumpsys SurfaceFlinger --list // 显示android设备的获取可视窗口列表
adb shell "dumpsys SurfaceFlinger | grep GLES" // 查看当前设备GLES的驱动
GLES: Qualcomm, Adreno (TM) 650, OpenGL ES 3.2 V@444.0 (GIT@3a8b3d7, I6821cfa820, 1582112224) (Date:02/19/20)
adb shell dumpsys SurfaceFlinger | grep com.tencent.tmgp.pubgm // 获取com.tencent.tmgp.pubgm的Surface信息
adb shell dumpsys SurfaceFlinger --latency com.tencent.tmgp.pubgm/com.epicgames.ue4.GameActivity // 获取com.tencent.tmgp.pubgm应用的帧时延数据
第1行为设备本身固有的帧耗时,单位为ns,通常在16.7ms左右
从第2行开始,分为3列,一共有127行,代表每一帧的几个关键时刻,单位也为ns
第1列t1: when the app started to draw (开始绘制图像的瞬时时间)
第2列t2: the vsync immediately preceding SF submitting the frame to the h/w (VSYNC信令将软件SF帧传递给硬件HW之前的垂直同步时间)
第3列t3: timestamp immediately after SF submitted that frame to the h/w (SF将帧传递给HW的瞬时时间,及完成绘制的瞬时时间)
将第i行和第i-1行t2相减,即可得到第i帧的绘制耗时
16666666
0 0 0
0 0 0
... ...
0 0 0
418243456489096 418243468251857 418243457645242
418243480331232 418243484980451 418243481196024
418243577706857 418243585352586 418243579044565
418318173790110 418318176869276 418318174024745
418326274237294 418326288588388 418326275332919
adb shell dumpsys gfxinfo com.tencent.tmgp.pubgm // 查看android设备上名为com.tencent.tmgp.pubgm应用的图形信息
// 注:开发者选项中有个“ GPU呈现模式分析(ProfileGPU rendering)”功能,在开启该功能后,系统就会记录保留每个界面最后128帧图像绘制的相关时间信息
adb shell dumpsys batterystats com.tencent.tmgp.pubgm >d:\b1.log // 获取单个应用的电量消耗信息,并写入到d:\b1.log文件中
// 可通过google编写的historian.py脚本把数据信息转换为可读性很好的html文件,类似TraceView生成的列表数据
// python historian.py xxx.txt > xxx.html
adb shell dumpsys battery // 打印出电池状态
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
Max charging current: 500000
Max charging voltage: 5000000
Charge counter: 2714000
status: 5
health: 2
present: true
level: 100
scale: 100
voltage: 4312
temperature: 295
technology: Li-poly
adb shell dumpsys battery set ac 1 // 设置为ac充电
adb shell dumpsys battery set usb 1 // 设置为usb充电
adb shell dumpsys battery set wireless 1 // 设置为无线网络充电
adb shell dumpsys battery set status 2 // 设置电池为充电状态
adb shell dumpsys battery set status 1 // 设置电池为非充电状态
adb shell dumpsys battery set level 75 // 设置电量百分比为75%
adb shell dumpsys battery unplug // 设置断开充电
adb shell dumpsys battery reset // 复位(恢复实际状态)
adb shell dumpsys procstats com.tencent.tmgp.pubgm // 输出系统内存使用、Pre Package统计、App进程信息、运行时间统计、内存使用统计、PSS收集统计等
adb shell dumpsys statusbar // 查看那些应用占据了状态栏
adb shell dumpsys activity a // 查看activity详细信息
adb shell dumpsys input | grep Focus // 查看焦点窗口
adb shell dumpsys window windows // 查看所有windows信息
adb shell dumpsys window windows | findstr /i "mCurrent" // 获得当前活动窗口的信息
adb shell dumpsys cpuinfo // 获取最近约2分钟的进程的cpu Load占用信息
Load: 0.0 / 0.0 / 0.0
CPU usage from 191593ms to 83022ms ago (2022-06-27 14:36:18.456 to 2022-06-27 14:38:07.027):
54% 15592/com.tencent.mf.uamty: 30% user + 23% kernel / faults: 141758 minor
18% 1027/surfaceflinger: 11% user + 7.3% kernel / faults: 2 minor
14% 1463/media.codec: 4.4% user + 10% kernel / faults: 95 minor
7.3% 12376/app_process: 4.2% user + 3.1% kernel / faults: 1079 minor
6.5% 1020/audioserver: 3.9% user + 2.5% kernel
6.5% 944/android.hardware.sensors@1.0-service: 2.1% user + 4.4% kernel
。。。 。。。
22% TOTAL: 9.3% user + 10% kernel + 0% iowait + 2.5% irq + 0.2% softirq
adb shell cat /sys/class/thermal/thermal_zone0/temp // 查看当前手机的温度
adb shell sqlite3 // 在运行的android设备中执行shell命令(sqlite3:进入sqlite数据库)
adb shell cd /data/local;ls // 在运行的android设备中执行shell命令(先执行cd /data/local,再执行ls命令)
adb shell su -c 'cp /sdcard/libUE4.so /data/app/com.tencent.tmgp.pubgm-1/lib/arm/libUE4.so' // 使用root权限将手机/sdcard目录中libUE4.so拷贝到/data/app/com.tencent.tmgp.pubgm-1/lib目录中
adb forward tcp:6100 tcp:7100 // 建立从主机端口6100到Android设备端口7100的转发
adb bugreport // 获取相关手机相关的数据(包含tombstone崩溃堆栈、anr卡死等)并打zip包,用于定位问题 注:bugreport-umi-RKQ1.200826.002-2022-06-27-14-46-51.txt中包含很多有效信息
/data/user_de/0/com.android.shell/files/bugreports/bugrepo...le pulled, 0 skipped. 38.7 MB/s (18181185 bytes in 0.448s)
Bug report copied to C:\Users\kekec\bugreport-umi-RKQ1.200826.002-2022-06-27-14-46-51.zip
adb shell getprop // 查看手机设备等信息
adb shell getprop ro.build.version.release // 获取当前Android手机的系统版本 如返回:9 // 当前手机系统为Android 9
adb shell getprop ro.build.version.sdk // 获取当前Android手机的API版本 如返回:28 // 当前手机的API版本为28
adb shell input keyevent 3 // 返回手机桌面
adb shell input keyevent 26 // 点亮手机屏幕
adb shell input text "stat\ fps" // 向手机光标所在的输入框,输入stat fps文本
adb logcat -c // 清除缓存区中日志
adb logcat // 显示所有日志
adb logcat -g // 查看logcat各类型缓冲区大小
main: ring buffer is 2 MiB (1 MiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 4 MiB (3 MiB consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 1 MiB (237 KiB consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 2 MiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
adb logcat -G 100M // 设置logcat各类型缓冲区大小为100M
main: ring buffer is 100 MiB (2 MiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 100 MiB (3 MiB consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 100 MiB (237 KiB consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 100 MiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
adb logcat *:V // 详细模式显示所有日志
// V — 详细(最低优先级)
// D — 调试
// I — 信息(缺省)
// W — 警告
// E — 错误
// F — 致命
// S — 静默(最高优先级,不会打印任何内容)
adb logcat -v time -s Test > d:\ww1.log // 打印出log信息中的时间并且包含关键字 “Test” 的所有log以覆盖写的方式输出到d:\ww1.log文件中
adb logcat UE4:V DEBUG:V *:S -v tag // 过滤TAG为UE4输出级别大于V的日志与TAG为DEBUG输出级别大于V的日志,同时输出tag内容
方法 | 说明 |
Log.v(String tag,String text) | 显示全部(vervbose)信息 |
Log.d(String tag,String text) | 显示调试(debug)信息 |
Log.i(String tag,String text) | 显示一般(information)信息 |
Log.w(String tag,String text) | 显示警告(waning)信息 |
Log.e(String tag,String text) | 显示错误(error)信息 |
adb logcat --buffer=crash // 输出crash信息到控制台
设置Android Studio的Logcat面板日志的缓存大小:
注:将cycle buffer size从1024KB设置为102400KB,设置后要重启Android Studio才能生效
adb -s RW9H8LJZDYEUWCV4 logcat >d:\ww1.log // 连接ID码为RW9H8LJZDYEUWCV4的设备,并将log输出到d:\ww1.log文件中
adb shell dumpsys package com.tencent.tmgp.pubgm // 查看app相关所有信息,包括action,codepath,version,需要的权限等等信息
adb shell dumpsys package com.tencent.mf.uam | findstr version // 查看com.tencent.mf.uam版本相关信息
versionCode=574777 minSdk=21 targetSdk=26
versionName=0.1.0.8695
signatures=PackageSignatures{e850c33 version:2, signatures:[ffc40c2f], past signatures:[]}
aapt dump badging NZGame-Android-Shipping-armv7-es2.apk // 查看NZGame-Android-Shipping-armv7-es2.apk版本号、权限等详细信息(版本号为:$versionName$.$versionCode$)
aapt dump badging NZGame-armv7-es2.apk | grep -c application-debuggable // 查看NZGame-armv7-es2.apk是否可调式(debuggable) 1表示可调式,0为不可调式
AndroidManifest.xml中application标签中将debuggable设为true
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<application android:debuggable="true" ...>
adb shell pm path com.tencent.tmgp.pubgm // 查看app的安装路径
adb shell "am broadcast -a android.intent.action.RUN -e cmd 'stat fps'" // 向设备发送一条广播,内容为stat fps 在ue4中用来执行控制台命令(非shipping包,详见逻辑见:epicgames\ue4\ConsoleCmdReceiver.java)
adb shell am broadcast后面的参数有:
[-a <ACTION>]
[-d <DATA_URI>]
[-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e | --es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e | --ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>]
[-f <FLAGS>] [<URI>]
adb shell chmod 777 /data/local/tmp/gdbserver // 为gdbserver增加可执行权限
adb shell su -c 'chmod 777 /data/data/com.tencent.tmgp.pubgm/gdbserver' // 使用root为gdbserver增加可执行权限
adb shell run-as com.tencent.tmgp.pubgm // 进入应用的私有目录:/data/data/com.tencent.tmgp.pubgm
adb shell run-as com.tencent.tmgp.pubgm ls -li /data/data/com.tencent.tmgp.pubgm
// com.tencent.tmgp.pubgm(app必须是debuggable)不需要root权限情况下,查看自己私有目录下的文件信息
adb shell "ls -lpqAR /storage/emulated/0 | grep -E 'sdcard_rw|/storage/emulated/0'" > G:\sdcard3.txt // 递归打印/storage/emulated/0(即:/sdcard)下的文件到G:\sdcard3.txt文件中
adb shell run-as com.tencent.tmgp.pubgm killall -9 gdbserver // 结束所有名为gdbserver的进程
adb shell run-as com.tencent.tmgp.pubgm ls -l /proc/9122/fd // 列出com.tencent.tmgp.pubgm进程(pid为9122)打开的文件列表(句柄数)
adb shell ulimit -n // 查看当前系统下进程的句柄数上限
adb devices // 查看正在运行的android设备
adb -s emulator-5554 install d:\helloWorld.apk // 安装d盘下的helloWorld.apk文件到名为emulator-5554的android设备中
adb shell am force-stop com.tencent.tmgp.pubgm // 结束所有用户空间下的包名com.tencent.tmgp.pubgm相关的信息
adb shell am dumpheap com.tencent.tmgp.pubgm /data/local/tmp/test.hprof // 保存com.tencent.tmgp.pubgm的java虚拟机内存文件test.hprof到/data/local/tmp目录中
adb shell mv /data/local/tmp/test.hprof /storage/emulated/0/Download // 移动test.hprof文件到内置sd卡的Download目录中,然后连上数据线就可以拷贝到电脑中
hprof-conv D:\temp\test.hprof D:\com.tencent.tmgp.pubgm_mat.hprof // 转换hprof文件为MemoryAnalyzer工具能解析的hprof文件格式 注:hprof-conv在android-sdk-windows\platform-tools目录中
adb shell screencap -p /sdcard/screen.png // 截屏并screen.png并保存到手机的/sdcard目录下
adb pull /sdcard/screen.png ./ // 将手机的/sdcard/screen.png拷贝到PC上的当前目录
adb shell rm /sdcard/screen.png // 删除手机的/sdcard/screen.png文件
adb shell screenrecord --time-limit 10 --size 1280x720 --bit-rate 6000000 /sdcard/demo.mp4 //录制一个名为demo.mp4分辨率为1280*720比特率为6Mbps的10s视频,并保存在手机的/sdcard目录下
注1:支持Android4.4(API level 19)以上
注2:默认录制时间为180s,默认使用手机的分辨率,默认比特率为4Mbps
注3:某些设备可能无法直接录制,原因是分辨率太高,如果遇到此类问题,请试着指定较低的分辨率
注4:不支持录制过程中屏幕旋转,如果录制过程中旋转,有可能画面被切断
注5:录制视频的时候声音不会被录下来
// 查看pid为31530,应用为com.tencent.mf.uam过滤信息为Address或libUE4.so或[stack]或----------------或total的内存映射信息
run-as com.tencent.mf.uam pmap -x 31530 | grep -E 'Address|libUE4.so|\[stack\]|----------------|total'
// 查看pid为31530,应用为com.tencent.mf.uam过滤信息为libUE4.so或[stack]的内存映射信息
run-as com.tencent.mf.uam cat /proc/31530/maps | grep -E 'libUE4.so|\[stack\]'
// 查看pid为8027,应用为com.tencent.mf.uam过滤信息为start或addr或--------或libUE4.so或[stack]或TOTAL的内存映射信息
run-as com.tencent.mf.uam showmap -a 8027 | grep -E 'start|addr|--------|libUE4.so|\[stack\]|TOTAL'
// 查看pid为31530,应用为com.tencent.mf.uam过滤信息为COMMAND或libUE4.so或.log或socket的文件信息
run-as com.tencent.mf.uam lsof -p 31530 | grep -E 'COMMAND|libUE4.so|\.log|socket'
adb shell export // 查看当前手机的所有系统级环境变量
ANDROID_ASSETS
ANDROID_BOOTLOGO
ANDROID_DATA
ANDROID_ROOT
ANDROID_RUNTIME_ROOT
ANDROID_SOCKET_adbd
ANDROID_STORAGE
ANDROID_TZDATA_ROOT
ASEC_MOUNTPOINT
BOOTCLASSPATH
DEX2OATBOOTCLASSPATH
DOWNLOAD_CACHE
EXTERNAL_STORAGE
HOME
HOSTNAME
LOGNAME
PATH
SHELL
SYSTEMSERVERCLASSPATH
TERM
TMPDIR
USER
adb shell set // 查看当前手机的所有系统级环境变量及其数值
ANDROID_ASSETS=/system/app
ANDROID_BOOTLOGO=1
ANDROID_DATA=/data
ANDROID_ROOT=/system
ANDROID_RUNTIME_ROOT=/apex/com.android.runtime
ANDROID_SOCKET_adbd=19
ANDROID_STORAGE=/storage
ANDROID_TZDATA_ROOT=/apex/com.android.tzdata
ASEC_MOUNTPOINT=/mnt/asec
BASHPID=20429
BOOTCLASSPATH=/apex/com.android.runtime/javalib/core-oj.jar:/apex/com.android.runtime/javalib/core-libart.jar:/apex/com.android.runtime/javalib/okhttp.jar:/apex/com.android.runtime/javalib/bouncycastle.jar:/apex/com.android.runtime/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/miuisdk@boot.jar:/system/framework/miuisystemsdk@boot.jar:/system/framework/android.test.base.jar:/system/framework/tcmiface.jar:/system/framework/telephony-ext.jar:/system/framework/com.nxp.nfc.nq.jar:/system/framework/QPerformance.jar:/system/framework/UxPerformance.jar:/system/framework/WfdCommon.jar:/system/framework/hydra.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.media/javalib/updatable-media.jar
COLUMNS
DEX2OATBOOTCLASSPATH=/apex/com.android.runtime/javalib/core-oj.jar:/apex/com.android.runtime/javalib/core-libart.jar:/apex/com.android.runtime/javalib/okhttp.jar:/apex/com.android.runtime/javalib/bouncycastle.jar:/apex/com.android.runtime/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/miuisdk@boot.jar:/system/framework/miuisystemsdk@boot.jar:/system/framework/android.test.base.jar:/system/framework/tcmiface.jar:/system/framework/telephony-ext.jar:/system/framework/com.nxp.nfc.nq.jar:/system/framework/QPerformance.jar:/system/framework/UxPerformance.jar:/system/framework/WfdCommon.jar:/system/framework/hydra.jar
DOWNLOAD_CACHE=/data/cache
EPOCHREALTIME=1609385251.695699
EXTERNAL_STORAGE=/sdcard
HOME=/
HOSTNAME=umi
IFS=$' \t\n'
KSHEGID=2000
KSHGID=2000
KSHUID=2000
KSH_VERSION='@(#)MIRBSD KSH R57 2019/03/01 Android'
LINES
LOGNAME=shell
OPTIND=1
PATH=/sbin:/system/sbin:/product/bin:/apex/com.android.runtime/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin
PATHSEP=:
PGRP=20429
PIPESTATUS=0
PPID=8211
PS1='$ '
PS2='> '
PS3='#? '
PS4='+ '
PWD=/
RANDOM=14876
SECONDS=0
SHELL=/system/bin/sh
SYSTEMSERVERCLASSPATH=/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jar:/system/framework/com.android.location.provider.jar
TERM=xterm-256color
TMOUT=0
TMPDIR=/data/local/tmp
USER=shell
USER_ID=2000
adb shell export $PATH // 查看当前系统的$PATH环境变量
/sbin:/system/sbin:/product/bin:/apex/com.android.runtime/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin
export test1=hello! //为当前shell设置环境变量 注:必须先通过adb shell进入一个shell实例
export PATH=/data/local/tmp:$PATH // 把/data/local/tmp也添加到$PATH环境变量中
busybox工具箱
最新版本从这里下载:https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/
若当前手机是armv8,可下载busybox-armv8l版本。下载完重命名为busybox,然后adb push到/data/local/tmp目录中,chmod加上可执行权限即可。
adb shell进入/data/local/tmp目录,执行./busybox可打印出其内部包含的命令:
[, [[, acpid, add-shell, addgroup, adduser, adjtimex, arch, arp, arping, ash, awk, base64, basename, bc, beep,
blkdiscard, blkid, blockdev, bootchartd, brctl, bunzip2, bzcat, bzip2, cal, cat, chat, chattr, chgrp, chmod,
chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, conspy, cp, cpio, crond, crontab, cryptpw,
cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg,
dnsd, dnsdomainname, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir,
envuidgid, ether-wake, expand, expr, factor, fakeidentd, fallocate, false, fatattr, fbset, fbsplash, fdflush,
fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free, freeramdisk, fsck, fsck.minix, fsfreeze,
fstrim, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, groups, gunzip, gzip, halt, hd, hdparm, head,
hexdump, hexedit, hostid, hostname, httpd, hush, hwclock, i2cdetect, i2cdump, i2cget, i2cset, i2ctransfer, id,
ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr, ipcalc,
ipcrm, ipcs, iplink, ipneigh, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, less,
link, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq,
lpr, ls, lsattr, lsmod, lsof, lspci, lsscsi, lsusb, lzcat, lzma, lzop, makedevs, makemime, man, md5sum, mdev,
mesg, microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap,
mktemp, modinfo, modprobe, more, mount, mountpoint, mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client,
nc, netstat, nice, nl, nmeter, nohup, nologin, nproc, nsenter, nslookup, ntpd, nuke, od, openvt, partprobe,
passwd, paste, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff,
powertop, printenv, printf, ps, pscan, pstree, pwd, pwdx, raidautorun, rdate, rdev, readahead, readlink,
readprofile, realpath, reboot, reformime, remove-shell, renice, reset, resize, resume, rev, rm, rmdir, rmmod,
route, rpm, rpm2cpio, rtcwake, run-init, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed,
sendmail, seq, setarch, setconsole, setfattr, setfont, setkeycodes, setlogcons, setpriv, setserial, setsid,
setuidgid, sh, sha1sum, sha256sum, sha3sum, sha512sum, showkey, shred, shuf, slattach, sleep, smemcap,
softlimit, sort, split, ssl_client, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svc, svlogd,
svok, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tc, tcpsvd, tee, telnet,
telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, traceroute6, true, truncate, ts, tty,
ttysize, tunctl, ubiattach, ubidetach, ubimkvol, ubirename, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpc6,
udhcpd, udpsvd, uevent, umount, uname, unexpand, uniq, unix2dos, unlink, unlzma, unshare, unxz, unzip, uptime,
users, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, w, wall, watch, watchdog, wc, wget, which, who,
whoami, whois, xargs, xxd, xz, xzcat, yes, zcat, zcip
之后,就可使用./busybox ps命令来查看当前手机进程
https://www.jianshu.com/p/0693b841c83b
https://developer.android.com/studio/command-line/adb.html
https://mazhuang.org/awesome-adb
https://github.com/mzlogin/awesome-adb
https://developer.android.com/studio/releases/platform-tools
https://github.com/aosp-mirror/platform_system_core/tree/master/adb
https://android.googlesource.com/platform/system/core/+/master/adb/
https://www.jb51.net/article/112562.htm?&_=1523982707733
https://blog.csdn.net/feelabclihu/article/details/105534175