Android APN 配置

(http://blog.csdn.net/yangwen123/article/details/10526871)

如果要支持多个运营商的支持就要在apns-conf.xml中加入。

APN概念

APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。是通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。业务流程GPRS专网系统终端上网登录服务器平台的流程为: 
  1)用户发出GPRS登录请求,请求中包括由移动公司为GPRS专网系统专门分配的专网APN; 
  2)根据请求中的APN,SGSN向DNS服务器发出查询请求,找到与企业服务器平台连接的GGSN,并将 用户请求通过GTP隧道封装送给GGSN; 
  3)GGSN将用户认证信息(包括手机号码、用户账号、密码等)通过专线送至Radius进行认证; 
  4)Radius认证服务器看到手机号等认证信息,确认是合法用户发来的请求,向DHCP服务器请求分配 用户地址; 
  5)Radius认证通过后,由Radius向GGSN发送携带用户地址的确认信息; 
  6)用户得到了IP地址,就可以携带数据包,对GPRS专网系统信息查询和业务处理平台进行访问。

Android自带的内部APN配置文件

frameworks/base/core/res/res/xml/apns.xml文件内容:

<!-- If you edit this version, also edit the version in the partner-supplied  apns-conf.xml configuration file -->
<apns version="8">  </apns>  
  • 该文件被编译到res.apk中,通过Android的资源管理器进行访问。

第三方提供的APN配置文件

在Android源码build目录下,通过搜索apns-conf.xml可以找到在各个board中分别有配置:

在编译该product时会将device/generic/goldfish/data/etc/apns-conf.xml文件拷贝到system/etc/目录下,最后打包到system.img中。

APN配置加载

android通过telephony.db数据库中的 carriers表来保存所有的APN配置信息

packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.Java文件中的内部类DatabaseHelper用于创建telephony.db数据库

public void onCreate(SQLiteDatabase db) {  // Set up the database schema  db.execSQL("CREATE TABLE " + CARRIERS_TABLE +  "(_id INTEGER PRIMARY KEY," +  "name TEXT," +  "numeric TEXT," +  "mcc TEXT," +  "mnc TEXT," +  "apn TEXT," +  "user TEXT," +  "server TEXT," +  "password TEXT," +  "proxy TEXT," +  "port TEXT," +  "mmsproxy TEXT," +  "mmsport TEXT," +  "mmsc TEXT," +  "authtype INTEGER," +  "type TEXT," +  "current INTEGER," +  "protocol TEXT," +  "roaming_protocol TEXT," +  "carrier_enabled BOOLEAN," +  "preset BOOLEAN default false," +  "bearer INTEGER);");  //从APN配置xml文件中读取APN配置,并存储到数据表carriers中  initDatabase(db);
}  

APN配置信息加载分为两部分,首先从Android自带的内部APN配置文件中读取配置信息,然后在读取第三方提供的APN配置文件信息。

private void initDatabase(SQLiteDatabase db) {  // Read internal APNS data  Resources r = mContext.getResources();  //读取frameworks/base/core/res/res/xml/apns.xml文件  XmlResourceParser parser = r.getXml(com.android.internal.R.xml.apns);  int publicversion = -1;  try {  XmlUtils.beginDocument(parser, "apns");  //读取APN配置版本信息  publicversion = Integer.parseInt(parser.getAttributeValue(null, "version"));  //加载APN配置信息,并保存到数据表中  loadApns(db, parser);  } catch (Exception e) {  Log.e(TAG, "Got exception while loading APN database.", e);  } finally {  parser.close();  }  // Read external APNS data (partner-provided)  XmlPullParser confparser = null;  // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".  //读取system/etc/apns-conf.xml文件  File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH);  FileReader confreader = null;  try {  confreader = new FileReader(confFile);  confparser = Xml.newPullParser();  confparser.setInput(confreader);  XmlUtils.beginDocument(confparser, "apns");  // 读取第三方提供的APN配置版本号  int confversion = Integer.parseInt(confparser.getAttributeValue(null, "version"));  //判断第三方提供的APN配置版本号是否与Android自带的APN配置版本号相同  if (publicversion != confversion) {  throw new IllegalStateException("Internal APNS file version doesn't match "  + confFile.getAbsolutePath());  }  //如果版本号相同,读取APN配置信息  loadApns(db, confparser);  } catch (FileNotFoundException e) {  // It's ok if the file isn't found. It means there isn't a confidential file  // Log.e(TAG, "File not found: '" + confFile.getAbsolutePath() + "'");  } catch (Exception e) {  Log.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e);  } finally {  try { if (confreader != null) confreader.close(); } catch (IOException e) { }  }
}  

