$提示符普通权限,#表示拥有root权限
注:低版本的adb可能有一些问题,建议升级到最新的版本
https://developer.android.com/studio/releases/platform-tools
更多adb命令,请查看:awesome-adb
adb version // 查看adb的版本信息
adb shell wm size // 查看手机的分辨率
adb install d:abyclock.apk // 安装d盘下的babyclock.apk文件到正在运行的android设备中 注:需要在开发者模式中打开“USB安装”开关
// -r 覆盖安装,保留数据和缓存文件; -d 解决低版本version问题; -s 安装apk到sd卡
adb push c: est.txt /data/local // 将C盘下的test.txt放到正在运行的android设备的/data/local目录中
adb push G: IntermediateAndroidAPKobjlocalarmeabi-v7alibUE4.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 root // 以root方式重启adb(用于缺省非管理员权限的win7、win10系统)
adb unroot // 以非root方式重启adb(用于缺省非管理员权限的win7、win10系统)
adb remount // 将system分区重新挂在为可读写分区
adb reboot // 重启设备
adb reboot bootloader // 以刷机模式重启设备
adb reboot recovery // 以恢复模式重启设备
adb shell // 在运行的android设备中执行shell命令(进入命令模式,用exit退出)
adb -s RW9H8LJZDYEUWCV4 shell // 进入ID码为RW9H8LJZDYEUWCV4的设备中执行shell命令
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.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:svnUAGameTest1SavedStagedBuildsAndroid_ASTCManifest_UFSFiles_Android_346d59dd.txt
adb.exe -s f2f53b9e pull /sdcard/UE4Game/UAGameTest1/Manifest_UFSFiles_Android.txt "G:svnUAGameTest1SavedStagedBuildsAndroid_ASTCManifest_UFSFiles_Android_346d59dd.txt"
// 将手机上/sdcard/UE4Game/UAGameTest1/Manifest_NonUFSFiles_Android.txt拷贝到PC上的G:svnUAGameTest1SavedStagedBuildsAndroid_ASTCManifest_NonUFSFiles_Android_346d59dd.txt
adb.exe -s f2f53b9e pull /sdcard/UE4Game/UAGameTest1/Manifest_NonUFSFiles_Android.txt "G:svnUAGameTest1SavedStagedBuildsAndroid_ASTCManifest_NonUFSFiles_Android_346d59dd.txt“
adb.exe -s f2f53b9e shell cat /sdcard/UE4Game/UAGameTest1/APKFileStamp.txt // 打印出 APK: 2020/5/22 19:33:47
// 将PC上的G:svnUAGameTest1SavedStagedBuildsAndroid_ASTC中的内容拷贝到手机的/sdcard/UE4Game/UAGameTest1目录中
adb.exe -s f2f53b9e push "G:svnUAGameTest1SavedStagedBuildsAndroid_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 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/cupinfo // 查看系统cpu信息
adb shell cat /proc/stat // 查看cpu占用情况
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 /sys/devices/system/cpu/possible // 查看cpu的核数 返回0-7表示当前cpu为8核
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 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的进程的模块信息
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下多一项)
注:不只有这一种增加fd数的方式,也可以用其他方法,比如打开文件,创建handlerthread等等
② 线程数超限
③ 虚拟地址空间不足 // 对于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、Dalvik Heap为通过操作系统分配的内存(malloc分配的native对象)和通过虚拟机分配的内存 (java对象)
② Shared | Private表示内存是否被共享。被共享过则为Shared,否则为Private
Dirty | Clean表示内存是否被修改过。被修改过则为Dirty,否则为Clean
Shared Dirty:应用进程间共享的写时复制的内存。如:系统库在堆上申请的结构实例
Private Dirty:进程中不能被换出的内存,不与其他进程共享,当进程结束,这部分内存立刻被释放。如:应用在堆上分配的结构实例。手机上是没有SWAP的,所以这部分内存会一直常驻内存。
Shared Clean:共享代码段。如:系统库,boot.vdex、libboost.so
Private Clean:私有代码段。如:应用自己的库,class.dex、libUE4.so
Swap Dirty:基于性能考虑,Android系统不会将Private Dirty的内存交换到磁盘上,而是使用zram机制压缩部分Private Dirty不常用的物理内存。
③ Ashmem:/dev/ashmem 进程的匿名共享内存(Anonymous Shared Memory) 除了DVM以外通过asmmem_create_region函数申请的内存映射空间。如:SurfaceFlinger
Gfx dev:/dev/kgsl-3d0 显存。通常是gpu上资源,如:texture、buffer、shader
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、栈[stack]、
[vectors]ARM特有的东西、代码段/system/bin/app_process、运行时链接器/system/bin/linker
EGL mtrack:读取进程在GPU上分配的内存
GL mtrack:读取进程在GPU上分配的内存
Unknown:匿名内存映射:图形驱动、窗口surfaces、音频缓冲、mmap方式的内存分配
④ 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 dumpsys SurfaceFlinger // 显示android设备的Surface信息
adb shell dumpsys SurfaceFlinger --list // 显示android设备的获取可视窗口列表
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:1.log // 获取单个应用的电量消耗信息,并写入到d:1.log文件中
// 可通过google编写的historian.py脚本把数据信息转换为可读性很好的html文件,类似TraceView生成的列表数据
// python historian.py xxx.txt > xxx.html
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 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 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 logcat -c // 清除缓存区中日志
adb logcat // 显示所有日志
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 -s RW9H8LJZDYEUWCV4 logcat >d:ww1.log // 连接ID码为RW9H8LJZDYEUWCV4的设备,并将log输出到d:ww1.log文件中
adb shell dumpsys package com.tencent.tmgp.pubgm // 查看app相关所有信息,包括action,codepath,version,需要的权限等等信息
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
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 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: emp est.hprof D:com.tencent.tmgp.pubgm_mat.hprof // 转换hprof文件为MemoryAnalyzer工具能解析的hprof文件格式 注:hprof-conv在android-sdk-windowsplatform-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:录制视频的时候声音不会被录下来
run-as com.tencent.mf.uam pmap -x 31530 | grep -E 'Address|libUE4.so|[stack]|----------------|total' // 查看pid为31530,应用为com.tencent.mf.uam过滤信息为Address或libUE4.so或[stack]或----------------或total的内存映射信息
run-as com.tencent.mf.uam cat /proc/31530/maps | grep -E 'libUE4.so|[stack]' // 查看pid为31530,应用为com.tencent.mf.uam过滤信息为libUE4.so或[stack]的内存映射信息
run-as com.tencent.mf.uam showmap -a 8027 | grep -E 'start|addr|--------|libUE4.so|[stack]|TOTAL' // 查看pid为8027,应用为com.tencent.mf.uam过滤信息为start或addr或--------或libUE4.so或[stack]或TOTAL的内存映射信息
run-as com.tencent.mf.uam lsof -p 31530 | grep -E 'COMMAND|libUE4.so|.log|socket' // 查看pid为31530,应用为com.tencent.mf.uam过滤信息为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=$'
'
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实例
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