一、现象:原生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)