【Android】关于binder_calls_stats服务
Android 9上有了binder_calls_stats服务,提供了java层的binder统计,
Android中的Binder Call Stats(Binder调用统计)是一项用于监控和记录Android系统中Binder通信的统计信息的功能。Binder是Android中的一种进程间通信(IPC)机制,用于在不同的进程之间传递数据和调用方法。
Binder Call Stats提供了有关Binder调用的性能和统计数据,帮助开发人员分析和优化系统的性能。它可以提供以下信息:
-
Binder调用次数:统计Binder方法被调用的次数,包括进程间的远程调用和本地调用。
-
Binder调用耗时:记录Binder方法的执行时间,包括调用传输数据的时间和远程进程执行方法的时间。
-
Binder调用堆栈跟踪:跟踪Binder调用的堆栈信息,可以帮助开发人员确定调用路径和定位性能瓶颈。
-
Binder调用的进程和线程信息:记录Binder调用发生的进程和线程信息,有助于分析系统中不同组件之间的通信情况。
通过分析Binder Call Stats,开发人员可以识别性能瓶颈、优化IPC通信,改进应用程序的响应性能和资源利用率。
要收集Binder Call Stats,开发人员可以使用Android系统提供的工具和API,例如使用adb shell命令进行监测,或者使用Trace类和Debug类提供的方法进行手动埋点和记录统计数据。
需要注意的是,Binder Call Stats对于普通应用程序开发人员来说可能并不常用,主要用于系统级开发和性能调优。
public class BinderCallsStatsService extends Binder {
30
31 private static final String TAG = "BinderCallsStatsService";
32
33 private static final String PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING
34 = "persist.sys.binder_calls_detailed_tracking";
35
36 public static void start() {
37 BinderCallsStatsService service = new BinderCallsStatsService();
38 ServiceManager.addService("binder_calls_stats", service);
39 boolean detailedTrackingEnabled = SystemProperties.getBoolean(
40 PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, false);
41
42 if (detailedTrackingEnabled) {
43 Slog.i(TAG, "Enabled CPU usage tracking for binder calls. Controlled by "
44 + PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING
45 + " or via dumpsys binder_calls_stats --enable-detailed-tracking");
46 BinderCallsStats.getInstance().setDetailedTracking(true);
47 }
48 }
49
50 public static void reset() {
51 Slog.i(TAG, "Resetting stats");
52 BinderCallsStats.getInstance().reset();
53 }
54
55 @Override
56 protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
57 if (args != null) {
58 for (final String arg : args) {
59 if ("-a".equals(arg)) {
60 // We currently dump all information by default
61 continue;
62 } else if ("--reset".equals(arg)) {
63 reset();
64 pw.println("binder_calls_stats reset.");
65 return;
66 } else if ("--enable-detailed-tracking".equals(arg)) {
67 SystemProperties.set(PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, "1");
68 BinderCallsStats.getInstance().setDetailedTracking(true);
69 pw.println("Detailed tracking enabled");
70 return;
71 } else if ("--disable-detailed-tracking".equals(arg)) {
72 SystemProperties.set(PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, "");
73 BinderCallsStats.getInstance().setDetailedTracking(false);
74 pw.println("Detailed tracking disabled");
75 return;
76 } else if ("-h".equals(arg)) {
77 pw.println("binder_calls_stats commands:");
78 pw.println(" --reset: Reset stats");
79 pw.println(" --enable-detailed-tracking: Enables detailed tracking");
80 pw.println(" --disable-detailed-tracking: Disables detailed tracking");
81 return;
82 } else {
83 pw.println("Unknown option: " + arg);
84 }
85 }
86 }
87 BinderCallsStats.getInstance().dump(pw);
88 }
89}
90
可以看到,是通过BinderCallsStats来进行统计的,而BinderCallsStats通过在Java层Binder对象中的使用来进行记录,
frameworks/base/core/java/android/os/Binder.java
// Entry point from android_util_Binder.cpp's onTransact
714 private boolean execTransact(int code, long dataObj, long replyObj,
715 int flags) {
716 BinderCallsStats binderCallsStats = BinderCallsStats.getInstance();
717 BinderCallsStats.CallSession callSession = binderCallsStats.callStarted(this, code);
718 Parcel data = Parcel.obtain(dataObj);
719 Parcel reply = Parcel.obtain(replyObj);
720 // theoretically, we should call transact, which will call onTransact,
721 // but all that does is rewind it, and we just got these from an IPC,
722 // so we'll just call it directly.
723 boolean res;
724 // Log any exceptions as warnings, don't silently suppress them.
725 // If the call was FLAG_ONEWAY then these exceptions disappear into the ether.
726 final boolean tracingEnabled = Binder.isTracingEnabled();
727 try {
728 if (tracingEnabled) {
729 Trace.traceBegin(Trace.TRACE_TAG_ALWAYS, getClass().getName() + ":" + code);
730 }
731 res = onTransact(code, data, reply, flags);
732 } catch (RemoteException|RuntimeException e) {
733 if (LOG_RUNTIME_EXCEPTION) {
734 Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
735 }
736 if ((flags & FLAG_ONEWAY) != 0) {
737 if (e instanceof RemoteException) {
738 Log.w(TAG, "Binder call failed.", e);
739 } else {
740 Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
741 }
742 } else {
743 reply.setDataPosition(0);
744 reply.writeException(e);
745 }
746 res = true;
747 } finally {
748 if (tracingEnabled) {
749 Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
750 }
751 }
752 checkParcel(this, code, reply, "Unreasonably large binder reply buffer");
753 reply.recycle();
754 data.recycle();
755
756 // Just in case -- we are done with the IPC, so there should be no more strict
757 // mode violations that have gathered for this thread. Either they have been
758 // parceled and are now in transport off to the caller, or we are returning back
759 // to the main transaction loop to wait for another incoming transaction. Either
760 // way, strict mode begone!
761 StrictMode.clearGatheredViolations();
762 binderCallsStats.callEnded(callSession);
763
764 return res;
765 }
而更加底层的统计,可以查看/dev/binder 里面的binder_status
binder_status是Android系统中的一个特殊文件,用于提供有关Binder驱动程序状态的信息。该文件位于/proc/binder/status路径下,只有在具有root权限或系统签名的设备上才能访问。
binder_status文件提供了有关Binder驱动程序的各种统计和状态信息,包括:
-
总体信息:包括Binder线程池的大小、当前正在等待的线程数等。
-
事务计数:显示有关Binder事务(包括进程间通信和本地调用)的计数信息,例如总事务数、活动事务数、等待事务数等。
-
线程信息:列出了所有活动的Binder线程的详细信息,包括线程ID、所属进程、线程状态等。
-
回收信息:显示已回收的Binder对象和节点的数量。
通过读取binder_status文件,您可以获取有关Binder驱动程序的运行状况和性能指标的信息,这对于调试和分析Binder相关问题非常有用。然而,由于它提供的信息非常底层和详细,需要一定的理解和背景知识才能正确解读和使用这些数据。
请注意,访问binder_status文件需要root权限或系统签名,并且在正常情况下,一般用户不需要直接访问或操作该文件。
相关文章:
【Android】关于binder_calls_stats服务
Android 9上有了binder_calls_stats服务,提供了java层的binder统计, Android中的Binder Call Stats(Binder调用统计)是一项用于监控和记录Android系统中Binder通信的统计信息的功能。Binder是Android中的一种进程间通信ÿ…...
给前端返回http链接,由于浏览器缓存不能获取到最新资源怎么办?
1、问题描述 今天在工作中接到这样一个需求,接收前端的图片文件并上传到远程,将原有图片覆盖并返回一个http链接以供前端展示。用户使用后反馈没有修改成功,上了远程拉图片发现已经修改了,但是用户浏览器还是老的图片。排查原因是…...
【Java Web】检查用户登录状态,防止用户访问到非法页面
使用拦截器 在方法前标注自定义注解拦截所有请求,只处理带有该注解的方法 自定义注解: 常用元注解:Target, Rentention, Document, Inherited如何读取注解: - Method.getDeclaredAnnotations() - Method.getAnnotaion(Class<T&…...
数学建模——校园供水系统智能管理
import pandas as pd data1pd.read_excel("C://Users//JJH//Desktop//E//附件_一季度.xlsx") data2pd.read_excel("C://Users//JJH//Desktop//E//附件_二季度.xlsx") data3pd.read_excel("C://Users//JJH//Desktop//E//附件_三季度.xlsx") data4…...
分布式集群——搭建Hadoop环境以及相关的Hadoop介绍
系列文章目录 分布式集群——jdk配置与zookeeper环境搭建 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍 文章目录 前言 一 hadoop的相关概念 1.1 Hadoop概念 补充:块的存储 1.2 HDFS是什么 1.3 三种节点的功能 I、NameNode节点 II、fsimage与edits…...
Python的os.walk()函数使用案例
在Python中,os模块是一个非常实用的工具,它可以让我们与操作系统进行交互,操作文件和目录。在本文中,我们将详细介绍os模块中的遍历文件功能,并通过具体案例和使用场景来解释。 首先,导入os模块。在Pytho…...
学习JAVA打卡第四十五天
StringBuffer类 StringBuffer对象 String对象的字符序列是不可修改的,也就是说,String对象的字符序列的字符不能被修改、删除,即String对象的实体是不可以再发生变化,例如:对于 StringBuffer有三个构造方法ÿ…...
创建K8s pod Webhook
目录 1.前提条件 2.开始创建核心组件Pod的Webhook 2.1.什么是Webhook 2.2.在本地k8s集群安装cert-manager 2.3.创建一个空的文件夹 2.4. 生成工程框架 2.5. 生成核心组件Pod的API 2.6.生成Webhook 2.7.开始实现Webhook相关代码 2.7.1.修改相关配置 2.7.2.修改代码 2…...
抓包-要抓取Spring Boot应用程序的请求
要抓取Spring Boot应用程序的请求,可以按照以下步骤进行操作: 1. 确保你已经按照之前提到的方法设置了Charles代理,并在Charles的SSL代理设置中添加了Spring Boot应用程序的域名。 2. 在Spring Boot应用程序的代码中,添加以下配…...
jmeter+nmon+crontab简单的执行接口定时压测
一、概述 临时接到任务要对系统的接口进行压测,上面的要求就是:压测,并发2000 在不熟悉系统的情况下,按目前的需求,需要做的步骤: 需要有接口脚本需要能监控系统性能需要能定时执行脚本 二、观察 >针…...
ZooKeeper基础命令和Java客户端操作
1、zkCli的常用命令操作 (1)Help (2)ls 使用 ls 命令来查看当前znode中所包含的内容 (3)ls2查看当前节点数据并能看到更新次数等数据 (4)stat查看节点状态 (5…...
【数据分享】2000-2020年全球人类足迹数据(无需转发\免费获取)
人类足迹(Human Footprint)是生态过程和自然景观变化对生态环境造成的压力,是世界各国对生物多样性和生态保护的关注重点。那如何才能获取长时间跨度的人类足迹时空数据呢? 之前我们分享了来自于中国农业大学土地科学与技术学院的城市环境监测及建模&am…...
基于机器学习的fNIRS信号质量控制方法
摘要 尽管功能性近红外光谱(fNIRS)在神经系统研究中的应用越来越广泛,但fNIRS信号处理仍未标准化,并且受到经验和手动操作的高度影响。在任何信号处理过程的开始阶段,信号质量控制(SQC)对于防止错误和不可靠结果至关重要。在fNIRS分析中&…...
分布式锁的三种实现方式是什么?
分布式锁三种实现方式: 基于数据库实现分布式锁;基于缓存(Redis等)实现分布式锁;基于Zookeeper实现分布式锁; 一, 基于数据库实现分布式锁 悲观锁 利用select … where … for update 排他锁…...
华为云软件精英实战营——感受软件改变世界,享受Coding乐趣
机器人已经在诸多领域显现出巨大的商业价值,华为云计算致力于以云助端的方式为机器人产业带来全新机会 如果您是开发爱好者,想了解华为云,想和其他自由开发者交流经验; 如果您是学生,想和正在从事软件开发行业的大佬…...
贪心算法总结篇
文章转自代码随想录 贪心算法总结篇 我刚刚开始讲解贪心系列的时候就说了,贪心系列并不打算严格的从简单到困难这么个顺序来讲解。 因为贪心的简单题可能往往过于简单甚至感觉不到贪心,如果我连续几天讲解简单的贪心,估计录友们一定会不耐…...
ICCV 2023 | 港中文MMLab: 多帧光流估计模型VideoFlow,首次实现亚像素级别误差
本文提出了一个多帧光流估计模型 VideoFlow,旨在充分挖掘视频中的时序信息和运动规律,避免当前主流方法只以两帧图片作为输入而面临的信息瓶颈,显著提升了光流估计的性能。 在公开的 Sintel Bechmark 上,VideoFlow 在 Clean 和 Fi…...
【python爬虫】—图片爬取
图片爬取 需求分析Python实现 需求分析 从https://pic.netbian.com/4kfengjing/网站爬取图片,并保存 Python实现 获取待爬取网页 def get_htmls(pageslist(range(2, 5))):"""获取待爬取网页"""pages_list []for page in pages:u…...
自动化运维工具—Ansible
一、Ansible概述1.1 Ansible是什么1.2 Ansible的特性1.3 Ansible的特点1.4 Ansible数据流向 二、Ansible 环境安装部署三、Ansible 命令行模块(1)command 模块(2)shell 模块(3)cron 模块(4&…...
uniapp 安卓平台签名证书(.keystore)生成
安装JRE环境 下载jre安装包:https://www.oracle.com/java/technologies/downloads/#java8安装jre安装包时,记录安装目录(例:C:\Program Files\Java\jdk-20)打开命令行(cmd),将JRE安装路径添加到系统环境变量 d: se…...
从SolidWorks到Geant4仿真:我的第一个粒子探测器CAD模型导入全记录(含CADMesh避坑点)
从SolidWorks到Geant4仿真:我的第一个粒子探测器CAD模型导入全记录(含CADMesh避坑点) 作为一名刚接触粒子探测器仿真的研究生,我花了整整两周时间才成功将SolidWorks设计的模型导入Geant4进行模拟。这个过程远比想象中复杂&#x…...
CoPaw:让AI代码助手深度适配个人项目与团队规范的工程化实践
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫CoPaw,作者是 alexgzx。光看名字可能有点摸不着头脑,但如果你对 AI 辅助编程、代码生成或者想提升自己的开发效率感兴趣,那这个项目绝对值得你花时间研究一下。简单来说…...
OpenCore Legacy Patcher终极指南:5步让老旧Mac完美运行最新macOS系统
OpenCore Legacy Patcher终极指南:5步让老旧Mac完美运行最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...
3步实现专业级AI换脸:roop-unleashed创新方案指南
3步实现专业级AI换脸:roop-unleashed创新方案指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 在数字创意飞速发展的今天,AI换脸…...
3DS游戏格式转换实战指南:5步完成CCI到CIA的高效转换
3DS游戏格式转换实战指南:5步完成CCI到CIA的高效转换 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 作为一名3…...
【最新v2.7.1 版本安装包】OpenClaw 小白入门必看,零基础无需命令零代码保姆级教学
OpenClaw v2.7.1 一键安装部署教程|可视化傻瓜式搭建 ✨适配系统:Windows10/11 64 位 ✨当前版本:v2.7.1 版本(虾壳云版) ✨安装包大小:58.7MB 【点击下载最新安装包】https://xiake.yun/api/download/…...
基于Vanilla JS与IndexedDB构建本地化Markdown笔记工具
1. 项目概述:从零开始构建一个轻量级笔记工具最近在整理个人知识库时,发现市面上的笔记软件要么功能过于臃肿,要么云端同步存在隐私顾虑,要么就是定制化程度不够。作为一个有十多年开发经验的从业者,我决定自己动手&am…...
SoC片上系统:从架构原理到选型实战的深度解析
1. 项目概述:从“黑盒子”到“智慧核心”的认知跃迁在电子产品的世界里,我们常常惊叹于一部智能手机的纤薄与强大,它既能流畅播放高清视频,又能处理复杂的游戏画面,还能实时连接网络、定位导航。这一切的背后ÿ…...
GitHub自动化运维:构建模块化Operator集提升开发效率
1. 项目概述:一个为GitHub开发者量身定制的“操作集”如果你是一个重度GitHub用户,无论是维护个人项目、参与开源贡献,还是管理团队仓库,大概率都经历过这样的场景:每天要重复执行一堆琐碎但必要的操作。比如ÿ…...
基于GEMMA与NeoPixel制作智能可穿戴首饰:从硬件选型到代码实现
1. 项目概述:当微型控制器遇见珠宝设计几年前,当我第一次把一块微控制器塞进一个首饰盒里,看着它驱动一圈LED发出柔和的光晕时,我就知道,电子制作和个性化穿戴的结合,远不止于智能手表或健身手环。我们今天…...
