我回来了

很久没更新博客了,各种原因吧。但现在我决定回归博客,继续写写文章,分享分享技术。
用过很多语言,涉及前后端,一时也不知从何讲起,往后慢慢梳理吧,慢慢把自己想分享的东西写下来,也是一种整理和记录吧。

今天先分享Android知识,分享一些常用的日志抓取和分析方法吧。本博客记录一些常用命令,用于日常开发,问题分析,log分析等。
一般在开发Android应用,比较少去关系系统日志,最多过滤一下自己应用的日志,看一下生命周期和报错日志之类的,可一旦开发的应用涉及到系统侧,日志抓取和分析就必不可少了。
工欲善其事,必先利其器。掌握这些adb命令,必能事半功倍!
logcat和bugreport是非常重要的分析工具,对于通过日志追踪问题是非常必要的。在测试人员的测试过程,会出现各种状况,页面不更新,卡顿,更新延迟,触摸不灵敏等等,这些问题都是需要根据日志文件,通过系统或者应用输出的日志,一步步跟踪,定位问题。下面就是android开发日常使用到的命令,好记性不如烂笔头,多多更新吧!

  1. 日志管理logcat
1、抓取logcat输出到文件
adb logcat > log0801.txt
  1. 获取运行时数据的dumpsys命令
//------------------------------dumpsys  服务名---------------------------------
2、dump ams所有的信息数据
adb shell dumpsys activity > ams0801.txt
3、dump activity任务栈
adb shell dumpsys activity activities > activities.txt
4、dump services信息
adb shell dumpsys activity services
5、dump provides信息
adb shell dumpsys activity providers > providers.txt
6、dump broadcast信息
adb shell dumpsys activity broadcasts > broadcast.txt
7、dump intent信息
adb shell dumpsys activity intents > intent.txt
8、dump process信息
adb shell dumpsys activity processed > processes.txt
9、dump window信息
adb shell dumpsys window > window0801.txt
10、dump location信息
adb shell dumpsys location > location.txt
11、dump cpu使用情况信息
adb shell dumpsys cpuinfo > cpuinfo.txt
12、dump 电池信息
adb shell dumpsys battery > battery.txt
13、dump surface flinger 查看图层layer
adb shell dumpsys SurfaceFlinger > surface.txt
14、dump 进程的内存信息
adb shell dumpsys meminfo com.xx.xx > meminfo.txt
15、网络信息查询
网络连接 adb shell dumpsys connectivity
网络策略 adb shell dumpsys netpolicy
网络状态adb shell dumpsys netstats
网络管理adb shell dumpsys network_management
16、查看当前任务栈
adb shell dumpsys activity | findstr mResumedActivity > resumedActivity.txt
17、查看系统支持的dump 服务
adb shell dumpsys -l 
adb shell service list
18、dump 具体广播的信息
 // 查看广播
adb shell dumpsys activity -b| grep APPWIDGET_ENABLED -C10
  1. 包管理pm命令
//-----------------------pm 
1、清空指定应用的缓存
adb shell pm clear com.xx.xx
2、查看应用安装目录
adb shell pm path com.xx.xx
3、 启用组件 adb shell pm disable/enable <PACKAGE_OR_COMPONENT>
adb shell pm enable com.test/.MainActivity
// 禁用组件
adb shell pm disable com.test/.MainActivity
//强制卸载 testApk
 adb shell pm uninstall -k --user 0 com.testApk
 4、查看所有已安装的软件包
 adb shell pm list packages
 adb shell pm list packages com.test //包含com.test的软件包
 5、查看所有第三方应用,非系统自带
 adb shell pm list packages -3
 6、查看所有被禁用的包
 adb shell pm list packages -d
 7、授权权限
	// 给软件包授予写外部存储器的权限
    pm grant com.example.app android.permission.WRITE_EXTERNAL_STORAGE
 8、取消权限
    // 撤回软件包读写外部存储器的权限
    pm revoke com.example.app android.permission.READ_EXTERNAL_STORAGE

4、dump 界面视图信息

dump视图层级
adb shell uiautomator dump sdcard/ui-tree.xml

5、adb截图/录制视频

