文章目录
- 背景
- 命令
-
- – 连接机顶盒
- – 查看已连接设备
- – 断开某个机顶盒的连接
- – 断开所有设备连接
- – 获取 root 权限
- – 挂载文件系统
- – 抓取网络包
- – 拉取网络包到本机cmd执行命令当前目录
- – 删除设备中的网络包
- – 获取机顶盒设备信息
- – 根据 uri 查看 contentProvider 中表信息
- – 根据包名和期启动类名打开应用
- – 设置应用运行时的系统参数
- – 根据包名杀应用进程
- – 进程的名字使用 grep 指令过滤输出 "com.gitv.tv.launcher" 进程的信息
- – 清空(清除)Android中的logcat缓冲区
- – 查看 cpu 信息
- – 查看系统的 meminfo
- – 查看电量信息
- – 查找应用的 pid
- – 查看应用最大内存限制
- – 分析应用的内存信息(是否存在内存泄漏)
背景
最近在局方现场出差,我负责sdk开发,局方外包给了北京的同事集成sdk开发应用,后面发现应用存在一些问题需要解决。我又是乙方,就来到了局方现场分析问题,然后反馈解决。
不过后续sdk也没动,一些优化都是应用(存在内存泄漏)需要做的,机顶盒性能也可能有一定的影响。
现场有用到一些比较实用的 adb 命令,这里记录下,方便自己和同学们日后使用。
命令
– 连接机顶盒
adb connect [机顶盒ip]
– 查看已连接设备
adb devices
– 断开某个机顶盒的连接
adb disconnect [机顶盒ip]
or
adb disconnect [虚拟机名称]
– 断开所有设备连接
adb disconnect
– 获取 root 权限
adb root
– 挂载文件系统
adb remount
当想往移动设备端 push 文件时显示没权限,可尝试执行以下指令:
adb root
adb remount
如果还提示 read-only 的话,可继续尝试执行命令:
adb root
adb disable-verity
adb reboot 重启后再 adb remount 即可。
当你想 push 进某一具体路径下的文件夹时可以用: adb shell mount -o rw,remount /路径/路径
注:adb remount 的作用相当于 adb shell mount -o rw,remount,rw /system
– 抓取网络包
(在 cmd 窗口执行命令所在目录下放 tcpdump 文件,抓包时用)
adb shell tcpdump -i any -p -s 0 -w /data/data/capture.pcap
组合键: ctrl + C
可以停止抓包。
– 拉取网络包到本机cmd执行命令当前目录
adb pull /data/data/capture.pcap
– 删除设备中的网络包
adb shell
rm /data/data/capture.pcap
– 获取机顶盒设备信息
adb shell getprop
– 根据 uri 查看 contentProvider 中表信息
adb shell content query --uri [表的uri]示例:
adb shell content query --uri content://stbauthinfo/authentication
结果如下:
Row: 0 _id=131, name=epg_server, value=http://183.224.21.144:33200
Row: 1 _id=132, name=refreshTime, value=915738
Row: 2 _id=133, name=licence, value=1
Row: 3 _id=134, name=Password, value=969256
Row: 4 _id=135, name=username, value=dsw1878700035901
Row: 5 _id=136, name=user_token, value=tj3kkvhyh0d4yS-StkL2k8844
Row: 6 _id=137, name=platform, value=YNYDHW
Row: 7 _id=138, name=userGroup, value=0
Row: 8 _id=139, name=platformType, value=1
Row: 9 _id=140, name=g_token, value=ee422c5fcf70dda06b3fb295d39ef8b0f5aca34ed45bcb4c
Row: 10 _id=141, name=isSW, value=0
– 根据包名和期启动类名打开应用
adb shell am start -n [pkgId]/[launchClassName]示例:
adb shell am start -n com.utstar.smartTV/yanhua.tv.activity.Dispatcher
– 设置应用运行时的系统参数
adb shell setprop [自定义参数 key] [要设置的参数对应的 value]示例:
adb shell setprop debug.ottsdk.config 1
注:设备重启后,设置的参数值会失效;但重启应用不会失效。
– 根据包名杀应用进程
adb shell am force-stop [pkgId]
注意:有的时候不一定能成功。
因为在 android8.1 系统的代码中:
if (app.persistent && !evenPersistent) {
// we don't kill persistent processes
continue;
}
应用中 android:persistent=“true”,true 就不让 force-stop,当然进程也就存在。
那么如果想强制杀可以这样做:找到应用的进程id,然后通过命令 kill -9 [进程id]
可以强制杀进程。
– 进程的名字使用 grep 指令过滤输出 “com.gitv.tv.launcher” 进程的信息
adb shell top | grep com.gitv.tv.launcher
更多相关命令请阅读 adb shell top 命令。
– 清空(清除)Android中的logcat缓冲区
adb logcat -c
建议抓取日志前,执行一遍该命令。
防止抓取多余的日志,保证日志抓取的准确性,方便分析定位问题。
– 查看 cpu 信息
adb shell dumpsys cpuinfo
– 查看系统的 meminfo
adb shell cat /proc/meminfo
MemTotal: 688576 kB 总内存
MemFree: 153736 kB 空闲内存
MemAvailable: 339884 kB 可用内存
Buffers: 16 kB 给文件的缓冲大小
Cached: 267672 kB 高速缓冲存储器
SwapCached: 36 kB 被高速缓冲存储用的交换空间的大小
Active: 222900 kB 活跃使用中的高速缓冲存储器页面文件大小
Inactive: 123700 kB 不经常使用中的告诉缓冲存储器文件大小
Active(anon): 31800 kB 活跃的匿名内存(进程中堆上分配的内存,是用malloc分配的内存)
Inactive(anon): 57272 kB 不活跃的匿名内存
Active(file): 191100 kB 活跃的file内存
Inactive(file): 66428 kB 不活跃的file内存
Unevictable: 0 kB 不能被释放的内存页
Mlocked: 0 kB mlock()系统调用锁定的内存大小
SwapTotal: 2097148 kB 交换空间总大小
SwapFree: 2096884 kB 空闲交换空间
Dirty: 0 kB 等待被写回到磁盘的大小
Writeback: 0 kB 正在被写回的大小
AnonPages: 78876 kB 未映射页的大小
Mapped: 28556 kB 设备和文件映射大小
Shmem: 10160 kB 已经被分配的共享内存大小
Slab: 102916 kB 内核数据结构缓存大小
SReclaimable: 49616 kB 可收回slab的大小
SUnreclaim: 53300 kB 不可回收的slab的大小
KernelStack: 4416 kB kernel消耗的内存
PageTables: 6028 kB 管理内存分页的索引表的大小
NFS_Unstable: 0 kB 不稳定页表的大小
Bounce: 0 kB 在低端内存中分配一个临时buffer作为跳转,把位于高端内存的缓存数据复制到此处消耗的内存
WritebackTmp: 0 kB USE用于临时写回缓冲区的内存
CommitLimit: 2441436 kB 系统实际可分配内存总量
Committed_AS: 308028 kB 当前已分配的内存总量
VmallocTotal: 34359738367 kB 虚拟内存大小
VmallocUsed: 179588 kB 已经被使用的虚拟内存大小
VmallocChunk: 34359310332 kB malloc 可分配的最大的逻辑连续的内存大小
HardwareCorrupted: 0 kB 删除掉的内存页的总大小(当系统检测到内存的硬件故障时)
AnonHugePages: 6144 kB 匿名 HugePages 数量
CmaTotal: 0 kB 总的连续可用内存
CmaFree: 0 kB 空闲的连续内存
HugePages_Total: 0 预留HugePages的总个数
HugePages_Free: 0 池中尚未分配的 HugePages 数量
HugePages_Rsvd: 0 表示池中已经被应用程序分配但尚未使用的 HugePages 数量
HugePages_Surp: 0 这个值得意思是当开始配置了20个大页,现在修改配置为16,那么这个参数就会显示为4,一般不修改配置,这个值都是0
Hugepagesize: 2048 kB 每个大页的大小
DirectMap4k: 108416 kB 映射TLB为4kB的内存数量
DirectMap2M: 940032 kB 映射TLB为2M的内存数量
DirectMap1G: 0 kB 映射TLB为1G的内存数量
– 查看电量信息
adb shell dumpsys battery
– 查找应用的 pid
adb shell top | grep [pkgId]
– 查看应用最大内存限制
adb shell getprop|grep heapgrowthlimit
– 分析应用的内存信息(是否存在内存泄漏)
adb shelldumpsys meminfo [pkgId/pid]
更多详细使用和内存分析说明请阅读:adb shell dumpsys meminfo 详解。
技术永不眠!我们下期见!