APP性能设计及优化专题——影响性能的不良实现

systemserver binder线程耗尽问题分析及优化方案 systemserver binder线程耗尽问题分析及优化方案 一、问题场景描述 Systemserver作为系统核心进程,它提供了大量的binder服务,响应大量客户端binder请求,同时也会作为客户端,访问其它进程,如果systemserver有大量请求同时发出或者systemserver同时响应大量请求,并且处理请求的进程又遇到某些原因block住,这样长时间block,就会导致SWT发生。下面描述几个典型场景。 场景1: 场景描述: 整个流程就是进程A,例如com.med... 阅读详情

本文将重点介绍影响性能的不良实现,主要包含Binder共享内存耗尽、Binder线程池耗尽、创建大量BpBinder或Binder对象等方面。

为了更好地了解下文内容,我们先简单介绍一下Binder:

【注】由于Binder机制的复杂性,这里不展开介绍,仅简单概括,便于更好理解本文内容。

Binder属于一种IPC通信机制,是用来实现不同进程间通信的,主要由ServiceManager、Server(服务端)、Binder 驱动、Client(客户端)4 部分构成,其中Client、Server、Service Manager运行在用户空间,Binder驱动运行在内核空间。一次完整的 Binder IPC 通信过程通常如下:

1)Binder 驱动在内核空间创建一个数据接收缓存区;

2)在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;

3)发送方进程通过系统调用 copy_from_user()将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,完成一次进程间的通信。

图片

由于Binder在跨进程通信过程中担任着极其重要的作用,任何流程或异常都会带来负面影响。

01 Binder共享内存耗尽

Binder的性能(减少一次copy_to_user)和安全是最大优势,但由于Binder在内核和用户态都对传输的数据量有限制,因此要避免通过Binder传输大量数据。一个进程用于接收Binder数据的共享内存为1M-8K,对于oneway要减半。同时,Binder driver也有4M上限的限制,当多个线程共用这块共享内存时,一旦driver发现数据接收方共享内存不够,就会返回错误。

图片

Binder共享内存耗尽的影响:

Binder调用耗时长,甚至失败;

若是用户操作的关键流程,则会导致卡顿发生。

优化建议:

及时释放data(Server端)或reply(Client端),建议用AIDL框架;

Binder接口设计时避免大数据的参数传递,若有需要可用Ashmem传递;

避免短时间内大量线程同时并行调用某Server,若有需要,需做削峰处理。

02 Binder线程池耗尽

Server端有一定数量的Binder线程池来响应Client的调用,一个进程的Binder线程数默认最大是16(1个主线程和15个非主线程),超过的请求会被阻塞等待空闲的Binder线程,即Binder线程池耗尽会导致后面的调用被阻塞。

图片

Binder线程池耗尽的影响:

同步调用的Client端被阻塞,若是用户操作的关键流程中,则发生卡顿现象;

system_server等系统关键服务进程的Binder线程池耗尽,则造成整机卡顿。

优化建议:

避免短时间内大量线程同时并行调用某Server,若有需要则需做削峰处理;

提升Binder接口实现的执行效率。

03 创建大量BpBinder或Binder对象

BpBinder是客户端中的Binder引用,保存着目标服务的handle信息,即服务端的Binder实体的引用信息,用于查询内核中的Binder节点,并同Binder实体通信。
系统并未限制Server端的Binder对象创建,理论来说可以大量创建,但一个Service应该仅创建一个Binder对象,BpBinder对象有上限6000/2500个,多了会被杀掉,因此建议同一个Service的BpBinder实现进程内共用。
图片

创建大量BpBinder或Binder对象的影响:

内存占用,频繁GC,甚至因OOM而闪退;

整机卡顿。

优化建议:

一个Service仅一个Binder对象实例,按使用场景和生命周期合并Service;

及时释放不再使用的BpBinder。

04 使用多个ServiceConnection对象Bind同一个Service