adb 截图
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png D:/desktop
adb 录屏
screenrecord [options] <save_file>  
// 录制屏幕, 指定录制宽高为 720x1280, 比特率为 4Mbps, 录制 30 秒
 screenrecord --size 720x1280 --bit-rate 4000000 --time-limit 30 /sdcard/test.mp4
 options参数:
 	--help          # 输出帮助信息

    --size          # 录制的尺寸, 宽x高, 默认值是设备屏幕的原生分辨率(如果支持), 
                    # 如果不支持, 则使用 1280x720。

    --bit-rate      # 设置录制视频的比特率(bit/s), 比特率越高视频质量越高, 
                    # 但文件存储也会变大。例如设置为 4Mbps: --bit-rate 4000000

    --time-limit    # 设置最大录制时长(单位为秒), 默认值和最大值均为 180(3分钟)
    
    --verbose       # 录制时显示日志信息

6、Activity管理器的am命令

1、 杀掉应用,并重启应用
adb shell am force-stop com.test
adb shell am start -n com.test/.MainActivity
// 终止进程
adb shell am kill com.test
//终止所有进程
adb kill-all

2、 持续监听 app
adb shell am monitor

3、启动Activity
am start <intent>

intent 参数:
    -n     // component, intent 组件, 格式为: "包名/组件名", 例如 "com.test/.TestActivity"
    -a     // action, intent 动作, 例如 "android.intent.action.VIEW"
    -c     // category, intent 类别, 例如 "android.intent.category.BROWSABLE"
    -f     // flags, 和 intent.setFlags(int) 方法相同
    
    -d      // data_uri,  intent 数据URI, 例如 "file:///mnt/sdcard/aa.png"
    -t      // mime_type, intent MIME类型, 例如 "image/png"
    
    -e      // 和 --es 相同
    --esn  // 添加 null extra,     格式: --esn extra_key
    --es    // 添加 string extra,   格式: --es extra_key string_value
    --ei    // 添加 int extra,      格式: --ei extra_key int_value
    --el    // 添加 long extra,     格式: --el extra_key long_value
    --ef   // 添加 float extra,    格式: --ef extra_key float_value
    --ez   // 添加 boolean extra,  格式: --ez extra_key boolean_value
    --eu    // 添加 uri extra,      格式: --es extra_key uri_value
    
// 让手机默认浏览器打开一个网页
    am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d https://www.baidu.com
    
 // 打开电话拨号盘
    am start -a android.intent.action.DIAL -d tel:1008611
    
//打电话
    am start -a android.intent.action.CALL -d tel:1008611
    
// 打开微信, 微信(v6.7.3)的主入口 Activity 为 com.tencent.mm.ui.LauncherUI
    am start -n com.tencent.mm/.ui.LauncherUI
    
// 打开微信(完整的启动 APP 命令)
    am start -n com.tencent.mm/.ui.LauncherUI -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
    
3、启动服务
adb shell am startservice -n com.test/.TestService

4、发送广播
adb shell am broadcast  -a com.test.home_action

7、dump window的动画/界面转换

1、
  // Tracing Window Transitions
 开始前输入:
 adb shell cmd window tracing start
 复现后输入:
 adb shell cmd window tracing stop
 把文件pull出来:
 adb pull /data/misc/wmtrace/wm_trace.winscope wm_trace.winscope
 
 2、抓surfaceflinger的状态
adb shell su root service call SurfaceFlinger 1020 i32 1
adb shell su root service call SurfaceFlinger 1020 i32 0
adb pull /data/misc/wmtrace/transaction_trace.winscope

8、调用Android系统bugreport

// adb bugreport
adb bugreport > bugreport.txt
// 高版本直接生成zip
adb bugreport

9、安装卸载apk

adb install <options> <路径>
options参数:
	-r 替换安装包,保留数据
	-d 允许版本降级(只限debug包)
	-g 授予所有运行权限

adb uninstall <options> <packagename>
options参数:
	-k 保留数据和缓存目录

10、获取device信息 getprop

getprop                             # 列出所有属性信息

getprop ro.product.manufacturer		# 获取设备的厂商, 例如: HUAWEI
getprop ro.product.brand            # 获取设备的商标, 例如: HUAWEI
getprop ro.product.model            # 获取设备的型号, 例如: BLA-AL00