从APN信息加载源码中可以知道,第三方提供的APN配置信息版本必须与内部APN配置信息的版本相同。自此APN配置信息就存储在carriers表中了,并且通过TelephonyProvider向外提供访问接口。

Android 系统(184)---Android APN 配置相关推荐

  1. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  2. android 服务端技术,移动应用服务器端开发(基于JSP技术)-2017 Android系统构架 Android系统构架.docx...

    Android系统构架 PAGE 1 目 录 TOC \o "1-3" \h \z \u 一.Android系统构架 1 二.Linux内核层 2 三.系统运行库层 3 (一)系统 ...

  3. 【android系统】android系统升级流程分析(二)---update升级包分析

    接下来我们将通过几篇文章来分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.今天让我先来分析下升级包update.zip. 一 ...

  4. 【android系统】android系统升级流程分析(一)---recovery模式中进行update包升级流程分析

    今天我们直接来看下android中具体的升级过程是如何的. 升级流程概述 升级的流程图: 升级流程分析 第一步:升级包获取 升级获取可以通过远程下载,也可直接拷贝到指定目录即可. 第二步:准备升级 然 ...

  5. android log抓取方法,Android系统之Android抓取各种log的方法

    Android系统之Android抓取各种log的方法 2018年11月25日 | 萬仟网移动技术 | 我要评论 android之android抓取各种log的方法 1.logcat (四类log b ...

  6. Android 系统(71)---Android系统build.prop文件生成过程

    Android系统build.prop文件生成过程 Android系统build.prop生成过程 这个文件类似于windows的注册表文件,定义了系统初始的一些参数属性,功能的开放等,通过调整或增加 ...

  7. Android 系统(11)---android 系统权限大全

    收集到的android权限都很实用的(permission)大全 1.android.permission.WRITE_USER_DICTIONARY 允许应用程序向用户词典中写入新词 2.andro ...

  8. android系统语音合成,android 语音合成报错

    发现了2个问题 第一个貌似是复制离线的资源出错了(已经核对过读写等权限): 12-19 19:54:49.739 32006-32159/com.zhanglf.youxuanz I/NonBlock ...

  9. Android系统(62)-----Android 7.1 新特性之 Shortcuts 介绍

    Android 7.1 新特性之 Shortcuts 介绍 Android 7.1 允许 App 自定义 Shortcuts,类似 iOS 的 3D touch.通过在桌面长按 App 弹出 Shor ...

  10. android系统怎么刷机教程,如何刷新Android系统? Android手机通用刷机教程

    方法一,刷卡机 1. 在恢复模式下,从sdcard中选择第四项Flash zip. 2. 然后,您将在SD卡中看到所有zip文件. 名称update.zip只是为了找到rom软件包,找到您放入SD卡中 ...

最新文章

  1. 深入解析Javascript中this关键字的使用
  2. Day004_Linux基础命令之特殊符号与正则表达式通配符
  3. windows mysql主主配置_基于docker MySQL数据库主主同步配置(windows上)
  4. 图解Http学习第一章
  5. java与php链条遇到的坑,记一次Java加密加签算法到php的坑
  6. 史上最全的thymleaf标签
  7. python安装失败错误代码0x_详解雨林木风Win10提示“Python 0x80070643安装时发生严重错误”解决方法...
  8. Cesium:加载json数据
  9. mergeBeanDefinition原理
  10. Arp病毒专杀工具下载及其防治解决方案
  11. minist数据集训练与测试
  12. 人工智能数据集文本处理Onehot/TF/TFIDF矩阵的生成
  13. 机器学习模型的部署上线方式
  14. MongoDB World 2016参会全记录
  15. Mysql第一天笔记01——安装mysql
  16. 简易网页(HTML)
  17. MySQL添加字段和修改字段
  18. 2020年年度总结(致敬自己)
  19. DIS和EIS(数码防抖和电子防抖)
  20. Win系统如何取消f1打开浏览器

热门文章

  1. mysql建立索引的优缺点|创建索引alter或create索引分类(PRIMARY KEY,UNIQUE KEY,FULLTEXT,INDEX)作用查看索引show index from table
  2. Linux内核分析 - 网络[四补]:路由表补充
  3. 移植qt常见错误修改方法
  4. java老年代_Java新生代老年代的划分及回收算法
  5. mysql中的各种函数(日期函数、字符串函数、数学函数...)
  6. json解析数组 nlohmann_json解析数组 nlohmann_Nlohmann json学习
  7. oracle 500,500 OOPS: cannot change directory问题
  8. 微信小程序|开发实战篇之request请求(单个、多个参数,json对象,header)
  9. CSS基础学习-13.CSS 浮动
  10. Python3 局部变量与全局变量作用域