本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
前言
我们都知道 Android Studio 里内置了 Profiler
tool 供大家对 App 在 Memory、CPU、Network、Power 等角度进行 dump 和分析。
但如果一个内存相关的 bug 是运行时发生的,而且很难复现,那么后期就很难准确定位发生时的具体状况。
值得兴奋的是 Android 15 将直面这个痛点:引入了 ProfilingManager
API,允许 app 对 Memory 进行动态的、随时随地的 dump。
生成的文件默认存在本地,也可以通过网络传递到 offboard,方便开发者事后回溯。
API 说明
ProfilingManager
主要提供了 3 个方法。
registerForAllProfilingResults
注册 profiling 请求的回调和执行的线程,需要如下两个参数:
Parameters | Descriptions |
---|---|
executor |
Executor : 回调执行的线程池实例,不可为空 |
listener |
Consumer : 携带 profiling 结果的 listener 实例,不可为空 |
unregisterForAllProfilingResults
注销 profiling 请求的回调,如果没有指定 listener 参数的话,将移除所有 callback。
Parameters | Descriptions |
---|---|
listener |
Consumer : 待移除的回调,null 的话移除所有 |
requestProfiling
请求进行一次 profiling 操作,有非常详细的参数可供设置:
Parameters | Descriptions |
---|---|
profilingType |
int : profiling 操作的类型,主要包括 dump Java 堆的 PROFILING_TYPE_JAVA_HEAP_DUMP ,dump 堆的 PROFILING_TYPE_HEAP_PROFILE , dump 栈的 PROFILING_TYPE_STACK_SAMPLING 和 dump 系统 trace 的PROFILING_TYPE_SYSTEM_TRACE ,参数不能为空。 |
parameters |
Bundle : 携带请求额外的相关参数, 如果包含了未定义的参数类型,请求会失败,在 callback 当中以 ERROR_FAILED_INVALID_REQUEST 结果进行返回,参数可为空。 |
tag |
String : 回来识别 dump 输出的 tag 标签,其中的前 20 个字符将会以小写的形式拼接到 dump 文件名中,参数可为空 |
cancellationSignal |
CancellationSignal : 支持请求侧用来取消 dump 的 cancellation 实例,如果 dump 结果已出来的话,会被返回。参数可为空,此时将执行系统默认的超时时间,之后结束 dump。 |
executor |
Executor : 回调执行的线程池实例,参数可为空。但如果没有其他 executor 注册的话,该请求会被无视。 |
listener |
Consumer : 监听操作结果的实例,registerForAllProfilingResults() 注册的 callback 同样也会被回调,参数可为空。但如果没有其他 listener 注册的话,该请求会被无视。 |
需要说明的是:
- 很多时候,并不推荐直接使用该 API 进行 dump,相反可以采用 androidx 中封装好的高层级接口进行请求。该接口内部会依据可用选项和简化的参数进行正确地请求。
- 并非所有情况都会