getprop ro.build.version.release    # 获取设备的 Android 版本, 例如: 8.1.0
getprop ro.build.version.sdk        # 获取设备的 SDK Version, 例如: 27

getprop ro.boot.serialno            # 获取设备的序列号, 例如: 8FE0917B20005668
getprop ro.board.platform           # 获取设备的 CUP 平台, 例如: kirin970

getprop dalvik.vm.heapstartsize     # 虚拟机进程的分配的初始堆内存大小
getprop dalvik.vm.heapgrowthlimit   # 虚拟机进程的堆内存增长极限大小
getprop dalvik.vm.heapsize          # 虚拟机进程的堆内存大小

11、monkey脚本/自动化测试/压测

//  monkey <options> <count>
// 1、python脚本
python perfsense.py --monkey "monkey -p com.testapk --pct-touch 30 --throttle 1000 -s 200 --pct-syskeys 0 --ignore-crashes --ignore-timeouts -v -v -v 60000 > /sdcard/monkey.txt" --jarperf "com.testapk" -t 32000 

// 2、adb 命令
adb shell "monkey  -p com.testapk  --ignore-crashes --monitor-native-crashes --ignore-timeouts --ignore-native-crashes --pct-motion 40 --pct-touch 45 --pct-appswitch 5 --pct-nav 5 --pct-majornav 5 --pct-syskeys 0 --pct-anyevent 0 --kill-process-after-error -s 251314251314 -v-v-v --throttle 300 600000000 2>/data/local/tmp/log.txt"

adb shell monkey -p com.test --pct-syskeys -0 -v -v -v 10000

options参数:
options 参数:
    -p <allowed_package>            # 允许测试的软件包, 可以指定多个 -p 参数支持多个软件包
    -c <main_category>              # 主分类, 可以指定多个 -c 参数
    
    --ignore-crashes                # 忽略崩溃, 继续执行事件
    --ignore-native-crashes         # 忽略 native 崩溃, 继续执行事件
    --ignore-timeouts               # 忽略超时, 继续执行事件
    --ignore-security-exceptions    # 忽略安全异常, 继续执行事件
    --monitor-native-crashes        # 监控 native 崩溃
    
    --kill-process-after-error      # 发生错误时杀死进程
    --hprof
    --match-description <text>
    
    --pct-touch <percent>           # 触摸事件百分比, 例如指定触摸事件比例为 30%, 格式为: --pct-touch 30
    --pct-motion <percent>          # 手势动作事件百分比, 所有事件百分比之和不能超过 100%
    --pct-trackball <percent>       # 轨迹事件百分比 
    --pct-syskeys <percent>         # 系统按键事件百分比
    --pct-nav <percent>             # 基本导航事件百分比
    --pct-majornav <percent>        # 主要导航事件百分比
    --pct-appswitch <percent>       # APP 切换事件百分比
    --pct-flip <percent>            # 弹事件百分比
    --pct-anyevent <percent>        # 其他事件百分比
    --pct-pinchzoom <percent>       # 缩放(捏)事件百分比
    --pct-permission <percent>      # 权限事件百分比
    
    --pkg-blacklist-file <file>     # 
    --pkg-whitelist-file <file>     # 
    
    --wait-dbg                      # 如果 adb 断开, 等待 adb 连接, 直到 adb 恢复连接后继续执行 monkey
    --dbg-no-events                 
    --setup scriptfile
    -f <scriptfile>                 # 指定用于测试的脚步文件, 可以指定多个 -f 参数
    --port <port>
    -s <seed>                       # 产生伪随机事件的种子, 相同的 -s 产生的事件流相同, 格式(可指定多个-s): -s 1
    -v                              # 反馈信息级别, -v 越多个, 输如的日志信息越详细, 最多支持 3 个 -v
    --throttle <ms>                 # 事件之间的间隔(单位为毫秒), 例如 200毫秒 的格式: --throttle 200
    --randomize-throttle            # 随机事件间隔时间
    --profile-wait <ms>             # 
    --device-sleep-time <ms>        # 
    --randomize-script              #
    --script-log                    # 
    --bugreport                     # 
    --periodic-bugreport            # 
    --permission-target-system      #