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

ops/2024/10/5 18:23:36/

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


http://www.ppmy.cn/ops/100358.html

相关文章

【日常记录-JS】多个react打包的dist目录如何同时放到一个nginx上生效

Author:赵志乾 Date:2024-08-26 Declaration:All Right Reserved!!! 1. 简介 多个React打包的dist目录同时放到一个Nginx服务器上并使其生效,需要通过Nginx的配置文件来区分不同的项目&#xf…

C语言占领游戏

目录 开头程序程序的流程图程序的效果结尾 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <Windows.h> void pri…

【QT】学习笔记:关于“初始化列表中的成员变量”

一、问题1 以下代码是什么意思&#xff1f; MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) , ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow() {delete ui; } 好的&#xff0c;我来为你解释这段 Qt 代码&#xff1a; 整体概述…

计算机视觉与视觉大模型对板书检测效果对比

文章目录 计算机视觉火山引擎ocr阿里云ocr 视觉大模型GPT4kimi通义千问chatGLM百度 全部正确某开源模型&#xff0c;效果不佳 计算机视觉 火山引擎ocr 阿里云ocr 视觉大模型 GPT4 kimi 通义千问 chatGLM 百度 全部正确 某开源模型&#xff0c;效果不佳

【Docker】如何让子用户直接使用docker命令

本文首发于 ❄️慕雪的寒舍 通过用户组&#xff0c;让子用户可以直接使用docker命令。 说明 正常情况下&#xff0c;使用一个子用户来执行docker命令&#xff0c;会出现如下提示 $ docker ps permission denied while trying to connect to the Docker daemon socket at uni…

磁场强度H和磁感应强度B,磁化强度M和磁极化强度J

磁场强度H、磁感应强度B、磁化强度M和磁极化强度J是四个非常重要的磁学基本概念&#xff0c;他们之间关联但有时又很容易混淆。分清这四个概念对于磁材行业从业者是非常重要的&#xff0c;今天我们就为大家细说一下它们的概念和关系。 磁场强度H 磁场强度H其实是一个没有实际…

openGuass——管理用户安全

一、默认权限机制 二、管理员 1、核心管理员 2、辅助管理员 三、三权分立 1、思想 2、实践 四、权限操作 1、用户的创建与删除 2、用户的修改与信息查看 五、角色 1、创建、修改和删除角色 六、GRANT 七、REVOKE 八、设置用户安全策略 自动锁定和解锁用户 手动锁…

Qt--信号signal与槽slot

信号&#xff08;Signal&#xff09;就是在特定情况下被发射的事件&#xff0c;例如 PushButton 最常见的信号就是鼠标 单击时发射的 clicked() 信号 槽&#xff08;Slot&#xff09;就是对信号响应的函数。槽就是一个函数&#xff0c;与一般的 C函数是一样的&#xff0c;可以…