POWER_CONMETRICS的packet wakeup events触发条件的代码走读
摘要:
adb shell dumpsys connmetrics 的packet wakeup events触发条件:首先App是无法控制packet wakeup events的事件日志打印,主要App联网过程中网络状态或配置发生变化时由系统netd自动触发的统计。
通俗理解:目前主要表示触发了网络连接的属性更新,起码从功耗角度存在联网行为,但是没办法区分是下载、浏览网页、心跳唤醒的类型和次数统计等。好处是告知了uid和对应的联网地址,也是调查功耗问题的利器
- 改变网络连接:当应用程序请求系统连接到另一个Wi-Fi网络或断开当前网络连接时,网络属性会发生变化。
- 请求网络特性:应用程序可以通过Android的 ConnectivityManager 请求具有特定网络特性的连接
- 切换移动数据和Wi-Fi:如果应用程序有权限更改设备的网络连接,它可以切换移动数据和Wi-Fi。当网络从一种类型切换到另一种类型时,网络连接的属性将更新。
- VPN连接:当应用程序建立或断开VPN连接时,设备的网络链接属性可能会发生变化,因为VPN会影响设备的路由表和其他网络配置。
- 网络配置变化:某些特权应用程序可能能够更改网络配置,如静态IP设置、DNS服务器等。这些变化也会触发网络属性更新。
- 系统级网络变化:系统级事件,如飞行模式的切换、SIM卡状态的变化等,也可以影响网络连接属性。
一、日志含义:
packet wakeup events[记录网络唤醒]:
WakeupStats(wlan0, 143654s, total: 7448, root: 0, system: 24, apps: 1713, non-apps: 0, no uid: 5711, l2 unicast/multicast/broadcast: 7448/0/0, ethertype 0x800: 6395, ethertype 0x86dd: 1053, ipNxtHdr 1: 4637, ipNxtHdr 6: 1906, ipNxtHdr 17: 696, ipNxtHdr 58: 209)WakeupEvent(22:44:07.139【时间点】, wlan0【wifi对应的网口】, uid: -1【应用的UID,-1可能路由器导致或未被】, eth=0x800, dstHw=48:12:58:2d:9e:08, ipNxtHdr=1, srcIp=192.168.1.1【sourceIp地址】, dstIp=192.168.1.31【destination IP 地址】)WakeupEvent(22:44:07.140, wlan0, uid: 10164, eth=0x86dd, dstHw=48:12:58:2d:9e:08, ipNxtHdr=6, srcIp=2408:873d:1022:1049:0:ff:b01c:456c, dstIp=2408:823c:4c17:fb38:707d:7c8d:363e:35ca, srcPort=443【source 端口】, dstPort=51710【destination 端口】)WakeupEvent(22:44:07.140, wlan0, uid: -1, eth=0x800, dstHw=48:12:58:2d:9e:08, ipNxtHdr=1, srcIp=192.168.1.1, dstIp=192.168.1.31)

