• Android 运营商与APN配置简介


    1 场景

    各个运营商各种默认属性配置,APN配置,海外项目此类需求会比较多。

    2 运营商配置方法

    2.1 确定配置文件路径

    通过packages/apps/CarrierConfig/src/com/android/carrierconfig/DefaultCarrierConfigService.java来确定XML文件的路径;
    因为有的配置文件会直接放在packages/apps/CarrierConfig/asset/下,而有的配置会放在vendor自定义目录下。

    我们先找到一个mccmnc的宏,如:

    private static final String MCCMNC_PREFIX = "carrier_config_mccmnc_";
    
    • 1

    然后通过MCCMNC_PREFIX去查找,就能找到在函数onLoadConfig()下,通过该函数加载配置文件。

    if (config.isEmpty()) {
    		// fallback to use mccmnc.xml when there is no carrier id named configuration found.
    		parser.setInput(getApplicationContext().getAssets().open(
    						MCCMNC_PREFIX + id.getMcc() + id.getMnc() + ".xml"), "utf-8");
    		config = readConfigFromXml(parser, id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意
    每次在CarrierConfig下配置xml文件之后,都需要在AndroidManifest.xml下更新版本号,以免通过OTA升级的用户无法更新:

    android:versionCode="1"
    android:versionName="1.0.0"
    
    • 1
    • 2

    2.2 关键配置类CarrierConfigManager

    路径:frameworks/base/telephony/java/android/telephony/CarrierConfigManager.java
    所有配置项都可以在CarrierConfigManager里面找得到,自定义项也需要在里面定义好,并附上默认值。

    volte开关:carrier_volte_available_bool

    public static final String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
    
    • 1
    sDefaults.putBoolean(KEY_CARRIER_VOLTE_AVAILABLE_BOOL, false);
    
    • 1

    在指定运营商配置里,我们可以给它打开:

    
    
        
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如运营商名称配置:carrier_name_string

    public static final String KEY_CARRIER_NAME_STRING = "carrier_name_string";
    
    • 1
    sDefaults.putString(KEY_CARRIER_NAME_STRING, "");
    
    • 1

    如carrier_config_mccmnc_46000.xml的配置

    
    
        
            中国移动
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3 APN 配置方法

    3.1 确定apns-conf.xml文件路径

    通过TelephonyProvider.java来载入APN配置
    路径:packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java
    查找apns-conf.xml的路径:device/mediatek/config/apns-conf.xml,各个厂商apns存放路径可能不同,但是一般apns-conf.xml文件名不会变;
    手机里一般存放在/etc/下和/product/下。

    定义:

    private static final String PARTNER_APNS_PATH = "etc/apns-conf.xml";
    
    • 1

    查找PARTNER_APNS_PATH就能找到。

    private File getApnConfFile() {
    		// Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".
    		File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH);
    		File oemConfFile =  new File(Environment.getOemDirectory(), OEM_APNS_PATH);
    		File updatedConfFile = new File(Environment.getDataDirectory(), OTA_UPDATED_APNS_PATH);
    		File productConfFile = new File(Environment.getProductDirectory(), PARTNER_APNS_PATH);
    		confFile = pickSecondIfExists(confFile, oemConfFile);
    		confFile = pickSecondIfExists(confFile, productConfFile);
    		confFile = pickSecondIfExists(confFile, updatedConfFile);
    		return confFile;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后在initDatabase()中调用loadApns()来加载XML文件。

    3.2 常用配置

    如联通的mms APN配置:

      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如移动的上网apn配置:

      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里的default类型为internet类型,即互联网类型。


    欢迎大家补充与指正。
    转载请注明出处,谢谢~

  • 相关阅读:
    LeetCode算法题解(回溯,难点)|LeetCode37. 解数独
    Python 关于加密和解密
    【Mysql】增删改查(基础版)
    Python---格式化输出与%百分号----涉及转义符 \ 反斜杠的使用
    vue修饰符的用法
    RabbitMQ 安装和使用Demo
    MySQL——无法打开MySQL8.0软件安装包或者安装过程中失败,如何解决?
    百度工程师眼中的云原生可观测性追踪技术
    剑指 Offer II 105. 岛屿的最大面积
    DDD—分层架构、洋葱架构、六边形架构
  • 原文地址:https://blog.csdn.net/wys_yuan/article/details/126769083