am trace-ipc使用小技巧之Binder服务端方法systrace打印剖析

Android性能优化实战:使用Perfetto精准定位与解决卡顿问题 在移动应用开发中,性能优化是提升用户体验的关键环节,而卡顿问题则是其中最常见且棘手的挑战之一。其核心原理在于应用主线程的响应时间超过了屏幕刷新的帧间隔(通常为16.6ms),导致画面渲染延迟。为了有效解决此问题,开发者需要借助强大的系统级跟踪工具来洞察应用、框架乃至内核层的实时运行状态。Perfetto作为Google推出的下一代高性能跟踪框架,正是为此而生。它通过统一的生产者-服务-消费者模型,低开销地采集包括CPU调度、图形渲染、内存分配在内的多维度数据,为性能剖析提供了前所未有的深度和广度。在工程实践 阅读详情
AI摘要

本文围绕安卓Binder跨进程方法在systrace中的打印展开。此前客户端有详细跨进程方法展示,服务端却没有。通过在frameworks/base/core/java/android/os/Binder.java中分析,发现需开放Trace.TRACE_TAG_AIDL,抓取trace时带上aidl参数可解决。还对相关trace输出TAG进行分析,总结了实现完整打印的步骤。

背景

上一篇文章

Binder通讯如何打印client调用堆栈即systrace查看对应方法
已经介绍了Binder调用相关的堆栈打印还有在systrace下面也有相关的调用发起的binder的方法名字打印。

但是同时也有学员朋友提出相关的疑问

客户端展示详细跨进程方法
com.android.internal.app.IAppOpsService S t u b Stub StubProxy.checkOperation
客户端有方法名字展示
但是服务端没有看到有详细方法展示在这里插入图片描述
正常应该是需要两端都有详细方法展示。

解决方法讲解

frameworks/base/core/java/android/os/Binder.java