uid=-1的现象调查:以下是chatGpt回答和源码调查,可能原因很多
在日志中出现 `WakeupEvent(22:44:07.140, wlan0, uid: -1)` 意味着有一个网络唤醒事件发生在22:44:07.140,发生在`wlan0`接口上,但是该事件没有关联到一个有效的UID。UID值为`-1`可能有以下原因:1. **系统流量**:接收到的数据包可能是系统级别的流量,比如DHCP请求、ARP请求等,并不是由特定用户进程发起的。2. **无法识别的流量**:如果数据包不能与任何已知进程关联,或者它不属于任何特定的用户会话,netd就无法为其分配一个有效的UID。3. **数据包缺少UID信息**:在数据包的Netlink消息中可能缺少了UID信息,导致无法从消息中提取出UID。4. **解析错误**:在处理Netlink消息并提取数据包信息时,可能发生了解析错误,导致无法正确识别或赋值UID。5. **安全或隐私考虑**:由于安全或隐私原因,可能故意不在日志中记录特定UID。6. **广播或多播流量**:接收到的可能是一个广播或多播数据包,它并不直接针对某个特定的进程,因此无法分配UID。7. **数据包来自未识别的网络层**:如果数据包来自未被系统识别或监控的网络层,例如某些VPN流量,可能不会包含UID信息。8. **系统配置或规则**:系统的网络配置或特定的iptables/netfilter规则可能导致一些数据包不被赋予UID。9. **软件缺陷**:netd或相关组件中的软件缺陷可能导致UID信息未被正确处理或记录。10. **内核不支持**:如果内核版本不支持某些功能,比如网络唤醒事件的UID跟踪,那么UID信息也可能无法获取。针对上述情况,可以通过检查系统的配置、相关的网络协议处理、安全策略和软件的日志或代码来确定具体原因。如果需要进一步的诊断,可能需要启用更详细的日志记录,或者使用网络抓包工具来捕获和分析网络流量。源码是:默认值-1source/xref/master_sm8650/android/qssi/system/netd/server/WakeupController.cpp120 netdutils::Status WakeupController::init(NFLogListenerInterface* listener) {121 mListener = listener;122 const auto msgHandler = [this](const nlmsghdr&, const nfgenmsg&, const Slice msg) {123124 struct WakeupController::ReportArgs args = {125 .uid = -1,126 .gid = -1,127 .ethertype = -1,128 .ipNextHeader = -1,129 .srcPort = -1,130 .dstPort = -1,131 // and all other fields set to 0 as the default132 };133 bool parseAgain = false;134135 const auto attrHandler = [&args, &parseAgain](const nlattr attr, const Slice payload) {136 switch (attr.nla_type) {137 case NFULA_TIMESTAMP: {138 timespec ts = {};139 extract(payload, ts);140 constexpr uint64_t kNsPerS = 1000000000ULL;141 args.timestampNs = ntohl(ts.tv_nsec) + (ntohl(ts.tv_sec) * kNsPerS);142 break;143 }144 case NFULA_PREFIX:145 // Strip trailing '\0'146 args.prefix = toString(take(payload, payload.size() - 1));147 break;148 case NFULA_UID:149 extract(payload, args.uid);150 args.uid = ntohl(args.uid);151 break;152 case NFULA_GID:153 extract(payload, args.gid);154 args.gid = ntohl(args.gid);155 break;156 case NFULA_HWADDR: {157 struct nfulnl_msg_packet_hw hwaddr = {};158 extract(payload, hwaddr);159 size_t hwAddrLen = ntohs(hwaddr.hw_addrlen);160 hwAddrLen = std::min(hwAddrLen, sizeof(hwaddr.hw_addr));161 args.dstHw.assign(hwaddr.hw_addr
二、源码:
./frameworks/libs/net/common/netd/binder/android/net/metrics/INetdEventListener.aidl:93: void onWakeupEvent(String prefix, int uid, int ethertype, int ipNextHeader, in byte[] dstHw,./frameworks/base/services/art-profile:2962:HPLcom/android/server/connectivity/NetdEventListenerService;->onWakeupEvent(Ljava/lang/String;III[BLjava/lang/String;Ljava/lang/String;IIJ)V./frameworks/base/services/core/java/com/android/server/connectivity/NetdEventListenerService.java:322: public synchronized void onWakeupEvent(String prefix, int uid, int ethertype, int ipNextHeader,

/*** Logs a single RX packet which caused the main CPU to exit sleep state.* @param prefix arbitrary string provided via wakeupAddInterface()* @param uid UID of the destination process or -1 if no UID is available.* @param ethertype of the RX packet encoded in an int in native order, or -1 if not available.* @param ipNextHeader ip protocol of the RX packet as IPPROTO_* number,or -1 if the packet was not IPv4 or IPv6.* @param dstHw destination hardware address, or 0 if not available.* @param srcIp source IP address, or null if not available.* @param dstIp destination IP address, or null if not available.* @param srcPort src port of RX packet in native order, or -1 if the packet was not UDP or TCP.* @param dstPort dst port of RX packet in native order, or -1 if the packet was not UDP or TCP.* @param timestampNs receive timestamp for the offending packet. In units of nanoseconds and* synchronized to CLOCK_MONOTONIC.* 记录一个导致主CPU退出睡眠状态的单个RX数据包。* @param prefix 通过wakeupAddInterface()提供的任意字符串* @param uid 目标进程的UID,如果没有可用的UID则为-1。* @param ethertype RX数据包的以太网类型,以原生顺序编码的int值,如果不可用则为-1。* @param ipNextHeader RX数据包的IP协议号,作为IPPROTO_*数字,如果数据包不是IPv4或IPv6,则为-1。* @param dstHw 目的地硬件地址,如果不可用则为0。* @param srcIp 来源IP地址,如果不可用则为null。* @param dstIp 目的地IP地址,如果不可用则为null。* @param srcPort RX数据包的源端口,以原生顺序,如果数据包不是UDP或TCP则为-1。* @param dstPort RX数据包的目的端口,以原生顺序,如果数据包不是UDP或TCP则为-1。* @param timestampNs 违规数据包的接收时间戳。以纳秒为单位,并且与CLOCK_MONOTONIC同步。*/ void onWakeupEvent(String prefix, int uid, int ethertype, int ipNextHeader, byte[] dstHw, String srcIp, String dstIp, int srcPort, int dstPort, long timestampNs);*/321 @Override322 public synchronized void onWakeupEvent(String prefix, int uid, int ethertype, int ipNextHeader,323 byte[] dstHw, String srcIp, String dstIp, int srcPort, int dstPort, long timestampNs) {324 final String[] prefixParts = prefix.split(WAKEUP_EVENT_PREFIX_DELIM);325 if (prefixParts.length != 2) {326 throw new IllegalArgumentException("Prefix " + prefix327 + " required in format <nethandle>:<interface>");328 }329 final long netHandle = Long.parseLong(prefixParts[0]);330 final Network network = Network.fromNetworkHandle(netHandle);331332 final WakeupEvent event = new WakeupEvent();333 event.iface = prefixParts[1];334 event.uid = uid;335 event.ethertype = ethertype;336 if (ArrayUtils.isEmpty(dstHw)) {337 if (hasWifiTransport(network)) {338 Log.e(TAG, "Empty mac address on WiFi transport, network: " + network);339 }340 event.dstHwAddr = null;341 } else {342 event.dstHwAddr = MacAddress.fromBytes(dstHw);343 }344 event.srcIp = srcIp;345 event.dstIp = dstIp;346 event.ipNextHeader = ipNextHeader;347 event.srcPort = srcPort;348 event.dstPort = dstPort;349 if (timestampNs > 0) {350 event.timestampMs = timestampNs / NANOS_PER_MS;351 } else {352 event.timestampMs = System.currentTimeMillis();353 }354 addWakeupEvent(event);355356 final BatteryStatsInternal bsi = LocalServices.getService(BatteryStatsInternal.class);357 if (bsi != null) {358 final long elapsedMs = SystemClock.elapsedRealtime() + event.timestampMs359 - System.currentTimeMillis();360 bsi.noteCpuWakingNetworkPacket(network, elapsedMs, event.uid);361 }362363 final String dstMac = String
三、App的一些可以触发的示例(理论推测,未实践)
// 获取ConnectivityManager实例ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 创建NetworkRequest.Builder对象NetworkRequest.Builder builder = new NetworkRequest.Builder();// 指定网络类型为Wi-Fibuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);// 添加网络功能,比如访问互联网builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);// 创建NetworkRequest对象NetworkRequest networkRequest = builder.build();// 创建一个NetworkCallback来处理网络变化ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {@Overridepublic void onAvailable(Network network) {// 当符合条件的网络可用时调用// 使用该网络进行网络操作Log.d("NetworkCallback", "Wi-Fi网络现在可用");// 这里可以通过ConnectivityManager.setProcessDefaultNetwork(network)来设置APP默认网络(API 23已弃用)// 或使用其他API来绑定数据流到这个网络}@Overridepublic void onLost(Network network) {// 当满足条件的网络不再可用时调用Log.d("NetworkCallback", "Wi-Fi网络丢失");}};// 请求具有特定特性的网络connectivityManager.requestNetwork(networkRequest, networkCallback);
相关文章:
POWER_CONMETRICS的packet wakeup events触发条件的代码走读
摘要: adb shell dumpsys connmetrics 的packet wakeup events触发条件:首先App是无法控制packet wakeup events的事件日志打印,主要App联网过程中网络状态或配置发生变化时由系统netd自动触发的统计。 通俗理解:目前主要表示触…...
Bug:通过反射修改@Autowired注入Bean的字段,明确存在,报错 NoSuchFieldException
【BUG】通过Autowired注入了一个Bean SeqNo,测试的时候需要修改其中的字段。通过传统的反射,无论如何都拿不到信息,关键是一方面可以通过IDEA跳转,一方面debug也确实能看到这个字段。但是每次调用set方法报错:NoSuchFi…...
Vue项目兼容IE11
配置Vue项目兼容IE11详解 Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但对于 IE9,Vue 底层是支持。 由于开发过程中,我们经常会使用一些第三方插件或组件,对于这些组件,有时我们…...
可以帮助你快速禁用windows自带的防火墙程序defender control,有效解决占用内存大的问题,供大家学习研究参考
可以关闭windows自带的windows defender防火墙的工具,defender control官方版界面小巧,功能强大,当大家需要手动关闭或禁用windows defender时,就可以使用这款软件,以此来一键关闭或开启这个烦人的系统防火墙。操作起来也非常的简单便捷。 defender control怎么使用 下载…...
2024年9月电子学会Scratch图形化编程等级考试二级真题试卷
2024.09 Scratch图形化编程等级考试二级真题试卷 题目总数:37 总分数:100 一、选择题 第 1 题 Scratch小猫初始坐标是(50,50),小猫向下移动100步后的坐标是?( ) A.(150,50) B.(-50,50) C.(50,-50) D.(50,1…...
STL-vector+题目
vector-顺序表,可以存放任意类型的数据。 vector在[ ]和迭代器、范围for方面的使用差不多一样。 vector的迭代器有普通的还有const类型的迭代器。 vector使用下标[ ]好用。迭代器是容器通用的访问方式,使用方法基本相似。 #include <iostream> #i…...
微服务--Gateway网关--全局Token过滤器【重要】
全局过滤器 GlobalFilter, 注入到 IOC里面即可 概念: 全局过滤器: 所有的请求 都会在执行链里面执行这个过滤器 如添加日志、鉴权等 创建一个全局过滤器的基本步骤: 步骤1: 创建过滤器类 首先,创建一个实现了Globa…...
负载均衡在线判题系统【项目】
项目介绍 本项目是一个负载均衡的在线判题系统 (Online Judge, OJ) 的简易实现。该系统的核心功能是处理大量编程问题的提交,并通过负载均衡的机制,分配判题任务到多台服务器上,确保高效和可靠的评测。系统通过自动选择负载较低的服务器进行…...
重构复杂简单变量之用子类替换类型码
子类替换类型码 是一种用于将类型码替换为子类。当代码使用类型码(通常是 int、string 或 enum)来表示对象的不同类别,并且这些类别的行为有所不同时,使用子类可以更加清晰地表达这些差异并减少复杂的条件判断。 一、什么时候使用…...
【Nginx系列】Nginx配置超时时间
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
2024年龙信
挂载VC的密码:MjAyNOmmeS/oeadrw 手机取证 1. Android 设备在通过 ADB 连接时,通常会要求用户授权连接,会要求用户确认设备授权,并将该设备的公钥保存在 adb_keys文件中 寻找到data/misc/adb/adb_keys下面有中有两个,…...
PyCharm配置Flask开发环境
文章目录 一、步骤1.安装虚拟环境2.创建虚拟环境文件夹3.安装虚拟环境目录4.进入虚拟环境5.active命令 激活6.安装Flask7.在Pycharm中配置Flask环境 总结 一、步骤 1.安装虚拟环境 代码如下(示例): pip install virtualenv 或者 pip insta…...
【人工智能-初级】第2章 机器学习入门:从线性回归开始
文章目录 一、什么是线性回归?二、线性回归的基本概念2.1 一元线性回归2.2 多元线性回归 三、如何进行线性回归建模?四、用Python实现线性回归4.1 导入必要的库4.2 创建虚拟数据集4.3 数据可视化4.4 拆分训练集和测试集4.5 训练线性回归模型4.6 查看模型…...
SPOOLing技术详解,结合实际场景让你了解什么是假脱机技术。
SPOOLing技术 在手工操作阶段,主机直接从I/O设备获取数据,但是由于设备速度很慢,主机速度很快。人机速度矛盾明显,主机需要浪费很多时间来等待设备。 什么是脱机技术,脱机技术可以解决什么问题? 所谓脱…...
基于SSM汽车零部件加工系统的设计
管理员账户功能包括:系统首页,个人中心,员工管理,经理管理,零件材料管理,产品类型管理,产品信息管理,产品出库管理,产品入库管理 员工账号功能包括:系统首页…...
改进 JavaScript 条件语句,探索可以替代 if...else 的 7 种方式!
当优化 JavaScript 代码时,条件语句是一个经常需要思考和改进的关键部分。if...else 结构虽然是我们常用的条件语句之一,但当代码逻辑变得复杂,if...else 结构可能会导致代码冗长、难以维护和理解。因此,了解并掌握优化 if...else…...
全新子比主题7.9.2开心版 子比主题最新版源码
内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 wordpress zibll子比主题7.9.2开心版 修复评论弹授权 可做付费下载站 含wordpress搭建视频教程zibll子比主题安装视频教程支付配置视频教程,视频都是语音讲解,…...
Kafka之消费者组与消费者
消费者(Consumer)在Kafka的体系结构中是用来负责订阅Kafka中的主题(Topic),并从订阅的主题中拉取消息后进行处理。 与其他消息中间件不同,Kafka引入一个逻辑概念——消费组(Consumer Group&…...
Damn-Vulnerable-Drone:一款针对无人机安全研究与分析的靶机工具
关于Damn-Vulnerable-Drone Damn-Vulnerable-Drone是一款针对无人机安全研究与分析的靶机工具,广大研究人员可以利用该环境工具轻松学习、研究和分析针对无人机安全态势。 Damn Vulnerable Drone 基于流行的 ArduPilot/MAVLink 架构,其中故意留下了各种…...
项目模块三:Socket模块
一、模块设计 1、套接字编程常用头文件展示 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> 2、成员函数设计 (1…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