ServiceConnection其实也是一个Service,提供给AMS维护,用于管理目标Service的回调。同一个ServiceConnection对象可以管理多个Service,Client端已做到对不同Service的复用,AMS仅维护一个IServiceConnection;但不同ServiceConnection对象没有做到复用,即使是同一个Service。
图片

使用多个ServiceConnection对象Bind同一个Service的影响:

增加AMS的维护负担,Service的启动/退出都会持有AMS锁后遍历SC;

长时间持有AMS锁,导致整机卡顿。

优化建议:

复用同一个ServiceConnection对象,特别是同一个Service;

监听Service的死亡回调,若有需要可立即重新Bind;

及时unbind不再使用的Service。

05 随用随获取系统服务

系统服务由ServiceManager维护,获取系统服务IBinder的过程也是一次跨进程Binder调用。应用常用的系统服务在应用进程启动时就已由ATMS带过去了,而其他系统服务系统对普通应用使用hiden接口来限制。当出现频繁调checkService接口的,主要是系统服务或系统应用。
图片

随用随获取系统服务影响:

不必要的跨进程同步调用耗时1ms左右,有些甚至达到s级(logcat -b events -s service_manager_slow);
增加系统负荷。

优化建议:

一次获取成功后本地缓存;

通过IBinder的linkToDeath机制感知到服务的退出,服务退出后清除本地IBinder缓存,下次需要时再次向Servicemanager获取。

除了上述的不良实现外,还有组件对象泄漏(原生的removeContextRegistrations中有对SC、Receiver和Window泄漏的检查)、系统核心进程调用非ONEWAY的IPC接口(会带来核心进程卡死的风险)以及HIDL仅用于跨进程间调用(对于Client和Server共进程的场景,不要使用HIDL)等。

到这里,APP性能设计及优化专题告一段落,欢迎大家后台留言,发表您对文章的见解,或反馈您想查看的内容,希望我们一起进步哦~

最后: 自行领取一份216页软件测试工程师面试宝典文档资料【免费的】。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

在这里插入图片描述
在这里插入图片描述

Service Manager分析 一、什么是Service Manager ServiceManager是Binder的守护进程,在Android上如果service manager挂掉,所有采用Binder通信的进程服务都会挂掉。 ServiceManager本身也是一个Binder服务,handle固定为0。提供注册服务,查询服务的功能。应用程序相要通过Binder向一个service发送数据,必须先通过Service Manager获取该service的handle然后才能通过binder驱动与service通信。 二、源码位置 Se 阅读详情

相关推荐

APP性能设计及优化专题——性能设计概述篇_如何做app性能测试优化方案(1)

性能设计贯穿整个软件生命周期的各个阶段,不只局限于方案设计和代码开发阶段,运维阶段的性能维测(可度量、可发现、可定位)也极其重要。一款好的应用要以快、稳、小、省为目标,力求流畅、稳定、安装包小,同时实现省电省流量,而想要实现这个目标,就要在方案设计时规避可能出现的卡顿、内存使用不合理、代码逻辑乱、代码质量差、安装包过大等问题。T行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!等,本期首先介绍应用性能设计的整体思路。

2401_84140734的博客 1013

android p关于qickstep launcher anr分析

手机在开机后,有概率出现qickstep anr 通过main log,查找anr 发现; 07-03 14:53:10.395084 1557 1557 D ImsVT Util: onRecevied feature changed phoneId: 1, feature: 1, status: 0 07-03 14:53:10.395459 1557 1599 D ImsVT Uti...

wangjicong_215的博客 2045

iOS App 启动性能优化

导语本文介绍了如何优化iOS App的启动性能。本文分为四个部分: 第一部分科普了一些和App启动性能相关的前置知识 第二部分主要讲如何定制启动性能的优化目标 第三部分通过在WiFi管家这个具体项目的优化过程,分享一些有用的经验 第四部分是关键点的总结。 【第一部分】一些小科普因为篇幅的限制,没有办法很详尽的说明一些原理性的东西,只是方便大家了解哪些事情可能跟启动性能有关。同时,内容相对也比较入门...

