Android V QCOM GPS | APN for LocationService

问题

在高通平台上验证 GPS 功能流程时候,block 在 APN 数据库的查询。经查,发现高通有内部实现的 LocationService(aosp源码和mtk都没有的类) 包含查询 TelephonyProvider 数据库的逻辑,直接原因是查询到 APN Protocol 不符合预期,直接fail。

关于 Android APN 数据列的更新,涉及的代码主要存在于 Android 的 Telephony Provider 数据库实现中。

先抛出本文关注的疑问:

  1. 什么时候会把数据库单行 APN 的 current 列置为1?
  2. 在 DataProfile 结构中是否会打印 current 信息?不会,看ApnSetting存的信息不包含current。

日志分析

// 用于数据建立的 APN 是正常的,按照插入卡的 MCCMNC+MVNO 完全匹配。

// 如下案例,Home Protocol 是仅 IPV6,Roaming 使用仅IPV4

12-18 02:49:23.140 D/DPM-0   ( 4432): Found 6 data profiles. profiles = [[DataProfile=[ApnSetting] T-Mobile US, 2062, 310260, fast.t-mobile.com, , http://mms.msg.eng.t-mobile.com/mms/wapenc, , null, null, 0, mms | supl | hipri | default | xcap | rcs, IPV6, IP, true, 0, false, 0, 0, 0, 1440, 1440, gid, 544D, false, GPRS|EDGE|UMTS|CDMA|CDMA - EvDo rev. 0|CDMA - EvDo rev. A|CDMA - 1xRTT|HSDPA|HSUPA|HSPA|iDEN|CDMA - EvDo rev. B|LTE|CDMA - eHRPD|HSPA+|GSM|TD_SCDMA|LTE_CA|NR, UNKNOWN, 0, -1, -1, false, 3, 961, false, UNEDITED, TrafficDescriptor={mDnn=fast.t-mobile.com, null}, preferred=false],

// 没查到protocol的时候默认是双栈(因为此时插卡后第一次开机,所有 APN 的 current 都没有被置为1,导致无法查询成功,所以什么时候将 APN 设置成 current?

12-18 02:52:56.719 D/LocSvc_java(10198): ipProtocol: null apn: fast.t-mobile.com networkType: LTE state: 1

12-18 02:52:56.719 W/LocSvc_java(10198): ipProtocol not found in db, default to ipv4v6

// 前后的Dataprofile都是正常的,同上

12-18 02:53:23.463 V/DPM-0   ( 4432): Satisfied profile: [DataProfile=[ApnSetting] T-Mobile US, 2062, 310260, fast.t-mobile.com, , http://mms.msg.eng.t-mobile.com/mms/wapenc, , null, null, 0, mms | supl | hipri | default | xcap | rcs, IPV6, IP, true, 0, false, 0, 0, 0, 1440, 1440, gid, 544D, false, GPRS|EDGE|UMTS|CDMA|CDMA - EvDo rev. 0|CDMA - EvDo rev. A|CDMA - 1xRTT|HSDPA|HSUPA|HSPA|iDEN|CDMA - EvDo rev. B|LTE|CDMA - eHRPD|HSPA+|GSM|TD_SCDMA|LTE_CA|NR, UNKNOWN, 0, -1, -1, false, 3, 961, false, UNEDITED, TrafficDescriptor={mDnn=fast.t-mobile.com, null}, preferred=true], last setup=02:49:23.348

// 同步核实 attach 网络正常

12-18 02:58:27.509 D/RILJ    ( 3502): [0634]> SET_INITIAL_ATTACH_APN[DataProfile=[ApnSetting] T-Mobile US, 2062, 310260, fast.t-mobile.com, , http://mms.msg.eng.t-mobile.com/mms/wapenc, , null, null, 0, mms | supl | hipri | default | xcap | rcs, IPV6, IP, true, 0, false, 0, 0, 0, 1440, 1440, gid, 544D, false, GPRS|EDGE|UMTS|CDMA|CDMA - EvDo rev. 0|CDMA - EvDo rev. A|CDMA - 1xRTT|HSDPA|HSUPA|HSPA|iDEN|CDMA - EvDo rev. B|LTE|CDMA - eHRPD|HSPA+|GSM|TD_SCDMA|LTE_CA|NR, UNKNOWN, 0, -1, -1, false, 3, 961, false, UNEDITED, TrafficDescriptor={mDnn=fast.t-mobile.com, null}, preferred=true] [PHONE0]

// AGPS查询到 APN 时, protocol 仍然是有问题的

12-18 02:58:45.445 D/LocSvc_java( 6627): ipProtocol: IPV4V6 apn: fast.t-mobile.com networkType: LTE state: 1
12-18 02:58:45.446 D/LocSvc_java( 6627): handleAgpsConnOpen mAgpsType: 1 mAPN: fast.t-mobile.com mBearerType: 3

代码分析

直接原因:核对代码是查询条件的差异。

AGPS查询激活的APN

定位服务没有按照卡和APN类型进行查询,而是通过apn值以及激活的APN匹配??

Cursor cursor = mContext.getContentResolver().query(Carriers.CONTENT_URI,new String[] {Carriers.PROTOCOL},selection, null,Carriers.DEFAULT_SORT_ORDER);

调用的形参是 Carriers 的 CONTENT_URI 是 TelephonyProvider 的定义,通用Google 数据库 "content://telephony/carriers"

    /*** Carriers class contains information about APNs, including MMSC information.*/public static final class Carriers implements BaseColumns {/*** The {@code content://} style URL for this table.* For MSIM, this will return APNs for the default subscription* {@link SubscriptionManager#getDefaultSubscriptionId()}. To specify subId for MSIM,* use {@link Uri#withAppendedPath(Uri, String)} to append with subscription id.*/@NonNullpublic static final Uri CONTENT_URI = Uri.parse("content://telephony/carriers");}

一开始认为是客制化 URI 的问题,但是更换了 URL 仍然查询有问题,根因还是筛选的行数据不准确。

TelephonyProvider 的数据库

在 data/user_de/0/com.android.providers.telephony/databases 的 telephony.db 中,APN 配置会加载到 carriers 表。

telephony.db carriers table
telephony.db carriers table

经过格式化的建表DDL SQL,包含49列(不是全部都会存在ApnSetting里面),UNIQUE 有28列,可见不是仅通过mccmnc+mvno 差分APN的。

CREATE TABLE carriers (_id INTEGER PRIMARY KEY,name TEXT DEFAULT '',numeric TEXT DEFAULT '',mcc TEXT DEFAULT '',mnc TEXT DEFAULT '',class TEXT DEFAULT '',apn_source INTEGER DEFAULT -1,modify_apn_name_id INTEGER DEFAULT -1,carrier_id INTEGER DEFAULT -1,apn TEXT DEFAULT '',user TEXT DEFAULT '',server TEXT DEFAULT '',password TEXT DEFAULT '',proxy TEXT DEFAULT '',port TEXT DEFAULT '',mmsproxy TEXT DEFAULT '',mmsport TEXT DEFAULT '',mmsc TEXT DEFAULT '',authtype INTEGER DEFAULT -1,type TEXT DEFAULT '',current INTEGER,sourcetype INTEGER DEFAULT 0,protocol TEXT DEFAULT 'IP',roaming_protocol TEXT DEFAULT 'IP',carrier_enabled BOOLEAN DEFAULT 1,bearer INTEGER DEFAULT 0,bearer_bitmask INTEGER DEFAULT 0,network_type_bitmask INTEGER DEFAULT 0,lingering_network_type_bitmask INTEGER DEFAULT 0,mvno_type TEXT DEFAULT '',mvno_match_data TEXT DEFAULT '',sub_id INTEGER DEFAULT -1,profile_id INTEGER DEFAULT 0,modem_cognitive BOOLEAN DEFAULT 0,max_conns INTEGER DEFAULT 0,wait_time INTEGER DEFAULT 0,max_conns_time INTEGER DEFAULT 0,mtu INTEGER DEFAULT 0,mtu_v4 INTEGER DEFAULT 0,mtu_v6 INTEGER DEFAULT 0,edited INTEGER DEFAULT 0,user_visible BOOLEAN DEFAULT 1,user_editable BOOLEAN DEFAULT 1,owned_by INTEGER DEFAULT 1,apn_set_id INTEGER DEFAULT 0,skip_464xlat INTEGER DEFAULT -1,always_on INTEGER DEFAULT 0,infrastructure_bitmask INTEGER DEFAULT 3,esim_bootstrap_provisioning BOOLEAN DEFAULT 0,UNIQUE (apn_set_id,mmsc,mmsport,numeric,mcc,carrier_enabled,carrier_id,protocol,bearer,mvno_type,infrastructure_bitmask,sourcetype,class,apn,user_editable,mnc,mvno_match_data,owned_by,network_type_bitmask,modify_apn_name_id,proxy,esim_bootstrap_provisioning,port,profile_id,roaming_protocol,name,apn_source,mmsproxy)
);

UNIQUE 是 SQL 中的一种约束条件,用于确保表中某一列或多列的值唯一。它可以防止在数据库表中插入重复的值,从而维护数据的完整性和一致性。

current=1表示正在活跃使用的APN,默认是null的。

telephony.db carriers table - current col
telephony.db carriers table - current col

current 激活案例

插入联通卡驻网,可见current会置为1.

Note:换卡可能不会更新db数据值,这是个问题。必现步骤,刷机插卡开机,能查看到TMO卡各种310-260 160+条被更新为current=1,为什么移动卡不会呢?

adb debug 查询

通过 adb 命令,在 debug 阶段可以方便数据数据

adb shell
# 查询激活的 “ims” APN
content query --uri content://telephony/carriers --where "current=1 AND apn='ims' AND carrier_enabled=1" --sort "name ASC"
# 按值查询APN
content query --uri content://telephony/carriers --where "apn='fast.t-mobile.com' AND carrier_enabled=1" --sort "name ASC"

DataProfile APN配置

在 DPM 中获取并打印ApnSetting信息,结构看ApnSetting builder的字段定义和实现赋值,由 makeApnSetting 查询数据库得到builder 信息。

01-06 19:54:12.753  4552  4552 V DPM-0   : Satisfied profile: [DataProfile=[ApnSetting] T-Mobile US, 2062, 310260, fast.t-mobile.com, , http://mms.msg.eng.t-mobile.com/mms/wapenc, , null, null, 0, mms | supl | hipri | default | xcap | rcs, IPV6, IP, true, 0, false, 0, 0, 0, 1440, 1440, gid, 544D, false, GPRS|EDGE|UMTS|CDMA|CDMA - EvDo rev. 0|CDMA - EvDo rev. A|CDMA - 1xRTT|HSDPA|HSUPA|HSPA|iDEN|CDMA - EvDo rev. B|LTE|CDMA - eHRPD|HSPA+|GSM|TD_SCDMA|LTE_CA|NR, UNKNOWN, 0, -1, -1, false, 3, 961, false, UNEDITED, TrafficDescriptor={mDnn=fast.t-mobile.com, null}, preferred=false], last setup=never

顺序

mEntryName。mId,

mCarrierEnabled, mProfileId, 

Note:没有current的值,说明驻网不会用到和修改。

ApnSetting 字段解析

ApnSetting 字段(按结构体字段)

参考值

toString顺序编号

备注

mEntryName

T-Mobile US

1

配置的carrier字段

mApnName

fast.t-mobile.com

4

实际入网用的APN值

mProxyAddress

5

mProxyPort

9

portToString(mProxyPort)

mMmsc

6

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈: import org.apache.commons.pool2.impl.GenericO…

小程序开发-页面事件之上拉触底实战案例

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

STM32-笔记38-I2C-oled实验

一、什么是I2C? I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用,这是一个相当深奥且重要的概念。为了理解右值引用,我们需要先理解左值和右值的概念,然后再理解左值引用和右值引用。本文将详细解析这些概念,并通过实例进行说明,以揭示右值引用如何…

libevent定时器的性能测试(与rte_timer对比)

前言 接着上篇文章,rte_timer的性能测试https://blog.csdn.net/jacicson1987/article/details/144997298 进行常用的libevent的定时器测试,看看有什么区别,测试方法还是一样,代码放在下面。 测试方法 100万个定时器&#xff0…

C# 事件

目录 1、事件模型的5个组成部分2、使用内置委托类型声明事件2.1 EventHandler2.1.1 &#xff1f;2.1.2 this2.1.3 使用匿名函数和lamda表达式2.1.3.1 匿名函数2.1.3.2 lamda表达式 2.1.4 异常处理 2.2 EventHandler<TEventArgs> 3、使用自定义委托类型声明事件3.1 事件的…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

爬虫学习记录

1.概念 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 通用爬虫:抓取的是一整张页面数据聚焦爬虫:抓取的是页面中的特定局部内容增量式爬虫:监测网站中数据更新的情况,只会抓取网站中最新更新出来的数据 robots.txt协议: 君子协议,网站后面添加robotx.txt…

玩机搞机基本常识-------列举安卓机型一些不常用的adb联机命令

前面分享过很多 常用的adb命令&#xff0c;今天分享一些不经常使用的adb指令。以作备用 1---查看当前手机所有app包名 adb shell pm list package 2--查看当前机型所有apk包安装位置 adb shell pm list package -f 3--- 清除指定应用程序数据【例如清除浏览器应用的数据】 …

【25考研】川大计算机复试情况,重点是啥?怎么准备?

24年进入复试的同学中&#xff0c;有10位同学的复试成绩为0分。具体是个人原因还是校方原因&#xff0c;还尚不明确。但是C哥提醒&#xff0c;一定要认真复习&#xff01;复试完后不要跟任何人讨论有关复试的题目及细节&#xff01; 一、复试内容 四川大学复试内容较多&#xf…

计算机的错误计算(二百零五)

摘要 基于一位读者的问题&#xff0c;提出题目&#xff1a;能用数值计算证明 吗&#xff1f;请选用不同的点&#xff08;即差别大的数&#xff09;与不同的精度。实验表明&#xff0c;大模型理解了题意。但是&#xff0c;其推理能力值得商榷。 例1. 就摘要中问题&#xff0…

回归预测 | MATLAB实GRU多输入单输出回归预测

回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…

unity学习12:地图相关的一些基础2, 增加layer种草种树

目录 参考学习 1 地图设置 1.1 上次制作的地图&#xff0c;稍微加点地形完善下. 1.2 调整下camera 1.3 摄像机camera的移动速度 1.4 地图属性&#xff0c;terrain settings 1.5 但是&#xff0c;地图看起来像沙漠一样&#xff0c;很单调 2 paint terrain / paint textu…

数据挖掘——数据预处理

数据挖掘——数据预处理 数据预处理数据预处理 ——主要任务数据清洗如何处理丢失的数据如何处理噪声数据如何处理不一致数据 数据集成相关分析相关系数(也成为皮尔逊相关系数)协方差 数据规约降维法&#xff1a;PCA主成分分析降数据——抽样法数据压缩 数据预处理 数据预处理…

Python入门教程 —— 网络编程

1.网络通信概念 简单来说,网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。 使用网络的目的,就是为了联通多方然后进行通信,即把数据从一方传递给另外一方。 前面的学习编写的程序都是单机的,即不能和其他电脑上的程…

鸿蒙APP之从开发到发布的一点心得

引言&#xff1a; 做鸿蒙开发大概有1年左右时间了&#xff0c;从最开始的看官方文档、看B站视频&#xff0c;到后来成功发布两款个人APP&#xff08;房贷计算极简版、时简时钟 轻喷&#xff0c;谢谢&#xff09;。简单描述一下里边遇到的坑以及一些经历吧。 学习鸿蒙开发 个…

力扣刷题:数组OJ篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.消失的数字&#xff08;1&#xff09;题目描…

linux下多个硬盘划分到同一挂载点

Linux下多个硬盘划分到同一挂载点 需要明确的几个概念 物理卷: 物理卷是物理存储设备&#xff08;如硬盘分区、整个硬盘、RAID 阵列等&#xff09;在逻辑卷管理&#xff08;LVM - Logical Volume Manager&#xff09;系统中的抽象表示。它是构建逻辑卷组的基本单元 假设我们有…

2.STM32F407ZGT6-外部中断

参考&#xff1a; 1.正点原子。 前言&#xff1a; MCU最重要的一个领域–中断。总结下嵌套向量和外部中断的概念。达到&#xff1a; 1.NVIC是什么&#xff0c;了解中断的整体管理理念。 2.中断里面最简单的外部中断&#xff0c;怎么配置处理。 3.使用STM32CubeMX配置外部中断的…

《HeadFirst设计模式》笔记(下)

代理模式 代理要做的就是控制和管理访问。 你的客户对象所做的就像是在做远程方法调用&#xff0c;但其实只是调用本地堆中的“代理”对象上的方法&#xff0c;再由代理处理所有网络通信的低层细节。 Java的RMI提供了客户辅助对象和服务辅助对象&#xff0c;为客户辅助对象…