外观
性能与稳定性
冷启动、Perfetto、卡顿、内存、功耗与故障定位。
本领域共 134 条问答。先读与你当前场景相关的主题,再用全文搜索查找具体问题。
应用生命周期与 Activity 管理
内存管理与性能优化
- ART 使用 AOT 和 JIT 混合编译的优缺点分别是什么?
- Dalvik 与 ART 在垃圾回收机制上的主要区别有哪些?
- 为什么 Android 应用的堆内存限制通常远小于物理内存?
- 如何理解匿名内部类持有外部 Activity 引用是常见的内存泄漏原因,请举例说明并给出解决方案?
- Handler 导致的内存泄漏是如何发生的?如何使用 WeakReference 避免?
- 为什么静态变量引用 Context 会导致内存泄漏?如何正确获取 Application Context?
- 如何根据屏幕密度和控件大小计算 Bitmap 的最优采样率(inSampleSize)?
- Glide 和 Picasso 在缓存策略和内存管理上有何本质区别?
- 什么是 GC 抖动?它对帧率的影响机制是什么?
- 如何通过减少临时对象创建来降低 GC 频率?请列举具体编码实践?
- 在 RecyclerView 滑动过程中,如何避免因频繁创建 ViewHolder 导致的卡顿?
- 如何使用 Perfetto 分析应用的主线程阻塞点?
- Memory Profiler 中的 Allocation Tracker 能帮助我们发现什么类型的问题?
- AsyncLayoutInflater 与同步 Inflate 有什么差别?
- 异步 Inflate 会打乱 Activity 生命周期吗?为什么页面分块出现?
- Perfetto 中 Actual Timeline 和 Actual Present Time 能代表首帧吗?
- 主线程卡住时,为什么有些系统转场动画还能继续?
- SDK 的 ContentProvider 拖慢启动,应该怎样优化?
- 如何证明一次启动优化确实有效?
混合开发与 WebView 交互
传感器与位置服务
Wear OS 与可穿戴设备开发
性能监控与崩溃分析
- 如何捕获未处理的异常并上报到服务器?
- 什么是 ANR?它产生的根本原因有哪些?
- 如何通过 trace.txt 文件分析 ANR 的主线程阻塞点?
- Firebase Crashlytics 如何自动收集崩溃堆栈和设备信息?
- 如何为 Crashlytics 添加自定义日志和用户标识?
- Sentry 与 Crashlytics 在功能和成本上有何差异?
- 如何定义和监控 App 的关键性能指标(KPI)如启动时间、FPS、内存峰值?
- 什么是冷启动、温启动和热启动?如何测量它们的耗时?
- 如何通过埋点分析用户流失点和功能使用率?
- 为什么在 Release 版本中应禁用 verbose 和 debug 级别的日志?
- 如何使用 Timber 或自定义 Logger 实现日志分级和输出控制?
- 如何避免在日志中打印敏感信息(如 Token、密码)?
- UI Automator 和 Espresso 的区别是什么?各自适用什么测试场景?
- 如何编写一个自动化测试用例来验证登录流程的稳定性?
- 什么是 Monkey 测试?它能发现哪些类型的问题?
多智能体系统
Agentic RAG
多线程与异步编程
冷启动优化
- 380→240ms、1200→700ms:两个启动指标分别从哪量到哪?
- 打开 Perfetto 后,你怎样从一段长耗时找到真正瓶颈?
- 异步 Inflate 会不会失败?页面退出后回调回来怎么办?
- IdleHandler 的“空闲”是什么?为什么用了它仍然可能卡顿?
- 怎样证明提速来自你的改动,而不是缓存、温度或测试波动?
性能与稳定性
- 启动慢,应该从哪里下手?
- 卡顿和 ANR 怎么区分与定位?
- 内存泄漏、内存抖动、OOM 有什么区别?
- AsyncLayoutInflater 到底优化了什么?
- Perfetto Trace 应该按什么顺序看?
- 怎么优化 CPU 与功耗?
- 线上崩溃怎样形成定位闭环?
- ART、JIT、AOT 与 Baseline Profile 是什么?
- Agent 页面卡顿、启动慢或 ANR,怎样沿链路定位?
- Agent 长时间运行,怎样控制内存、功耗与后台任务?
Java 与并发
系统与 Agent
性能分析入门
工程案例解析
启动链路与初始化
- 如何理解冷启动、温启动与热启动?
- 如何理解从图标点击到首帧的启动链路?
- 如何理解TTID、TTFD 与自定义指标?
- 如何理解Application 与 ContentProvider 初始化?
- 如何理解AsyncLayoutInflater 的线程限制?
- 如何理解Baseline Profile 与 Startup Profile?
- 如何理解首屏优化后的瓶颈定位?
启动与组件实战
- ContentProvider 为何容易进入启动关键路径?
- 如何理解AndroidX App Startup 的依赖与手动初始化?
- 异步 Inflate 与局部首屏如何协同?
- 如何理解透明窗口与首个有效画面的判定?
- 如何理解页面 A 到 B 的排队与主线程连续任务?
- 如何理解生命周期、进程重建与状态恢复?
- 如何证明五项启动措施各自有效?
Perfetto 与证据推理
- 如何理解Trace 分析的起点与顺序?
- 如何理解方法耗时与 CPU 运行时间?
- 如何理解Runnable 延迟的成因?
- 如何理解Sleeping 与 D 状态的解释边界?
- 如何理解FrameTimeline 的 Expected 与 Actual?
- 如何理解Perfetto、Systrace、ftrace 与 Simpleperf?
- 如何理解业务 Trace 标记设计?
- 如何理解多份 Trace 的 SQL 对比?
Framework Binder 与 ANR
内存 ART 与泄漏
- 如何理解MAT 与 Activity 引用链?
- 如何理解内存泄漏与内存抖动?
- 如何理解ART GC 与暂停时间?
- 如何理解JIT、AOT 与类加载?
- 如何理解Bitmap 与快照缓存管理?
- 如何理解Native 内存与 JNI 生命周期?
Linux 调度与内存机制
- 如何理解CFS 与公平调度?
- 如何理解EEVDF 与 CFS 的演进?
- 如何理解优先级反转与锁依赖?
- 如何理解大小核、EAS、cpuset 与 uclamp?
- 如何理解缺页异常与启动延迟?
- 如何理解kswapd 与直接回收?
- 如何理解zram、内存压缩与内存规整?
- 如何理解I/O 延迟的分层定位?
调频 温控与平台差异
命令 SQL 与 Java 实操
典型场景排障
- 如何理解案例:180ms 启动切片中的线程状态?
- 如何理解案例:平均 60FPS 与拖动延迟?
- 如何理解案例:启动均值改善而 P95 变差?
- 如何理解案例:onResume 后画面停止更新?
- 如何理解案例:低内存下的启动慢样本?
- 如何理解案例:同一代码在不同设备上的卡顿?
技术复盘与综合实践
启动与系统服务
Binder 安全与并发
输入 Handler 与 View
性能优化与故障定位
- 你做过什么启动优化 如何证明效果?
- Perfetto 里怎样判断是 App 卡顿 还是 SurfaceFlinger 卡顿?
- ANR 和 system_server 卡死怎么排查?
- 内存泄漏 GC 和低内存杀进程怎样区分?
智能硬件 SDK
- Context 为什么容易引发内存泄漏?
- 启动速度应该测什么?
- Perfetto Trace 具体怎样定位卡顿或启动慢?
- 如何理解冷启动优化优先做哪些事情?
- AsyncLayoutInflater 为什么能优化 会改变生命周期吗?
- 内存泄漏 线程泄漏 OOM 和 GC Root 是什么?
- 卡顿 ANR 崩溃怎样区别 怎样排查?
- CPU 与功耗怎样优化?
- 怎样证明优化有效并且没有副作用?
完整英语表达
- 如何理解Explain your startup optimization / 冷启动优化项目?
- 如何理解Walk through your investigation / Perfetto 排查思路?