Android statsd 埋点简析

源码基于:Android U

0. 前言

最近在研究 Android 自带的系统数据指标采集功能,框架依旧很严谨、完美,这里做个分享。

1. Android S 之后变化

stats 的代码从 framework 或 system/core 中转移到了 packages/modules/StatsD 目录中。

2. 框架图

大的框架分两层:

  • system_sever;

  • statsd;

Java 层创建两个 SystemService:

  • StatsCompanion.Lifecycle:会启动两个Service 用以与 native daemon 通信;

  • StatsPullAtomService:SystemServer 中用来采集数据;

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。

StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultReceiverpullFinished函数,并将 StatsPullAtomService 端采集的数据存入StatsCallbackPuller::PullInternal的入参中;

packages/modules/StatsD/framework/java/android/app/StatsManager.javapublic void onPullAtom(int atomTag, IPullAtomResultReceiver resultReceiver) {final long token = Binder.clearCallingIdentity();try {mExecutor.execute(() -> {List<StatsEvent> data = new ArrayList<>(); //上层的采集数据存入dataint successInt = mCallback.onPullAtom(atomTag, data); //callback,开始采集boolean success = successInt == PULL_SUCCESS;StatsEventParcel[] parcels = new StatsEventParcel[data.size()];for (int i = 0; i < data.size(); i++) {parcels[i] = new StatsEventParcel();parcels[i].buffer = data.get(i).getBytes(); //转换成parcel,传入native}try {resultReceiver.pullFinished(atomTag, success, parcels); //receiver回调} catch (RemoteException e) {...}});} finally {Binder.restoreCallingIdentity(token);}}
packages/modules/StatsD/statsd/src/external/StatsCallbackPuller.cppPullErrorCode StatsCallbackPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) {...shared_ptr<vector<shared_ptr<LogEvent>>> sharedData =make_shared<vector<shared_ptr<LogEvent>>>();shared_ptr<PullResultReceiver> resultReceiver = SharedRefBase::make<PullResultReceiver>([cv_mutex, cv, pullFinish, pullSuccess, sharedData]( //receiver回调int32_t atomTag, bool success, const vector<StatsEventParcel>& output) {{lock_guard<mutex> lk(*cv_mutex);for (const StatsEventParcel& parcel: output) {shared_ptr<LogEvent> event = make_shared<LogEvent>(/*uid=*/-1, /*pid=*/-1);bool valid = event->parseBuffer((uint8_t*)parcel.buffer.data(),parcel.buffer.size());if (valid) {sharedData->push_back(event); //解析上层采集数据,存入sharedData} else {StatsdStats::getInstance().noteAtomError(event->GetTagId(),/*pull=*/true);}}*pullSuccess = success;*pullFinish = true;}cv->notify_one();});// Initiate the pull. This is a oneway call to a different process, except// in unit tests. In process calls are not oneway.Status status = mCallback->onPullAtom(mTagId, resultReceiver); //callback,等待receiver回调...{unique_lock<mutex> unique_lk(*cv_mutex);// Wait until the pull finishes, or until the pull timeout.cv->wait_for(unique_lk, chrono::nanoseconds(mPullTimeoutNs),[pullFinish] { return *pullFinish; });if (!*pullFinish) {...} else {if (*pullSuccess) {*data = std::move(*sharedData); //数据最终填充到入参data中}...}
}

StatsPullerManager::OnAlarmFired 最终会调用 StatsCallbackPuller::PullInternal,参数也是这里传入的。所以采集的数据最终会回到 StatsPullerManager::OnAlarmFired 中,最终会将这些数据通过注册在StatsPullerManager中的 mReceivers 的回调函数 onDataPulled处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3266692.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 粒子群优化算法&#xff08;PSO&#xff09; 4.2 分组卷积神经网络&#xff08;GroupCNN&#xff09; 4.3 PSO优化GroupCNN 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行…

算法第十五天:leetcode19.删除链表的倒数第N个节点

一、删除链表的倒数第N个节点的题目描述与链接 19.删除链表的倒数第N个节点的链接如下表所示&#xff0c;您可直接复制下面网址进入力扣学习&#xff0c;在观看下面的内容之前您一定要先做一遍哦&#xff0c;以便让我印象更深刻&#xff01;&#xff01;!https://leetcode.cn/p…

stm32串口通信协议(标准库 and HAL库)

刚入门32&#xff0c;接触的第一个通信协议就是串口通信&#xff0c;所谓通信协议&#xff0c;就是指两个设备之间互联&#xff0c;将两个设备关联起来&#xff0c;使其可以相互之间传输数据&#xff0c;利用串口通信最常见的例子就是蓝牙模块。 下面为学习串口之后的一些简单…

快速入门了解Ajax

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Ajax的初识 意义&#xff1a;AJAX&#xff08;Asynchronous JavaScript and…

相关性模型-正态分布均值假设检验★★★

该博客为个人学习清风建模的学习笔记&#xff0c;部分课程可以在B站&#xff1a;【强烈推荐】清风&#xff1a;数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 目录 1双侧检验 2单侧检验 3t检验 4两个正态总体均值差的检验 5逐对比较法 …

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 首先我们打开页面&#xff0c;准备搭建项目的初始准备 1.New Project 2.随后点击Next&#xff0c;勾…

【C++经典面试题】字符串类String的接口代码实现(重点考察对浅拷贝与深拷贝的理解)

在C++程序中会频繁地使用到字符串,很多信息是作为字符串保存在内存中的。字符串类是C++程序中常用的类之一,比如MFC中的CString类、C++标准库中的string(ANSI窄字节版本)和wstring(UNICODE宽字节版本)类。 C++程序员在面试时时常会遇到字符串相关的问题,比如一个…

Python酷库之旅-第三方库Pandas(046)

目录 一、用法精讲 161、pandas.Series.cumsum方法 161-1、语法 161-2、参数 161-3、功能 161-4、返回值 161-5、说明 161-6、用法 161-6-1、数据准备 161-6-2、代码示例 161-6-3、结果输出 162、pandas.Series.describe方法 162-1、语法 162-2、参数 162-3、功…

visual studio 配置路径中 用户宏的修改(备忘)

visual studio 2013 开发工具界面中&#xff1a;视图 --> 其它窗口 --> 属性管理器 &#xff08;如下图&#xff09; 接着开发工具界面会显示出“属性管理器”的界面 &#xff08;如下图&#xff09; 在‘属性管理器’界面中&#xff0c;找到‘opencv’右击&#xff…

ctfshow-web入门-php特性(web132-web136)

目录 1、web132 2、web133 3、web134 4、web135 5、web136 1、web132 存在 robots.txt 访问 /admin 需要传三个参数&#xff0c;并且需要满足&#xff1a; if($code mt_rand(1,0x36D) && $password $flag || $username "admin"){if($code admin){ech…

shell-awk文本处理工具

1、awk概述 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言&#xff0c;也是行处理软件&#xff0c;通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …

【Gitlab】SSH配置和克隆仓库

生成SSH Key ssh-keygen -t rsa -b 4096 私钥文件: id_rsa 公钥文件:id_rsa.pub 复制生成的ssh公钥到此处 克隆仓库 git clone repo-address 需要进行推送和同步来更新本地和服务器的文件 推送更新内容 git push <remote><branch> 拉取更新内容 git pull &…

【Django】django模板与前端技术(html模板)

文章目录 “python包html”还是“html包python”?1.新建模板2.模板语法3.views.py测试 “python包html”还是“html包python”? 在前端页面中html代码比python多得多&#xff0c;所以一定是html包python最优&#xff01;于是引出今天的模板。 大体分为三个步骤&#xff1a;…

CPU350% JVM GC频繁并GC不掉EXCEL导出

背景&#xff1a; 有个Excel导出的需求&#xff0c;测试的时候&#xff0c;只要连续导出大量的数据就会导致FAT机器反请求反应迟钝&#xff0c;甚至卡死&#xff0c;无法恢复。 排查&#xff1a; 1 跳板机跳到机器上&#xff0c;查看 项目 ipd 执行ps -ef | grep 项目名称.j…

解决学生技能短板:泰迪智能科技2024年中职大数据实验室,全面提升学生实践能力

一、中职院校现状及实验室建设背景 在当今信息化时代&#xff0c;大数据技术已成为国家战略发展的重要方向。中职院校作为我国职业教育体系的重要组成部分&#xff0c;肩负着培养高素质技术技能人才的重任。然而&#xff0c;目前我国中职院校在大数据教育方面存在以下问题&…

Django Web开发:构建强大RBAC权限管理系统的实战指南

文章目录 前言一、rbac 基于角色的权限管理1.acl 基于用户的权限管理2.rbac 基于角色的权限管理 二、应用示例1.配置角色资源a.分析表b.核心逻辑c.使用transfer在前端实现资源配置d.页面效果 2.登录时获取对应权限a.员工登录b.中间件c.前端请求d.效果图 3.前端-路由守卫-页面权…

鸿蒙HarmonyOS开发:如何灵活运用动画效果提升用户体验

文章目录 一、动画概述1、动画的目的 二、显式动画 (animateTo)1、接口2、参数3、AnimateParam对象说明4、示例5、效果 三、属性动画 (animation)1、接口2、参数3、AnimateParam对象说明4、系统可动画属性4、示例5、效果 一、动画概述 动画的原理是在一个时间段内&#xff0c;…

IDEA缓存和索引

IDEA缓存和索引 —2020年06月10日 IntelliJ IDEA首次加载项目的时候。都会创建索引&#xff0c;而创建索引的时间根项目的文件多少成正比。 IntelliJ IDEA的缓存和索引主要是用来加快文件查询&#xff0c;从而加快各种查找、代码提示等操作的速度。 某些特殊情况下&#xf…

剑和沙盒 1 - Windows Sandbox 简介

Windows Sandbox 提供了一个轻量级桌面环境&#xff0c;可以安全地独立运行应用程序。安装在 Windows Sandbox 环境中的软件仍处于“沙盒”状态&#xff0c;独立于主机运行。 沙盒是临时的。关闭后&#xff0c;所有软件、文件和状态都会被删除。每次打开应用程序时&#xff0c…

scrapy 爬取旅游景点相关数据(一)

第一节 Scrapy 练习爬取穷游旅游景点 本项目为scrapy 练手项目&#xff0c;爬取的是穷游旅游景点列表数据 0 系统的环境 现在网上可以找到很多scrapy版本的视频或者代码&#xff0c;为避免混淆&#xff0c;下面列出本文开发过程中使用的软件版本。 scrapy 和 selenium 新版本和…