Android:一篇就够!全面&详细解析APN(涉及内容:GGSN,authtype,MVNO,pdp,Apns-conf,supl,hipri,dun)

这篇博客全面解析了Android中的APN,包括APN的概念、GGSN的作用、参数组成,以及APN在虚拟运营商(MVNO)中的应用。内容涵盖APN的存储位置、加载过程、创建机制、SIM卡匹配、PDP时的APN选择以及modem中的APN设置。此外,还讨论了MVNO的APN匹配规则及其在创建和显示过程中的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每篇一格言:
人生就像滚雪球,关键是要找到足够湿的雪,和足够长的坡。
——沃伦巴菲特

1. APN:从概念说起

1.1 从3GPP看APN的定义和角色

Definition of Access Point Name
In the GPRS backbone, an Access Point Name (APN) is a reference to a GGSN. To support inter-PLMN roaming, the internal GPRS DNS functionality is used to translate the APN into the IP address of the GGSN.
——3gpp 23.003

从定义可看出,APN是GGSN的引用,被internal GPRS DNS转换为GGSN的IP地址。
在这里插入图片描述
那么GGSN是什么,又是做什么的呢?
GGSN全称Gateway GPRS Support Node, 网关GPRS支持节点

GGSN主要起网关作用,所扮演的角色:
对内:网络传输; (网络接入控制,分组数据的过滤)
对外:路由器(路由选择和分组的转发,IP地址分配)

1.2 APN包含哪些参数

一个典型的APN包含的参数有名称、MCCMNC、接入点、类型。

下面以CMCC APN为例,它包含下面一些参数:
<apn carrier=“连接互联网” //名称
mcc=“460” //MCC
mnc=“07” //MNC
apn=“cmnet” //接入点
type=“default,supl,net” //类型
/>

APN还可以包含其他更多的参数,主要有下面这些:

在这里插入图片描述

Note :每个有数据业务的运营商都会设定自己的APN,同一个运营商的APN可能有多条,包括分别用于3G或4G,NET和WAP,不同APN的使用范围和收费会有差别。

APN的类型:

常见的APN类型有下面几种,用途和优先级各有不同。
在这里插入图片描述

1.3 APN的存储位置与加载位置

1.3.1 APN的存储位置

APN以XML的格式存储。
文件名
Apns-conf.xml

源码文件路径
MTK平台(通常):alps\mediatek\frameworks\base\telephony\etc
高通平台(通常):android\vendor\qcom\proprietary\telephony-apps\etc

UE文件路径
system/etc/ Apns-conf.xml

当UE开机后,读取XML中的APN并写入到database中。

database中APN 的table名称
content://telephony/carriers
注:有些平台为了适配dual SIM,可能会加上sub1/sub2等。

1.3.2 APN的加载位置

加载到database:
TelephonyProvider读取XML并在database中插入apn的table。

加载到UI菜单:
根据SIM卡的MCCMNC,去匹配database中同样MCCMNC的APN项,并将匹配到的APN填写到菜单列表。

加载到PDP请求:
由DCtracker负责创建/更新waiting APN list,供PDP选用。

1.4虚拟运营商的APN

虚拟运营商(MVNO)没有自营网段,使用了主运营商的网段,因而和主运营商有相同的MCCMNC。为了能够与主运营商区分,虚拟运营商的APN还包含了MVNO参数。MVNO参数分为SPN/PNN/IMSI/GID1,是从SIM卡对应栏位读取的值,目的是从该值中判断该SIM卡是否属于MVNO。

在加载MVNO SIM卡的APN时,会同时去匹配MCCMNC和MVNO参数。

APN的概念部分到此告一段落,下面做个总结:
在这里插入图片描述

2. APN的实现机制

2.1 APN的创建: 从XML到database

在上一章中我们讲到,APN的原始参数存放在XML中;
而UE是通过query database的方式使用APN;
因而必然需要将APN从XML录入到database,这一步在telephonyprovider中实现。

为了更清晰的理解实现思路,避免过多的源码干扰阅读节奏,接下来的分析中涉及到的源码部分,都以伪代码的形式给出,详细的代码以附录形式给出。

telephonyprovider中的initDatabase方法的逻辑(伪代码):

private void initDatabase(SQLiteDatabase db) {
 1.打开APN xml文件etc/apns-conf.xml
 2. 获得文件句柄后,使用FileReader得到文件字符流
 3. 检查APN version一致性
 4.加载XMl中的数据到database,具体见loadApns方法
}

源码点这里
对第3点:“检查APN version一致性” 的说明:
随着OS升级,APN字段也在更新,因此检查APN version的目的是为了避免XML与OS不兼容。若version不一致,抛出异常:

// Sanity check. Force internal version and confidential versions to agree
                int confversion = Integer.parseInt(confparser.getAttributeValue(null, "version"));
                if (publicversion != confversion) {
                    throw new IllegalStateException("Internal APNS file version doesn't match "
                            + confFile.getAbsolutePath());
                }

loadApns的逻辑(伪代码)

private void loadApns(SQLiteDatabase db, XmlPullParser parser) {
1。每次读取parser中的一个element,也就是一条APN数据
2.通过getrow方法将APN转换为Contentvalues;
3.最后通过insertAddingDefaults将键值写入database:
}

写入的table名是CARRIERS_TABLE,该table由createCarriersTable方法创建。
该table url是:content://telephony/carriers/

table 创建时机:
telephonyprovider的内部类DatabaseHelper在oncreate时创建APN table。
DatabaseHelper类负责APN database的增删改查工作。

2.2 APN匹配SIM卡与菜单显示

设备插入SIM后,设置菜单中会显示该SIM卡对应的APN菜单。
这部分在ApnSettings.java (android\packages\apps\settings\src\com\android\settings) 中的fillList方法

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GentlemanTsao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值