private boolean execTransactInternal(int code, Parcel data, Parcel reply, int flags,
            int callingUid) {
        final boolean tagEnabled = Trace.isTagEnabled(Trace.TRACE_TAG_AIDL);
      
        final boolean tracingEnabled = tagEnabled && transactionTraceName != null;
        try {
        	
            if (tracingEnabled) {
            //这里有相关的traceBegin打印
                Trace.traceBegin(Trace.TRACE_TAG_AIDL, transactionTraceName);
            }

            // TODO - this logic should not be in Java - it should be in native
            // code in libbinder so that it works for all binder users. Further,
            // this should not re-use flags.
            if ((flags & FLAG_COLLECT_NOTED_APP_OPS) != 0 && callingUid != -1) {
                AppOpsManager.startNotedAppOpsCollection(callingUid);
                try {
                    res = onTransact(code, data, reply, flags);
                } finally {
                    AppOpsManager.finishNotedAppOpsCollection();
                }
            } else {
                res = onTransact(code, data, reply, flags);
            }
        } catch (RemoteException|RuntimeException e) {
         
        } finally {
            if (tracingEnabled) {
                Trace.traceEnd(Trace.TRACE_TAG_AIDL);
            }

        return res;
    }

大家都知道服务端执行一般是onTransact开始,这里面也可以看到有了相关的trace打印到systrace,但是实际上我们并没有看到有相关的trace有打印。代码中也可以看出线索,这里的Trace打印输出的tag是Trace.TRACE_TAG_AIDL,要这个可以打印出来那么必须要Trace.TRACE_TAG_AIDL是开放的状态。
那么我们尝试抓取trace时候带上aidl参数试试:
在这里插入图片描述
抓取trace之后的结果如下:

在这里插入图片描述
果然发现这里服务端已经有了相关的跨进程详细方法
整体格式

AIDL::java::IAppOpsService::checkOperation::server

AIDL::java 即代表java类型的跨进程方法
IAppOpsService::checkOperation 代表具体服务端方法
server 代表服务端

这个trace打印同时也支持一些cpp端的打印

例如可以看下面:
在这里插入图片描述在这里插入图片描述上面就是apk应用进程发起跨进程调用ISurfaceComposer::createDisplayEventConnection

AIDL::cpp::ISurfaceComposer::createDisplayEventConnection::cppClient
AIDL::cpp::ISurfaceComposer::createDisplayEventConnection::cppServer

AIDL::cpp代表是cpp代码发起跨进程调用

ISurfaceComposer::createDisplayEventConnection 跨进程的具体方法

cppClient,cppServer代表跨进程客户端,服务端

相关trace输出TAG分析

这里可以看一下相关源码
在这里插入图片描述
在这里插入图片描述大家可以看到这里其实也有相关注释说明这些名字的其实由aidl工具生成的

如果是cpp代码情况:

这里可以寻找到对的aidl生成的相关的文件:

比如寻找ISurfaceComposer.aidl文件生成的cpp

test@test:~/disk2/aosp14/out/soong/.intermediates/frameworks$ find -name ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_vendor.34_x86_x86_64_static/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_x86_x86_64_static_afdo-libgui_lto-thin/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_vendor.34_x86_64_static_afdo-libgui_lto-thin/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_vendor.34_x86_x86_64_static_afdo-libgui_lto-thin/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_x86_64_static_afdo-libgui_lto-thin/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_x86_64_static/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_x86_x86_64_static/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_x86_64_static_afdo-surfaceflinger_lto-thin/gen/aidl/android/gui/ISurfaceComposer.cpp
./native/libs/gui/libgui_aidl_static/android_vendor.34_x86_64_static/gen/aidl/android/gui/ISurfaceComposer.cpp
test@test:~/disk2/aosp14/out/soong/.intermediates/frameworks$ vi ./native/libs/gui/libgui_aidl_static/android_x86_64_static/gen/aidl/android/gui/ISurfaceComposer.cpp


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

总结

这里的systrace打印跨进程的方法,不是针对所有接口都有哈,一般针对aidl文件实现的接口才有,因为都是会通过aidl工具进行编译时候植入相关trace,本质上要systrace可以看到更多完整的aidl接口相关调用,需要以下两步:

1、adb shell am trace-ipc start

2、抓取perfetto时候偶带上tag为aidl

本文基础参考:

Binder通讯如何打印client调用堆栈即systrace查看对应方法

更多framework实战干货,请关注下面“千里马学框架”

爱奇艺Android校招笔试B卷复盘:HashMap、Handler、Binder与性能优化全解析 Android开发中,对系统核心机制和性能调优的理解,往往决定了一款App的体验上限。从数据结构与并发编程的底层原理,到消息循环与跨进程通信(如Handler、Binder)的设计哲学,再到Bitmap加载、ANR排查等实战优化,都是开发者绕不开的知识点。面试或笔试中,这些内容常以场景化方式出现,要求既能解释概念,又能结合视频播放、信息流滑动等真实业务给出方案。本文基于一份爱奇艺校招Android方向笔试B卷,拆解HashMap树化、线程池参数、启动模式选用、Binder通信机制、图片内存计算、LeakCa 阅读详情

相关推荐

Android图形系统核心:BufferQueue、VSYNC与HWC协同机制解析

Android图形系统本质是一套以时间确定性为核心的实时协作架构,其核心在于解耦绘制与显示——通过BufferQueue实现生产者-消费者异步缓冲,依托VSYNC信号作为跨层同步节拍器,再由HWC(硬件合成器)卸载GPU压力。这种设计解决了CPU/GPU/Display Controller多域资源争抢下的低延迟、低功耗、高一致性帧输出难题。技术价值体现在60fps稳定渲染、ANR规避、GPU占用率优化等工程刚需;典型应用场景涵盖RecyclerView流畅滑动、视频播放、多图层UI合成及自研渲染引擎开发。

weixin_30824479的博客 402

debug:am trace-ipc源码分析

如果您有 binder 事务,则可以使用以下adb命令做了什么呢,打开每个进程的binder trace记录开关tracingEnabled。当本进程发起ipc时获取调用栈保存起来TransactionTracker#mTraces。打开systrace开关,此时抓systrace、perfetto会记录slice命令将上述每个进程保存的调用栈写入到文件还有个Binder.ProxyTransactListener值得关注。...

superjaingchao的专栏 515

Android Camera HAL深度解析:调度中枢与buffer管理核心

Camera HAL是Android多媒体系统中连接Framework与硬件的关键抽象层,其本质并非黑盒,而是实时调度中枢,负责Sensor、ISP、DMA等模块的时序协同与资源仲裁。它通过标准化接口(Legacy/HIDL/AIDL)实现硬件解耦,核心价值在于保障帧数据通路的低延迟、高可靠与内存安全。技术关键点集中于多媒体buffer管理策略、HAL与底层驱动(如ll库)的职责边界、以及VTS认证所需的契约化行为。典型应用场景包括预览卡顿优化、多摄并发控制、120fps高帧率实现及金融级安全加固。理解HA

weixin_34391445的博客 460

(两百四十八)shell —— 获取当前系统的ipc调用堆栈

1.方法 adb shell am trace-ipc start … use the app - scroll/animate ... $ adb shell am trace-ipc stop --dump-file /data/local/tmp/ipc-trace.txt $ adb pull /data/local/tmp/ipc-trace.txt 学习 https://developer.android.google.cn/topic/performance/vi...

JT的专栏 1514

Android Framework转型指南:从应用开发到系统服务理解

Android Framework是应用运行的底层契约,涵盖Activity管理、权限校验与窗口合成等核心机制。其原理基于服务协同(如AMS/PMS/WMS)与跨进程通信(Binder),技术价值在于保障稳定性、安全性和性能一致性。典型应用场景包括ANR分析、权限适配、窗口异常调试及后台保活优化。对应用开发者而言,掌握dumpsys命令、systrace追踪和系统日志解读,比通读AOSP源码更高效实用;通过adb shell工具链定位问题现象,再反向理解Framework服务交互逻辑,是实现从API调用者到

weixin_34183910的博客 314

DeepSeek研发的精算大模型「精卫」已实现98%精算任务覆盖,中国人寿采用后年节约3.2亿元技术采购成本,形成关键技术替代效应

根据现有资料,精算领域关键技术替代效应的行业标准定义尚未明确具体提及。然而,可以从相关文献中提取一些关键概念和方法来推导出可能的定义。​替代效应的基本定义​:替代效应是指一种商品价格变动引起另一种商品的相对价格变动,从而导致消费者在维持原有效用水平不变的条件下对商品需求量做出的调整。​技术替代效应​:在精算领域,技术替代效应可以理解为新技术或新方法对现有技术或方法的替代,从而影响精算模型、数据处理和决策过程。例如,机器学习在精算中的应用日益增长,改变了精算师的工作方式和模型构建方法。​。

百态·数智思维 | 聚焦大数据、量化与未来AI 1712

深入探索Android卡顿优化(下)

卡顿优化

QG 623

VisionMaster4.2.0与C#控件开发实战:从入门到精通的完整指南

本文详细介绍了VisionMaster4.2.0与C#控件开发的实战指南,从基础环境搭建到核心控件使用,再到高级功能实现。通过VmFrontendControl、VmGlobalToolControl等核心控件的深入解析,帮助开发者快速掌握机器视觉应用开发技巧,提升开发效率。特别适合需要集成VisionMaster4.2.0 SDK进行视觉系统开发的C#程序员。

weixin_42665725的博客 383

Android am与pm命令详解

前言:am全称为Activity Manager,活动管理器,可以用来控制activity、service; pm全称Package Manager 包管理器,用以管理系统中安装的应用。 adb shell进入android的命令界面后可执行am与pm命令 am命令大全 启动Activity start-activity [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>] [--sampling INTER.

pigdreams的博客 7084

API安全攻防实战:从信息搜集到漏洞利用的完整路径

本文详细解析了API安全攻防实战的全过程,从信息搜集到漏洞利用,涵盖了渗透测试的核心技巧和工具使用。通过真实案例展示如何发现和利用API漏洞,如HTTP方法滥用、内容类型转换攻击等,并提供企业级防御策略和测试心得,帮助安全研究人员提升API安全防护能力。

weixin_30394981的博客 434

Java 大视界 -- 基于 Java+Flink 构建实时电商交易风控系统实战(436)

本文介绍基于Java+Flink构建实时电商交易风控系统的实战经验。系统采用分层架构设计,包含数据采集层、实时计算层、规则引擎层、数据存储层和应用服务层,实现毫秒级风险识别与拦截。核心组件包括Flink 1.17处理交易数据流、Drools规则引擎动态匹配风险规则、Redis缓存热点数据等。文章详细提供了开发环境配置清单和Maven依赖说明,确保系统具备低延迟(≤200ms)、高吞吐(10万TPS)和高可用性(99.99%)特性。该方案已通过生产环境验证,可有效应对恶意刷单、盗刷支付等电商交易风险。

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 3942

Android卡顿优化--卡顿检测

卡顿问题检测,分:自动化卡顿检测方案 和 卡顿单点问题检测方案 两种。 1 自动化卡顿检测方案 为什么需要自动化检测方案? (1)系统工具适合线下针对性分析 (2)线上及测试环节需要自动化检测方案 方案的原理 (1)消息处理机制,一个线程只有一个Looper (2)mLogging对象在每个message处理前后被调用 (3)主线程发生卡顿,是在dispat...

gs344937933的专栏 3432

AUTOSAR进阶图解==>AUTOSAR_SWS_CANStateManager

AUTOSAR CAN状态管理器(CanSM)摘要 CanSM是AUTOSAR通信栈中的关键模块,负责管理CAN网络状态和模式转换。主要功能包括: 控制CAN控制器/收发器工作模式(STARTED/STOPPED,NORMAL/STANDBY) 处理三种网络状态(全通信、静默通信、无通信)之间的转换 监控和处理总线关闭(Bus-Off)事件 与ComM、CanIf、BswM等模块协同工作 CanSM通过状态机管理网络状态转换,支持可配置的总线关闭恢复策略。它为每个CAN网络维护独立的状态机,实现网络状态的精

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 5579

Android Input事件分发全链路解析:从硬件中断到View onTouchEvent

Input事件分发是Android触摸交互的底层基石,其本质是系统对硬件输入信号(如/dev/input/eventX)的统一采集、跨进程调度与UI线程协同处理过程。核心原理在于InputManagerService(IMS)通过InputReader和InputDispatcher双线程协作,结合WMS窗口管理实现事件路由,并依托Binder IPC与Choreographer VSync机制保障低延迟与渲染一致性。该机制支撑了手势识别、多点触控、焦点切换等关键能力,广泛应用于自定义View、手写板、游戏

weixin_34310369的博客 279

使用Python爬取在线图书馆的图书馆藏和阅读记录

通过使用Python编写爬虫程序,我们可以从在线图书馆上获取图书馆藏和阅读记录,帮助人们更好地管理和利用图书馆资源。本文简要介绍了爬虫程序的准备工作、网页解析和数据提取、数据的保存和处理的关键步骤,并提供了一个示例代码。在实际应用中,我们需要注意遵守在线图书馆的使用规则和爬虫道德准则,确保合法、合规地进行爬取操作。以上仅为概述,实际应用的过程中可能需要根据具体需求进行适当的调整和改进。

2201_76125393的博客 729

浏览器主页被2345劫持简单处理方法

本人比较常用的浏览器是IE和Chrome IE: 将网址修改为https://www.baidu.com 应用-确定-重新打开IE浏览器 或者win+r运行regedit打开注册表找到这个值   HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下  和HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main这个下面的StartPage ...

A soul tortured by desire 2万+

Android音频问题诊断四步法:分层隔离与信号溯源

Android音频系统是一条横跨App、Framework、HAL到Hardware的多层实时数据流,其本质是基于优先级与状态机的动态调度系统。理解AudioFlinger混音线程、AudioPolicy路由决策和ALSA底层设备注册原理,是定位无声、卡顿、回切失败等典型问题的技术基础。该架构具备强时序敏感性与资源抢占特性,导致Logcat日志常失效,而dumpsys audio状态快照、systrace音频着色、/proc/asound接口及厂商HAL调试工具构成更可靠的诊断支柱。本文聚焦Android

weixin_30843605的博客 281

Sigrity Power Tree如何生成电源树操作指导

Sigrity Power Tree可以方便地生成电源树,仅需要网表文件就能将系统的电源树直观的显示出来,生成的电源树文件可以用Power DC,optimizePI进行直流和交流仿真,下面介绍如何生成电源树。Base on [Device_TYPE and VALUE]就是识别网表中器件的Device_TYPE作为power tree中的模型的名字。Allegro layout netlist file,就是从Allegro layout文件中输出的netlist第三方网表文件。如何生成电源树操作指导。

weixin_54787054的博客 1534

低功耗开发实战:从GPIO漏电到AlarmManager滥用的归因分析

低功耗不是软件开关或睡眠函数调用,而是贯穿硬件电路、SoC寄存器、操作系统电源管理与应用逻辑的系统工程。其核心原理在于控制芯片在非活动期进入深度静默状态,并确保事件触发时毫秒级精准唤醒。技术价值体现在延长电池寿命、降低散热负担、满足医疗/车载等严苛可靠性要求。典型应用场景包括智能穿戴设备待机优化、工业传感器节点野外续航提升、安卓APP后台耗电治理等。本文聚焦真实产线问题——如STM32 GPIO浮空输入引发周期性唤醒、Wi-Fi模组auto-scan固件bug、AlarmManager滥用导致CPU频繁退出

weixin_33816300的博客 315

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

零基础读懂设备低功耗开发:从电流测量到内核休眠的全栈实践

低功耗开发是嵌入式与安卓系统中保障设备续航与稳定运行的核心技术,其本质在于对电能的精确计量、受控释放与按需唤醒。它根植于硬件电源域设计、SoC时钟树管理、操作系统CPU Idle与Runtime PM框架、驱动状态机控制及应用层唤醒源治理等多层协同。关键技术包括电流精准测量(μA级脉冲捕获)、电源域隔离验证、设备树idle-states配置、WakeLock与cpuidle机制联动、以及跨平台软硬协同休眠。本文以ESP32实测、Linux内核调试、Android batterystats分析和STM32L4

weixin_34054931的博客 194

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

part 5 App卡顿优化

Part 5 App卡顿优化 一 卡顿介绍及优化工具选择 背景: 对用户来说:很多性能问题不易被发现,但是卡顿很容易被直观感受 对开发者来说:卡顿问题难以定位 卡顿问题难在哪里: 产生的原因错综复杂:代码、内存、绘制、IO? 不易复现:与用户当时场景相关 1、CPU Profiler 图形的形式展示执行时间、调用栈等 信息全面,包含所有线程 运行时开销严重,整体都会变慢 使用方式 Debug.s...

zsjlovesm521的博客 883

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

adb shell am(系统服务:activity)

adb shell am

深度安全实验室 1620
上一篇: framework踩坑:aosp/lineageos系统apk签名导出到as进行使用
下一篇: 千里马2024年终总结-android framework实战
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值