Android U 匹配不到APN,无法发起数据建立的问题分析
问题
打开数据开关后,没有data PDN请求发起,因此无法上网。
根据日志确定是没有找到合适的data profile,原因一般有:
1、APN 没有配置
2、APN 类型/网络能力不满足——APN type或bearer
3、APN 配置了但被disable了——APN proofile的carrierEnable值
日志分析
fail log:
APN 被disable了,所以无法匹配。
//preferred=true说明当前选中的是此条APN
11-20 15:01:51.409140 2316 3480 D DPM-0 : getApnSettingForNetworkRequest: networkType=13 isMtkImsDataSupport=true hasEimsCapability=false mPreferredDataProfile=[DataProfile=[ApnSetting]....] dataProfilesCount=0 dataProfiles=[] mAllDataProfiles=[[DataProfile=[ApnSetting] INTERNET, 3080, xxxxxx, internet, , null, , null, null, 0, supl | hipri | default, IPV4V6, IP, false, 0, true, 0, 0, 0, 0, 0, gid, xxxxx000000000000, false, UNKNOWN, UNKNOWN, 0, -1, -1, false, 961, TrafficDescriptor={mDnn=internet, null}, preferred=true]...]
11-20 15:01:51.410224 2316 3480 D DPM-0 : Can't find any data profile that can satisfy [NetworkRequest [ NONE id=0, [ Capabilities: DUN&TRUSTED&NOT_VPN&NOT_VCN_MANAGED Uid: 1001 UnderlyingNetworks: Null] ], mPriority=30, state=UNSATISFIED, mAttachedDataNetwork=null, isMetered=true, created time=15:01:51.407, evaluation result=null]
11-20 15:01:51.411224 1366 1366 D ImsManager: [1] Registration callback removed.
11-20 15:01:51.413463 2316 3480 D DPM-0 : Unable to find a data profile for [NetworkRequest [ NONE id=0, [ Capabilities: DUN&TRUSTED&NOT_VPN&NOT_VCN_MANAGED Uid: 1001 UnderlyingNetworks: Null] ], mPriority=30, state=UNSATISFIED, mAttachedDataNetwork=null, isMetered=true, created time=15:01:51.408, evaluation result=null]
正常日志:
dataProfilesCount 指明网络能力匹配的APN数
11-20 15:19:20.723854 2316 2316 D DPM-0 : getApnSettingForNetworkRequest: networkType=13 isMtkImsDataSupport=true hasEimsCapability=false mPreferredDataProfile=[DataProfile=[ApnSetting] ....] dataProfilesCount=1 dataProfiles=[[DataProfile=[ApnSetting]
11-20 15:19:20.725075 2316 2316 V DPM-0 : Satisfied profile: [DataProfile=[ApnSetting]
11-20 15:19:20.725871 2316 2316 D DPM-0 : The final available profile: [DataProfile=[ApnSetting]
11-20 15:19:20.729504 2316 2316 D DNC-0 : Data evaluation: evaluation reason:NEW_REQUEST, Data allowed reason: NORMAL, candidate profile=[DataProfile=[ApnSetting]
11-20 15:19:20.730116 2316 2316 D DNC-0 : onSetupDataNetwork: dataProfile=[DataProfile=[ApnSetting]
11-20 15:19:20.731688 2316 2316 D DNC-0 : Creating data network on WWAN with [DataProfile=[ApnSetting]
11-20 15:19:20.768286 2316 2316 D DSM-C-0 : setupDataCall
11-20 15:19:20.769505 2316 2316 D DN-114-C: ConnectingState: setupData: accessNetwork=EUTRAN, [DataProfile=[ApnSetting] ...], isModemRoaming=false, allowRoaming=true, PDU session id=0, matchAllRuleAllowed=true
11-20 15:19:20.776007 2316 2682 D RILJ :[0868]> SETUP_DATA_CALL,reason=NORMAL,accessNetworkType=EUTRAN,dataProfile=[DataProfile=[ApnSetting] ..],isRoaming=false,allowRoaming=true,linkProperties=null,pduSessionId=0,sliceInfo=null,trafficDescriptor=TrafficDescriptor={mDnn=VZWADMIN, null},matchAllRuleAllowed=true [PHONE0]
11-20 15:19:21.063568 2316 2674 D RILJ : [0868]< SETUP_DATA_CALL DataCallResponse: { cause=NONE(0x0) retry=-1 cid=1803 linkStatus=2 protocolType=2 ifname=ccmni3 addresses=[10.128.159.113/32, 2600:100f:f00c:330f:0:56:6fe2:e801/64] dnses=[/2001:4888:53:ff00:524:d::, /2001:4888:52:ff00:528:d::, /198.224.166.135, /198.224.167.135] gateways=[/10.128.159.113, /::] pcscf=[] mtu=1428 mtuV4=1428 mtuV6=1428 handoverFailureMode=unknown pduSessionId=0 defaultQos=EpsQos { qosClassId=8 downlink=Bandwidth { maxBitrateKbps=0 guaranteedBitrateKbps=0} uplink=Bandwidth { maxBitrateKbps=0 guaranteedBitrateKbps=0}} qosBearerSessions=[] sliceInfo=null trafficDescriptors=[]} [PHONE0]
代码分析
DataProfileManager.java - 【frameworks/opt/telephony】
/*** Get the APN setting for the network request.** @param networkRequest The network request.* @param networkType The current data network type.* @param ignorePermanentFailure {@code true} to ignore {@link ApnSetting#getPermanentFailed()}.* This should be set to true for condition-based retry/setup.* @return The APN setting. {@code null} if can't find any satisfiable data profile.*/
private @Nullable ApnSetting getApnSettingForNetworkRequest(@NonNull TelephonyNetworkRequest networkRequest, @NetworkType int networkType,boolean ignorePermanentFailure) {if (!networkRequest.hasAttribute(TelephonyNetworkRequest.CAPABILITY_ATTRIBUTE_APN_SETTING)) {loge("Network request does not have APN setting attribute.");return null;}//1、优先选择preferred APN,如果满足并且不处于PermanentFailure状态则直接请求// If the preferred data profile can be used, always use it if it can satisfy the network// request with current network type (even though it's been marked as permanent failed.)if (mPreferredDataProfile != null&& networkRequest.canBeSatisfiedBy(mPreferredDataProfile)&& mPreferredDataProfile.getApnSetting() != null&& mPreferredDataProfile.getApnSetting().canSupportNetworkType(networkType)) {if (ignorePermanentFailure || !mPreferredDataProfile.getApnSetting().getPermanentFailed()) {return mPreferredDataProfile.getApnSetting();}log("The preferred data profile is permanently failed. Only condition based retry "+ "can happen.");return null;}//2、如果没有首选数据配置文件,则过滤掉不能满足网络请求的数据配置文件//Note:找不到profile 一般就是这里匹配不到了// Filter out the data profile that can't satisfy the request.// Preferred data profile should be returned in the top of the list.List<DataProfile> dataProfiles = mAllDataProfiles.stream().filter(networkRequest::canBeSatisfiedBy)// The longest time hasn't used data profile will be in the front so all the data// profiles can be tried..sorted(Comparator.comparing(DataProfile::getLastSetupTimestamp)) //并按照它们的最后设置时间进行排序,将最长时间未使用的数据配置文件放在列表的前面.collect(Collectors.toList());for (DataProfile dataProfile : dataProfiles) { //然后尝试筛选并使用它们来满足网络请求。logv("Satisfied profile: " + dataProfile + ", last setup="+ DataUtils.elapsedTimeToString(dataProfile.getLastSetupTimestamp()));}if (dataProfiles.size() == 0) {log("Can't find any data profile that can satisfy " + networkRequest);return null;}// Check if the remaining data profiles can used in current data network type.dataProfiles = dataProfiles.stream().filter(dp -> dp.getApnSetting() != null&& dp.getApnSetting().canSupportNetworkType(networkType)).collect(Collectors.toList());if (dataProfiles.size() == 0) {log("Can't find any data profile for network type "+ TelephonyManager.getNetworkTypeName(networkType));return null;}// Check if preferred data profile set id matches.dataProfiles = dataProfiles.stream().filter(dp -> dp.getApnSetting() != null&& (dp.getApnSetting().getApnSetId()== Telephony.Carriers.MATCH_ALL_APN_SET_ID|| dp.getApnSetting().getApnSetId() == mPreferredDataProfileSetId)).collect(Collectors.toList());if (dataProfiles.size() == 0) {log("Can't find any data profile has APN set id matched. mPreferredDataProfileSetId="+ mPreferredDataProfileSetId);return null;}// Check if data profiles are permanently failed.dataProfiles = dataProfiles.stream().filter(dp -> ignorePermanentFailure || !dp.getApnSetting().getPermanentFailed()).collect(Collectors.toList());if (dataProfiles.size() == 0) {log("The suitable data profiles are all in permanent failed state.");return null;}return dataProfiles.get(0).getApnSetting();
}
排查接口
canBeSatisfiedBy in TelephonyNetworkRequest.java -【frameworks/opt/telephony】
canHandleType in ApnSetting.java【frameworks/base/telephony】
匹配不到关键就是在网络能力评估的过程,canBeSatisfiedBy会根据APN类型筛选能力匹配的项,在canHandleType检查完APN可用性之后,返回enable且符合网络的APN。
/**
* Check if this network request can be satisfied by a data profile.
*
* @param dataProfile The data profile to check.
* @return {@code true} if this network request can be satisfied by the data profile.
*/
public boolean canBeSatisfiedBy(@NonNull DataProfile dataProfile) {// If the network request can be translated to OS/App id, then check if the data profile's// OS/App id can satisfy it.if (hasAttribute(CAPABILITY_ATTRIBUTE_TRAFFIC_DESCRIPTOR_OS_APP_ID)&& getOsAppId() != null) {// The network request has traffic descriptor type capabilities. Match the traffic// descriptor.if (dataProfile.getTrafficDescriptor() != null && Arrays.equals(getOsAppId().getBytes(),dataProfile.getTrafficDescriptor().getOsAppId())) {return true;}}// If the network request can be translated to APN setting or DNN in traffic descriptor,// then check if the data profile's APN setting can satisfy it.if ((hasAttribute(CAPABILITY_ATTRIBUTE_APN_SETTING)|| hasAttribute(CAPABILITY_ATTRIBUTE_TRAFFIC_DESCRIPTOR_DNN))&& dataProfile.getApnSetting() != null) {// Fallback to the legacy APN type matching.List<Integer> apnTypes = Arrays.stream(getCapabilities()).boxed().map(DataUtils::networkCapabilityToApnType).filter(apnType -> apnType != ApnSetting.TYPE_NONE).collect(Collectors.toList());// In case of enterprise network request, the network request will have internet,// but APN type will not have default type as the enterprise apn should not be used// as default network. Ignore default type of the network request if it// has enterprise type as well. This will make sure the network request with// internet and enterprise will be satisfied with data profile with enterprise at the// same time default network request will not get satisfied with enterprise data// profile.// TODO b/232264746if (apnTypes.contains(ApnSetting.TYPE_ENTERPRISE)) {apnTypes.remove((Integer) ApnSetting.TYPE_DEFAULT);}return apnTypes.stream().allMatch(dataProfile.getApnSetting()::canHandleType);}return false;
}/** @hide */
public boolean canHandleType(@ApnType int type) {if (!mCarrierEnabled) {return false;}// DEFAULT can handle HIPRI.return hasApnType(type);
}
定位原因的方法
查看APNSettings配置是否正确,以上问题就是APN配置了但被disable了。
[DataProfile=[ApnSetting] INTERNET, 3080, xxxxxx, internet, , null, , null, null, 0, supl | hipri | default, IPV4V6, IP, false, 0, true, 0, 0, 0, 0, 0, gid, xxxxx000000000000, false, UNKNOWN, UNKNOWN, 0, -1, -1, false, 961, TrafficDescriptor={mDnn=internet, null}, preferred=true]
根据ApnSettings实体节后打印信息,mCarrierEnabled就是上述日志false的位置。
/*** Returns the string representation of ApnSetting.** This method prints null for unset elements. The output doesn't contain password or user.* @hide*/
public String toString() {StringBuilder sb = new StringBuilder();sb.append("[ApnSetting] ").append(mEntryName).append(", ").append(mId).append(", ").append(mOperatorNumeric).append(", ").append(mApnName).append(", ").append(mProxyAddress).append(", ").append(UriToString(mMmsc)).append(", ").append(mMmsProxyAddress).append(", ").append(portToString(mMmsProxyPort)).append(", ").append(portToString(mProxyPort)).append(", ").append(mAuthType).append(", ");final String[] types = getApnTypesStringFromBitmask(mApnTypeBitmask).split(",");sb.append(TextUtils.join(" | ", types));sb.append(", ").append(PROTOCOL_INT_MAP.get(mProtocol));sb.append(", ").append(PROTOCOL_INT_MAP.get(mRoamingProtocol));sb.append(", ").append(mCarrierEnabled); //APN启用情况sb.append(", ").append(mProfileId);sb.append(", ").append(mPersistent);sb.append(", ").append(mMaxConns);sb.append(", ").append(mWaitTime);sb.append(", ").append(mMaxConnsTime);sb.append(", ").append(mMtuV4);sb.append(", ").append(mMtuV6);sb.append(", ").append(MVNO_TYPE_INT_MAP.get(mMvnoType));sb.append(", ").append(mMvnoMatchData);sb.append(", ").append(mPermanentFailed);sb.append(", ").append(TelephonyManager.convertNetworkTypeBitmaskToString(mNetworkTypeBitmask));sb.append(", ").append(TelephonyManager.convertNetworkTypeBitmaskToString(mLingeringNetworkTypeBitmask));sb.append(", ").append(mApnSetId);sb.append(", ").append(mCarrierId);sb.append(", ").append(mSkip464Xlat);sb.append(", ").append(mAlwaysOn);sb.append(", ").append(Objects.hash(mUser, mPassword));return sb.toString();
}
其他
代码网站阅读:AndroidXRef
相关文章:
Android U 匹配不到APN,无法发起数据建立的问题分析
问题 打开数据开关后,没有data PDN请求发起,因此无法上网。 根据日志确定是没有找到合适的data profile,原因一般有: 1、APN 没有配置 2、APN 类型/网络能力不满足——APN type或bearer 3、APN 配置了但被disable了——APN p…...
如何打造“面向体验”的音视频能力——对话火山引擎王悦
编者按:随着全行业视频化的演进,我们置身于一个充满创新与变革的时代。在这个数字化的浪潮中,视频已经不再只是传递信息的媒介,更是重塑了我们的交互方式和体验感知。作为字节跳动的“能力溢出”,火山引擎正在飞速奔跑…...
什么是NoOps
过去几年,自动化一直在推动整个 IT 行业向前发展。通过自动化某些任务,开发团队可以提高其能力,而无需感受到雇用新团队成员的预算压力。自动化还保证了更高的效率,特别是在操作和维护方面。 传统的软件开发工作流程涉及开发团队…...
Unity - Graphic解析
Gpahic 的作用 Graphic 是 Unity最基础的图形基类。主要负责UGUI的显示部分。 由上图可以看你出我们经常使用的Image,Text,都是继承自Graphic。 Graphic的渲染流程 在Graphic的源码中有以下属性 [NonSerialized] private CanvasRenderer m_CanvasRend…...
哈希思想的应用
目录 1.位图 位图的实现 题目变形一 题目变形二 题目变形三 总结: 2.布隆过滤器 概念 布隆过滤器的实现 3.哈希切割的思想 1.位图 哈希表和位图是数据结构中常用的两种技术。哈希表是一种数据结构,通过哈希函数把数据和位置进行映射,…...
React入门使用 (官方文档向 Part1)
文章目录 React组件:万物皆组件 JSX: 将标签引入 JavaScriptJSX 规则1. 只能返回一个根元素2. 标签必须闭合3. 使用驼峰式命名法给 ~~所有~~ 大部分属性命名!高级提示:使用 JSX 转化器 在 JSX 中通过大括号使用 JavaScript使用引号传递字符串使用大括号&…...
87基于matlab的双卡尔曼滤波算法
基于matlab的双卡尔曼滤波算法。第一步使用了卡尔曼滤波算法,用电池电压来修正SOC,然后将修正后的SOC作为第二个卡尔曼滤波算法的输入,对安时积分法得到的SOC进行修正,最终得到双卡尔曼滤波算法SOC估计值。结合EKF算法和安时积分法…...
Jacobi迭代与SOR迭代求解希尔伯特矩阵
给出线性方程组 Hn*x b,其中系数矩阵Hn为希尔伯特矩阵: 假设 x ∗ (1, 1, . . . , 1)T,b Hnx ∗。若取 n 6,8, 10,分别用 Jacobi 迭代法及 SOR迭代(ω 1, 1:25,1:5)求解,比较计算结果。…...
【云备份】配置加载文件模块
文章目录 配置信息设计配置文件加载cloud.conf配置文件单例模式的使用ReadConfigFile —— 读取配置文件GetInstance —— 创建对象其他函数的实现 具体实现cloud.confconfig.hpp 配置信息设计 使用文件配置加载一些程序运行的关键信息 可以让程序的运行更加灵活 配置信息&am…...
sqlserver写入中文乱码问题
sqlserver写入中文乱码问题解决方案 首先查看sqlserver数据库编码 首先查看sqlserver数据库编码 查询语句:SELECT COLLATIONPROPERTY(Chinese_PRC_Stroke_CI_AI_KS_WS, CodePage); 对应的编码: 936 简体中文GBK 950 繁体中文BIG5 437 美国/加…...
【亚马逊云】基于EC2以 All-in-One 模式快速部署 KubeSphere 和 Kubernetes
文章目录 1. 云实例配置说明2. SSH连接云实例3. 查看系统版本4. 修改主机名5. 安装依赖项6. 安全组和DNS修改7. 下载KubeKey8. 同时安装Kubesphere和Kubernetes[可选]单独安装Kubernetes[可选]单独安装KubeSphere9. 验证KubeSphere安装结果10. 登录KubeSphere控制台[可选]安装K…...
使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始
使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统 Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标,还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工…...
嵌入式设备摄像头基础知识
工作原理 摄像头的工作原理是,当光线通过镜头聚焦到图像传感器上时,传感器会将光信号转换为电信号,并将其传输给处理器进行处理。处理器通过算法对图像信号进行增强、去噪、压缩等操作,并将其转换为数字信号输出给计算机或其他设…...
使用Pytorch从零开始构建Normalizing Flow
归一化流 (Normalizing Flow) (Rezende & Mohamed,2015)学习可逆映射 f : X → Z f: X \rightarrow Z f:X→Z, 在这里X是我们的数据分布,Z是选定的潜在分布。 归一化流是生成模型家族的一部分,其中包括变分自动编…...
一个tomcat中部署的多个war,相当于几个jvm
请直接去看原文 原文链接:一个tomcat有几个jvm-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 前几天向unmi提问,今天他答复了。我觉得答复很清楚,…...
2023年第十六届中国系统架构师大会(SACC2023)-核心PPT资料下载
一、峰会简介 本届大会以“数字转型 架构演进”为主题, 涵盖多个热门领域,如多云多活、海量分布式存储、容器、云成本、AIGC大数据等,同时还关注系统架构在各个行业中的应用,如金融、制造业、互联网、教育等。 与往届相比&#…...
高校大学校园后勤移动报修系统 微信小程序uniapp+vue
本文主要是针对线下校园后勤移动报修传统管理方式中管理不便与效率低的缺点,将电子商务和计算机技术结合起来,开发出管理便捷,效率高的基于app的大学校园后勤移动报修app。该系统、操作简单、界面友好、易于管理和维护;而且对后勤…...
docker常见问题汇总
docker常见问题 ❓问题1:启动docker容器时,报错Unknown runtime specified nvidia. 当我启动一个容器时,运行以下命令: docker run --runtimenvidia 。。。。 后面一部分命令没写出来,此时报错的信息如下:…...
JMeter 测试脚本编写技巧
JMeter 是一款开源软件,用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本,模拟多种不同的负载情况,从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步:创建测试计划 在JMet…...
力扣6:N字形变化
代码: class Solution { public:string convert(string s, int numRows){int lens.size();if(numRows1){return s;}int d2*numRows-2;int count0;string ret;//第一行!for(int i0;i<len;id){rets[i];}//第k行!for(int i1;i<numRows-1;…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