csdnvr的博客 2163

Binder 线程池溢出问题

第一行是 proc 2890 表示进程的 pid,第二行表示 binder 类型,接下来就是 buffer,用于表示内核中的 binder_buffer,如果这个 buffer 在程序运行过程中越来越多,那么就有内存泄漏的可能存在,不过这种情况很少,应用程序都是通过 libbinder 这个库来使用 binder 驱动的,在一次 ipc 调用结束后,库本生会执行 binder_buffer 的清理操作,这种系统中的公用库一般都非常稳定,出 bug 的几率很小。一个关于binder的debug技巧。

chuyouyinghe的专栏 1241

鸿蒙原生APP性能优化之点击响应优化

响应(Response)是指应用在运行中,由用户直接或间接做出一个行为请求,当程序接受了该请求,随即做出一系列运算,最终界面发生变化的过程。简单来说,即用户发出指令,程序执行,设备显示变化。在应用生态高速发展的背景下,虽然移动设备的硬件运算性能已经达到了新的高度,但与此同时应用研发者也设计出更加多元化、智能化的产品,展现样式百花齐放,这些产品对高性能的需求与日俱增,加上同类型相近功能的产品互相竞争,用户也会对App产品质量的要求越来越高,对响应速度的要求也愈加严格。

2401_87677001的博客 1170

Android app性能优化解决卡慢顿之布局优化

前面博客分析了导致app卡顿慢的直接原因,这里就从原因出发,分析一些优化方案(这里主要是从直接影响渲染机制的布局相关进行分析) 1) Invalidations, Layouts, and Performance(动画,布局的优化) 顺滑精妙的动画是app设计里面最重要的元素之一,这些动画能够显著提升用户体验。下面会讲解Android系统是如何处理UI组件的更新操作的。 通常来说,Andro

Android 小生的博客 8315

【揭秘uni-app专题组件】从设计到实现的全面解析

入了解了uni-app专题组件的构建过程,包括模板结构、样式设计、交互设计、响应式设计和性能优化等多个方面。每个知识点都通过生动的例子进行了解释,帮助初学者快速掌握uni-app开发的关键技能。希望本文能为你的前端开发之旅提供有价值的参考

Reeuse的博客 864

Binder线程数耗尽引起系统异常分析

Binder线程数耗尽引起system_server进程异常,进而导致系统瘫痪

shusuanly的博客 2253

淘宝客APP的架构设计与性能优化

淘宝客APP的架构设计与性能优化是一个持续的过程,需要从多个方面进行考虑和优化。通过采用微服务架构、数据库优化、缓存策略、异步处理、负载均衡、代码优化以及有效的监控和日志管理,我们可以构建一个高性能、高可用的淘宝客APP。本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

技术研究中心 2610

QMI8658姿态传感器实战:从校准到自检的完整避坑指南

本文详细解析了QMI8658姿态传感器的校准与自检流程,提供了从硬件环境搭建到高级功能开发的完整避坑指南。通过真实案例揭示电源设计、接口优化、温度补偿等关键细节,帮助开发者提升传感器精度和可靠性,适用于工业级应用场景。

weixin_29184075的博客 455

vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制

技术无关,独立开发,独立部署,增量升级,独立运行,微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用。

前端开发工程师 9747

APP性能设计及优化专题——性能设计概述篇

性能设计贯穿整个软件生命周期的各个阶段,不只局限于方案设计和代码开发阶段,运维阶段的性能维测(可度量、可发现、可定位)也极其重要。一款好的应用要以快、稳、小、省为目标,力求流畅、稳定、安装包小,同时实现省电省流量,而想要实现这个目标,就要在方案设计时规避可能出现的卡顿、内存使用不合理、代码逻辑乱、代码质量差、安装包过大等问题。一款好应用,除了吸引人的功能和交互外,还要特别关注用户可感知的操作和响应速度,性能就显得尤为重要。本篇概括介绍了性能设计的整体思路、常见卡顿类型及性能调优工具等。

