文章目录
-
-
- [一、 App 崩溃(闪退 / CRASH)专题](#一、 App 崩溃(闪退 / CRASH)专题)
-
- [1. 为什么会闪退?(常见原因)](#1. 为什么会闪退?(常见原因))
- [2. 发生闪退后,如何定位原因?(排查 4 步曲)](#2. 发生闪退后,如何定位原因?(排查 4 步曲))
- [二、 App 无响应(ANR)专题](#二、 App 无响应(ANR)专题)
-
- [1. 为什么会发生 ANR?](#1. 为什么会发生 ANR?)
- [2. 如何排查 ANR?](#2. 如何排查 ANR?)
- [三、 App 性能监测专题(CPU、内存)](#三、 App 性能监测专题(CPU、内存))
-
- [1. 监测 CPU 占用率](#1. 监测 CPU 占用率)
- [2. 监测内存使用情况(重难点)](#2. 监测内存使用情况(重难点))
- [四、 常用 ADB 命令速查表](#四、 常用 ADB 命令速查表)
-
这份《App测试部分面试题》文档非常干货,主要聚焦于 App 的稳定性测试(崩溃/ANR) 、性能监测(CPU/内存) 以及 ADB 命令的实战应用。
一、 App 崩溃(闪退 / CRASH)专题
1. 为什么会闪退?(常见原因)
- 系统垃圾与内存:缓存垃圾过多导致卡顿闪退;后台运行程序过多导致内存不足。
- 版本与兼容性问题:App 版本过低不兼容;或者新版本正在调试存在 Bug;App 的 SDK 与手机系统不兼容。
- 网络与组件问题:访问网络异常,或者图片组件(ImageView)无法正常下载显示。
- 系统 API 变更:手机系统大版本升级(如 Android 10 升 11),旧版 API 被废弃,导致获取对象失败报空指针(NullPointerException)而闪退。
2. 发生闪退后,如何定位原因?(排查 4 步曲)
- 第一步:收集信息 。记录闪退时的操作步骤、机型、系统版本,最重要的是获取日志。
- 第二步:分析日志(核心) 。
- Android :使用
adb logcat查看日志,搜索关键字AndroidRuntime: FATAL EXCEPTION,精准定位崩溃的类、方法和代码行号。 - iOS :通过 Xcode 的 Devices 面板查看
.crash文件,结合 dSYM 文件解析符号表定位。
- Android :使用
- 第三步:复现问题。根据收集的操作步骤尝试重新触发闪退,结合日志报错(如空指针、数组越界)排查代码。
- 第四步:工具辅助。借助 Crashlytics、Bugly 等第三方平台自动收集和分析闪退趋势。
二、 App 无响应(ANR)专题
ANR (Application Not Responding) 是指 App 界面卡死,系统弹出"应用无响应"的提示框。
1. 为什么会发生 ANR?
核心原因只有一个:主线程(UI线程)被阻塞超过了 5 秒钟。
- 耗时操作:在主线程里做了网络请求、数据库查询或复杂的数学计算。
- 死锁:多个线程互相竞争资源,导致主线程一直等待。
- 内存不足:系统资源极度紧张,主线程无法被正常调度。
2. 如何排查 ANR?
- 抓取日志 :ANR 发生时,系统会在手机
/data/anr/目录下生成traces.txt文件。使用命令adb pull /data/anr/traces.txt 本地路径导出到电脑。 - 分析日志 :打开文件,搜索
ANR in 包名,查看对应的线程栈,找出到底是哪个方法阻塞了主线程。 - 解决思路 :把耗时操作扔到子线程(如 AsyncTask、协程)去执行,避免死锁,优化内存。
三、 App 性能监测专题(CPU、内存)
文档指出,性能测试通常分为三种强度状态:空闲状态 (切后台/不操作)、中强度状态 (日常使用)、高强度状态(高频操作,如跑 Monkey,常用于测内存泄漏)。
1. 监测 CPU 占用率
- 使用命令 :
adb shell top -m 10 -s cpu(显示占用 CPU 最高的前 10 个进程)。如果想只看自己的 App,可以用top -d 3 | grep 包名。 - 关注指标:如果反复执行某个操作,发现 CPU 占用率一直飙升且无法降下来,说明存在性能风险。
- 关键参数:PID(进程ID)、S(状态:R运行/S休眠)、VSS/RSS(虚拟/实际物理内存)。
2. 监测内存使用情况(重难点)
- 使用命令 :
adb shell dumpsys meminfo <包名> - 内存两大核心层 :
- Native Heap(原生堆) :底层 C/C++ 代码使用的内存,不受 Java 垃圾回收(GC)管理,全靠开发者手动释放,极易发生内存泄漏。
- Dalvik/ART Heap(虚拟机堆):Java/Kotlin 代码使用的内存,受 GC 管理(如 Activity、对象等)。
- 如何判断内存泄漏?
- 死死盯住
Native Heap Alloc和Dalvik Heap Alloc这两个值。如果反复操作某个功能,这两个值只涨不降,就说明发生了内存泄漏,最终会导致 OOM(内存溢出)闪退。
- 死死盯住
- 黄金指标:Total PSS
- PSS(比例集大小)是衡量 App 真实内存占用的最准指标。
- 为什么不用 RSS? 因为多个 App 会共享系统库,RSS 会把共享内存全算在一个 App 头上(有水分),而 PSS 会按比例平摊,剔除了水分。
四、 常用 ADB 命令速查表
文档中列举了测试中最常用的 ADB 命令,建议熟记:
| 功能分类 | 常用命令 | 说明 |
|---|---|---|
| 服务与设备 | adb start-server / adb kill-server |
启动 / 关闭 adb 服务 |
adb devices |
查看已连接的手机设备号 | |
| 系统信息 | adb shell getprop ro.build.version.release |
获取手机 Android 系统版本 |
| 文件传输 | adb push <电脑路径> <手机路径> |
将电脑文件推送到手机 |
adb pull <手机路径> <电脑路径> |
将手机文件拉取到电脑 | |
| 应用管理 | adb install <apk路径> |
安装 App |
adb uninstall <包名> |
卸载 App | |
| 日志与性能 | `adb logcat | grep/findstr 包名` |
adb shell top |
查看 CPU 及进程状态 | |
adb shell am start -W 包名/启动名 |
测试 App 的启动时间 |
总结语:
用 Monkey 制造问题(高强度施压),用 ADB 命令(logcat/top/dumpsys)抓取证据,最后通过分析日志(FATAL EXCEPTION / traces.txt / PSS指标)来定位代码缺陷。 掌握这套组合拳,App 的稳定性与性能测试就难不倒你了!