文章目录

  • 背景
  • 命令
    • – 连接机顶盒
    • – 查看已连接设备
    • – 断开某个机顶盒的连接
    • – 断开所有设备连接
    • – 获取 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 实用命令(网络包、日志、调优相关)-编程知识网
Adb 实用命令(网络包、日志、调优相关)-编程知识网

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

Adb 实用命令(网络包、日志、调优相关)-编程知识网

– 查看系统的 meminfo

adb shell cat /proc/meminfo

Adb 实用命令(网络包、日志、调优相关)-编程知识网
相关说明如下:

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

Adb 实用命令(网络包、日志、调优相关)-编程知识网

– 查找应用的 pid

adb shell top | grep [pkgId]

Adb 实用命令(网络包、日志、调优相关)-编程知识网
第一列的数字 2185 就是应用的进程 pid

– 查看应用最大内存限制

adb shell getprop|grep heapgrowthlimit

Adb 实用命令(网络包、日志、调优相关)-编程知识网

– 分析应用的内存信息(是否存在内存泄漏)

adb shelldumpsys meminfo [pkgId/pid]

Adb 实用命令(网络包、日志、调优相关)-编程知识网

更多详细使用和内存分析说明请阅读:adb shell dumpsys meminfo 详解。


技术永不眠!我们下期见!