maniuT的博客 701

基于立创EDA的IP5389BZ+IP6829 100W有线15W无线带屏充电宝DIY全流程解析

本文详细解析了基于立创EDA平台,采用IP5389BZ和IP6829芯片DIY一款100W有线快充、15W无线充电并带显示屏的移动电源的全过程。内容涵盖核心功能规划、硬件选型、电路设计、PCB布局、焊接组装、分步调试以及软件逻辑,为电子爱好者提供了一份从原理到实践的完整指南,并重点强调了电池安全与IP6829供电电压等关键注意事项。

weixin_34374684的博客 306

uniapp性能优化专题

​ 优化建议 #避免使用大图 页面中若大量使用大图资源,会造成页面切换的卡顿,导致系统内存升高,甚至白屏崩溃。 尤其是不要把多张大图缩小后显示在一个屏幕内,比如上传图片前选了数张几 M 体积的照片,然后缩小在一个屏幕中展示多张几 M 的大图,非常容易白屏崩溃。 对大体积的二进制文件进行 base64,也非常耗费资源。 #优化数据更新 在uni-app中,定义在 data 里面的数据每次变化时都会通知视图层重新渲染页面。所以如果不是视图所需要的变量,可以不定义在 data 中,可在外部定义变量或直接

man2017的博客 1195

基于 ESP32 的智慧图书馆图书定位与借阅管理系统

本文设计的基于 ESP32 的智慧图书馆图书定位与借阅管理系统,以低成本、模块化、易部署为核心优势,融合 UWB 精准定位、RFID 自动识别、WiFi 无线通信技术,解决了传统图书馆的痛点问题。

weixin_42300449的博客 99

《SAP FICO系统配置从入门到精通共40篇》030、集成配置:FI与生产计划(PP)的自动科目确定

FI和PP的自动科目确定,本质上是把生产业务翻译成会计语言。翻译规则就藏在那些配置表里。配的时候多想一步:这个业务动作,在财务眼里是什么?是材料消耗?是产出入库?还是工费分摊?想清楚这个,再看配置界面,那些代码就不是天书了。最好的测试方式,是月底关账前,让生产部门跑一遍所有类型的生产订单。配置对不对,业务最知道。

985大学毕业,前某大厂员工,啥都会点的程序员! 574

如何在30分钟内优化你的APP设计?这里有3个简单方法

优化APP设计并非是一项复杂且耗时的任务。通过界面简化、交互优化和性能提升这3个简单方法,设计者可以在短时间内显著改善用户体验。本文介绍的方法不仅具有实用性和高效性,还结合了实际案例和工具资源,为设计者提供了全面的指导。希望这些方法能够帮助设计者在有限的时间内,打造出更加优质、高效的APP。本人是10年经验的前端开发和UI设计资深“双料”老司机,1500+项目交付经历,带您了解最新的观点、技术、干货,下方微信我可以和我进一步沟通。

2401_87844781的博客 1512

YoloV10改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。改进方法简单高效,需要发论文的同学不要错过!

m0_47867638的博客 1094

大型 APP 的性能优化思路

除了我这篇文章讲的内容外,还有很多优化的方案,这些方案不管是在大型 app 还是中小型 app 上都是通用的,比如深入了解业务,基于业务逻辑去做分析和优化,抓 trace,分析 trace 等等,或者基于系统层或者硬件层去做一些优化等等,这里就不再展开讲了。

OKCRW的博客 796

YOLOv8改进 | 注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

官方论文地址:官方论文地址点击此处即可跳转官方代码地址:官方代码地址点击此处即可跳转GAM旨在通过设计一种机制,减少信息损失并放大全局维度互动特征,从而解决传统注意力机制在通道和空间两个维度上保留信息不足的问题。GAM采用了顺序的通道-空间注意力机制,并对子模块进行了重新设计。具体来说,通道注意力子模块使用3D排列来跨三个维度保留信息,并通过一个两层的MLP增强跨维度的通道-空间依赖性。

