Android原生JobSchedulerContext内存泄漏导致设备重启的现象

一、现象:原生JobSchedulerContext内存泄漏占比

JobServiceContext内存泄露导致ServiceDispatcher也跟着一起内存堆积

二、现象日志:

内存泄漏的日志关键信息:ActivityManager: Unbind failed: could not find connection for android.app.LoadedApk$ServiceDispatcher$InnerConnection@492fb1,内存堆积现象

Unbind failed 现象:
// main日志
05-28 17:33:54.929  1629  1629 I vendor.qti.hardware.servicetrackeraidl-service: bindService is called for service : com.microsoft.office.outlook/com.evernote.android.job.JobRescheduleService and for client system
05-28 17:33:57.714  1629  1629 I vendor.qti.hardware.servicetrackeraidl-service: unbindService is called for service : com.microsoft.office.outlook/com.evernote.android.job.JobRescheduleService and for client system
// system日志
05-28 17:33:57.554  1828  8984 I ActivityManager: Process com.microsoft.office.outlook (pid 16394) has died: prcp TOP 
05-28 17:33:57.556  1828  8984 W ActivityManager: Scheduling restart of crashed service com.microsoft.office.outlook/com.evernote.android.job.JobRescheduleService in 1000ms for connection
05-28 17:33:57.717  1828  3089 W ActivityManager: blocked by firewall: from pid = 1828,  uid = 1000, accessing service com.microsoft.office.outlook/com.evernote.android.job.JobRescheduleService
05-28 17:33:57.718  1828  3089 D JobPowerPolicy: need unbind service while bind failed
05-28 17:33:57.728  1828  3089 W ActivityManager: Unbind failed: could not find connection for android.app.LoadedApk$ServiceDispatcher$InnerConnection@492fb1
05-28 17:33:57.734  1828  3089 W JobScheduler: Job didn't exist in JobStore: b5e537d #u0a231/2147480000 com.microsoft.office.outlook/com.evernote.android.job.JobRescheduleService
05-28 17:33:57.747  1828  3089 E JobScheduler.Concurrency: Error executing JobStatus{b5e537d #u0a231/2147480000 com.microsoft.office.outlook/com.evernote.android.job.JobRescheduleService u=0 s=10231 system stops=1 READY}

相关分析如下
// 每当3方应用job服务满足预设值条件,触发Job 启动
JobSchedulerService.maybeRunPendingJobsLocked
JobConcurrencyManager.assignJobsToContextsLocked
JobConcurrencyManager.assignJobsToContextsInternalLocked
JobConcurrencyManager.startJobLocked // Slog.e(TAG, "Error executing " + jobStatus);
JobServiceContext.executeRunnableJob:mContext.bindServiceAsUser // bind和unbind没有成对,导致内存泄漏
ContextImpl.bindServiceAsUser
ContextImpl.bindServiceCommon
ActiveServices.bindServiceLocked()
ActiveServices.retrieveServiceLocked // blocked by firewall
LoadedApk.getServiceDispatcher // 3方应用service拉起来, 则ServiceDispatcher的对象堆积一次
LoadedApk.getServiceDispatcherCommon 

三、原因:

1. 重启原因是ServiceDispatcher发生了内存泄漏

2. ServiceDispatcher内存泄漏原因:LoadedApk中map.put(r, rd)和map.remove没有成对,即一直都是put导致内存堆积

3. LoadedApk中map.remove没执行原因:当Unbind失败时Job没有执行unBindService

四、解决方案:

解决方案同google的一个patch, 即当Unbind失败时Job新增执行unBindService操作

d8a414d342caef4ccadd2f88f289ca18e669319c - platform/frameworks/base - Git at Google (googlesource.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值