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…...
OpCore-Simplify:15分钟完成黑苹果自动化配置的终极指南
OpCore-Simplify:15分钟完成黑苹果自动化配置的终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而头疼吗&…...
跨语言数据处理的高效解决方案:json-translator全方位指南
跨语言数据处理的高效解决方案:json-translator全方位指南 【免费下载链接】json-translator jsontt 💡 - AI JSON Translator with GPT / Gemma / Mixtral / llama other FREE translation modules to translate your json/yaml files into other lang…...
效率提升:基于快马生成自动化脚本,一键高效切换win11右键菜单至win10模式
最近在升级到Windows 11后,发现右键菜单的改动让工作效率大打折扣。作为一个长期使用Windows 10的用户,新系统的右键菜单需要多点击一次"显示更多选项"才能看到完整功能,这在日常文件操作中增加了不少额外步骤。于是我开始寻找解决…...
避坑指南:RAG Pipeline中多阶段处理的5个性能陷阱与优化方案(附Qwen-Turbo限流配置)
RAG Pipeline性能优化实战:五大关键陷阱与云服务适配方案 当你的RAG系统从Demo走向生产环境时,PDF解析突然内存溢出,向量数据库写入耗时呈指数增长,API调用频繁触发限流——这些性能陷阱往往在真实业务压力下才会暴露。本文将解剖…...
patat性能优化技巧:让终端演示更加流畅的7个方法
patat性能优化技巧:让终端演示更加流畅的7个方法 【免费下载链接】patat Terminal-based presentations using Pandoc 项目地址: https://gitcode.com/gh_mirrors/pa/patat patat是一个基于终端的演示工具,它利用Pandoc的强大功能在ANSI终端中呈现…...
用Python手把手教你实现隐马尔可夫模型(HMM)从理论到实战
用Python手把手教你实现隐马尔可夫模型(HMM)从理论到实战 在自然语言处理、语音识别和生物信息学等领域,隐马尔可夫模型(Hidden Markov Model, HMM)是一种经典的概率图模型。本文将带你从零开始,用Python实…...
vokoscreenNG完全指南:开源屏幕录制工具的全方位应用手册
vokoscreenNG完全指南:开源屏幕录制工具的全方位应用手册 【免费下载链接】vokoscreenNG vokoscreenNG is a powerful screencast creator in many languages to record the screen, an area or a window (Linux only). Recording of audio from multiple sources i…...
塞尔达传说旷野之息存档编辑器:终极免费工具使用指南 [特殊字符]
塞尔达传说旷野之息存档编辑器:终极免费工具使用指南 🎮 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 还在为海拉鲁大陆的冒险资源不足而…...
Seed-Coder-8B-Base案例分享:这些实用代码片段都是AI写的
Seed-Coder-8B-Base案例分享:这些实用代码片段都是AI写的 1. 引言:AI编程助手的崛起 在软件开发领域,一个革命性的变化正在发生:AI代码生成工具正从简单的补全功能,进化成为真正的编程伙伴。Seed-Coder-8B-Base作为一…...
3分钟突破限制!用XiaoMusic让小爱音箱自由播放全网音乐
3分钟突破限制!用XiaoMusic让小爱音箱自由播放全网音乐 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否曾因音乐平台版权限制而无法播放喜欢的歌曲…...