Snu77的博客 4万+

[QMT量化交易小白入门]-九十五、多因子选股和趋势择时股票量化交易策略,年化收益率40.61%

本策略采用“双层过滤”机制:第一层基于多维度财务指标进行股票池筛选(多因子选股),第二层运用均线系统和MACD指标实施动态择时(趋势跟踪)。这种设计既保证了组合的质量下限,又能灵活应对市场波动。因子配置科学性:涵盖估值、成长、盈利、动量四大类因子风险控制精细化:设置动态止损与仓位管理机制信号验证严格性:多重条件交叉验证提升胜率。

木头大左的博客 799

SkyLab性能优化指南:如何在不影响App性能的情况下运行A/B测试

SkyLab是一个专为iOS和Mac应用设计的轻量级A/B测试框架,它让开发者能够在不影响应用性能的前提下进行多元测试和分桶实验。这个强大的测试工具通过智能的随机分配算法和高效的数据存储机制,确保每个用户获得一致的测试体验,同时保持应用的流畅运行。对于希望优化用户体验、提升转化率的移动应用开发者来说,SkyLab提供了简单易用的解决方案,让A/B测试变得轻松而高效。 ## 🚀 SkyLab的核

gitblog_00627的博客 778

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

鸿蒙5.0 APP性能优化实战——基于LTPO的低功耗设计

LTPO的全称是“ Low Temperature Polycrystalline Oxide”,翻译成中文是“低温多晶氧化物”。这是OLED屏背板的一种驱动技术。通过将OLED驱动电路中漏电相关的TFT换成IGZO TFT,降低显示功耗。LTPO屏给产品带来1~120Hz自适应刷新率的能力。使应用在需要高刷新率的场景可使用高刷新率提升流畅性,在视频、静止等场景又可使用低刷新率降低显示功耗,提升续航。习惯上,用“LTPO”指代自适应刷新率技术。LTPO指自适应刷新率技术。

mn_xiaona666的博客 1508

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

鸿蒙5.0 APP性能优化——性能框架设计

在应用开发中,开发者应致力于确保用户在使用应用程序时能够体验无缝、自然和舒适的感觉。流畅的体验不仅能够提高用户的满意度,还能够增强用户对应用程序的好感度,并对应用程序的成功与否产生重要影响。然而,感知流畅性不等同于系统性能。优秀的系统性能是保证用户感知流畅的必要条件,但好的系统性能不一定带来好的感知流畅性。系统性能、资源调度能力、图形渲染技术、硬件启动速度等指标必须通过界面反馈才能影响用户的感知,这意味着应用程序的界面设计、交互体验以及性能优化应当经过精心考量。

mn_xiaona666的博客 1110

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

一线大厂资深APP性能优化总结(含美团、淘宝、支付宝、抖音等等)

Android App 启动优化全记录Android 中如何计算 App 的启动时间?应用启动时间Android 冷启动优化除了老三样还有哪些新招?支付宝 App 构建优化解析Redex 初探与 Interdex:Andorid 冷启动优化抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%第三章 流畅度在不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。

2401_89872968的博客 1198

终极Robust性能优化指南:10个减少热修复对App性能影响的实用技巧

Robust是美团点评推出的移动应用性能优化库,专注于提升热修复效率并减少对App性能的影响。本指南将分享10个经过实践验证的优化技巧,帮助开发者在使用Robust进行热修复时保持App的流畅体验。 ## 一、了解Robust热修复架构 Robust采用插件化架构设计,主要由三个核心组件构成: [![Robust热修复架构图](https://raw.gitcode.com/gh_mirro

gitblog_00994的博客 661
上一篇: 月薪15.5K 创业失败,负债累累,他是如何通过软件测试逆风翻盘的?
下一篇: 测试报告别踩坑
字节自动化测试
博客等级 码龄6年 7034粉丝 1810原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值