当前位置: 首页 > news >正文

Android CarrierConfig 参数项和正则匹配逻辑

背景

在编写CarrierConfig的时候经常出现配置不生效的情况,比如运营商支持大范围的imsi,或者是测试人员写卡位数的问题等等,因此就需要模式匹配(包含但不限于正则表达式)。

  1. 基本概念:

    • 模式匹配涉及定义一个“模式”,该模式可以是一个字符串、正则表达式或其他结构。系统将此模式应用于目标数据,找出符合该模式的部分。
  2. 应用场景:

    • 字符串匹配: 查找特定字符序列或模式,例如在文本中查找单词或短语。
    • 数据解析: 分析和提取数据,例如从 JSON 或 XML 文档中提取信息。
    • 正则表达式: 使用正则表达式进行复杂的字符串匹配和替换操作。
    • 逻辑匹配: 例如在函数式编程中,使用模式匹配来简化条件语句。
  3. 编程语言中的模式匹配实现:

    很多编程语言都支持模式匹配的特性,例如:
    • Haskell: 强大的模式匹配功能,可用于列表、元组等数据结构。        
    • Scala: 提供内置的模式匹配语法,用于匹配类型和结构。
    • Java: 使用 Pattern 和 Matcher 类进行正则表达式匹配。
    • Python: 使用 re 模块进行正则表达式匹配。

解析逻辑

packages/apps/CarrierConfig/src/com/android/carrierconfig/DefaultCarrierConfigService.java

详细代码

  1. 参数解析:

    • xmlImsi: 这是从 XML 资源中获取的 IMSI 表达式,它可能是一个正则表达式。
    • id: 这是一个 CarrierIdentifier 对象,提供了当前的 IMSI。
  2. 获取当前 IMSI:

    • String currentImsi = id.getImsi();: 该行代码从 CarrierIdentifier 对象中获取当前的 IMSI 字符串。
  3. 正则表达式匹配:

    • Pattern imsiPattern = Pattern.compile(xmlImsi, Pattern.CASE_INSENSITIVE);: 这行代码将 XML 中的 IMSI 表达式编译成正则表达式模式,并设置为不区分大小写(尽管在 IMSI 字符串中通常不涉及大小写问题)。
    • Matcher matcher = imsiPattern.matcher(currentImsi);: 这行代码创建一个 Matcher 对象,用于比较当前 IMSI。
  4. 执行匹配:

    • matchFound = matcher.matches();: 这个方法检查当前 IMSI 是否与正则表达式匹配。

参数检查 

checkFilters检查的参数包含:

如下代码可见,支持正则匹配的只有imsi和sp。

    /*** Checks to see if an XML node matches carrier filters.** <p>This iterates over the attributes of the current tag pointed to by {@code parser} and* checks each one against {@code id} or {@link Build.DEVICE} or {@link R.string#sku_filter} or* {@link Build.BOARD}. Attributes that are not specified in the node will not be checked, so a* node with no attributes will always return true. The supported filter attributes are,* <ul>*   <li>mcc: {@link CarrierIdentifier#getMcc}</li>*   <li>mnc: {@link CarrierIdentifier#getMnc}</li>*   <li>gid1: {@link CarrierIdentifier#getGid1}</li>*   <li>gid2: {@link CarrierIdentifier#getGid2}</li>*   <li>spn: {@link CarrierIdentifier#getSpn}</li>*   <li>imsi: {@link CarrierIdentifier#getImsi}</li>*   <li>device: {@link Build.DEVICE}</li>*   <li>vendorSku: {@link SystemConfig.VENDOR_SKU_PROPERTY}</li>*   <li>hardwareSku: {@link SystemConfig.SKU_PROPERTY}</li>*   <li>board: {@link Build.BOARD}</li>*   <li>cid: {@link CarrierIdentifier#getCarrierId()}*   or {@link CarrierIdentifier#getSpecificCarrierId()}</li>*   <li>sku: {@link R.string#sku_filter} "sku_filter" that OEM customizable filter</li>* </ul>* </p>** <p>* The attributes imsi and spn can be expressed as regexp to filter on patterns.* The spn attribute can be set to the string "null" to allow matching against a SIM* with no spn set.* </p>** @param parser an XmlPullParser pointing at a START_TAG with the attributes to check.* @param id the carrier details to check against.* @param sku a filter to be customizable.* @return false if any XML attribute does not match the corresponding value.*/static boolean checkFilters(XmlPullParser parser, @Nullable CarrierIdentifier id, String sku) {String vendorSkuProperty = SystemProperties.get("ro.boot.product.vendor.sku", "");String hardwareSkuProperty = SystemProperties.get("ro.boot.product.hardware.sku", "");for (int i = 0; i < parser.getAttributeCount(); ++i) {boolean result = true;String attribute = parser.getAttributeName(i);String value = parser.getAttributeValue(i);switch (attribute) {case "mcc":result = (id == null) || value.equals(id.getMcc());break;case "mnc":result = (id == null) || value.equals(id.getMnc());break;case "gid1":result = (id == null) || value.equalsIgnoreCase(id.getGid1());break;case "gid2":result = (id == null) || value.equalsIgnoreCase(id.getGid2());break;case "spn":result = (id == null) || matchOnSP(value, id);break;case "imsi":result = (id == null) || matchOnImsi(value, id);break;case "device":result = value.equalsIgnoreCase(Build.DEVICE);break;case "vendorSku":result = value.equalsIgnoreCase(vendorSkuProperty);break;case "hardwareSku":result = value.equalsIgnoreCase(hardwareSkuProperty);break;case "board":result = value.equalsIgnoreCase(Build.BOARD);break;case "cid":result = (id == null) || (Integer.parseInt(value) == id.getCarrierId())|| (Integer.parseInt(value) == id.getSpecificCarrierId());break;case "name":// name is used together with cid for readability. ignore for filter.break;case "sku":result = value.equalsIgnoreCase(sku);break;default:Log.e(TAG, "Unknown attribute " + attribute + "=" + value);result = false;break;}if (!result) {return false;}}return true;}

IMSI的匹配逻辑

  1. 参数解析:

    • xmlImsi: 这是从 XML 资源中获取的 IMSI 表达式,它可能是一个正则表达式。
    • id: 这是一个 CarrierIdentifier 对象,提供了当前的 IMSI。
  2. 获取当前 IMSI:

    • String currentImsi = id.getImsi();: 该行代码从 CarrierIdentifier 对象中获取当前的 IMSI 字符串。
  3. 正则表达式匹配:

    • Pattern imsiPattern = Pattern.compile(xmlImsi, Pattern.CASE_INSENSITIVE);: 这行代码将 XML 中的 IMSI 表达式编译成正则表达式模式,并设置为不区分大小写(尽管在 IMSI 字符串中通常不涉及大小写问题)。
    • Matcher matcher = imsiPattern.matcher(currentImsi);: 这行代码创建一个 Matcher 对象,用于比较当前 IMSI。
  4. 执行匹配:

    • matchFound = matcher.matches();: 这个方法检查当前 IMSI 是否与正则表达式匹配。
    /*** Check to see if the IMSI expression from the XML matches the IMSI of the* Carrier.** @param xmlImsi IMSI expression fetched from the resource XML* @param id Id of the evaluated CarrierIdentifier* @return true if the XML IMSI matches the IMSI of CarrierIdentifier, false*         otherwise.*/static boolean matchOnImsi(String xmlImsi, CarrierIdentifier id) {boolean matchFound = false;String currentImsi = id.getImsi();// If we were able to retrieve current IMSI, see if it matches.if (currentImsi != null) {//使用 Pattern 和 Matcher 接口,//使用正则表达式来匹配 xmlImsi 与 currentImsi。//这允许 xmlImsi 采用正则表达式的形式,从而支持更复杂的匹配逻辑,比如匹配特定模式的 IMSI 字符串。Pattern imsiPattern = Pattern.compile(xmlImsi, Pattern.CASE_INSENSITIVE);Matcher matcher = imsiPattern.matcher(currentImsi);matchFound = matcher.matches();}return matchFound;}

资料

  • 展讯平台参考:CarrierConfig配置使用和加载流程简介-CSDN博客
  • AOSP:【Telephony】CarrierConfig加载流程解析&运营商ims配置增删查改(AOSP)-CSDN博客

相关文章:

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况&#xff0c;比如运营商支持大范围的imsi&#xff0c;或者是测试人员写卡位数的问题等等&#xff0c;因此就需要模式匹配&#xff08;包含但不限于正则表达式&#xff09;。 基本概念: 模式匹配涉及定义一个“模式”&a…...

微信小程序中使用离线版阿里云矢量图标

前言 阿里矢量图库提供的在线链接服务仅供平台体验和调试使用&#xff0c;平台不承诺服务的稳定性&#xff0c;企业客户需下载字体包自行发布使用并做好备份。 1.下载图标 将阿里矢量图库的图标先下载下来 解压如下 2.转换格式 贴一个地址用于转换格式&#xff1a;Onlin…...

hive的tblproperties支持修改的属性

文章目录 一、介绍二、查看TBLPROPERTIES属性三、修改TBLPROPERTIES属性 一、介绍 TBLPROPERTIES用途&#xff1a;向表中添加自定义或预定义的元数据属性&#xff0c;并设置它们的赋值。在hive建表时&#xff0c;可设置TBLPROPERTIES参数修改表的元数据&#xff0c;也能通过AL…...

移动端开发

一、一些概念 &#xff08;一&#xff09;、屏幕相关 1、屏幕大小 指屏幕的对角线长度&#xff0c;单位是英寸&#xff08;inch&#xff09;。常用尺寸有&#xff1a;3.5寸、4.7寸、5.0寸、5.5寸、6.0寸等 备注&#xff1a;1英寸&#xff08;inch&#xff09;2.54厘米&…...

光伏行业内卷到什么程度了?

现在每个行业都在内卷&#xff0c;光伏行业也一样在内卷中&#xff0c;但是光伏行业的内卷体现在多个方面&#xff0c;下面给举例。 一、产能竞争激烈&#xff1a; 产能扩张迅速&#xff1a;过去几年&#xff0c;大量资本涌入光伏行业&#xff0c;企业纷纷扩产。例如&#xf…...

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解)

目录 一、前言 二、栈是排列方式 三、栈的单词 四、程序中的栈 五、栈的方法 1.声明并初始化栈 2.往栈里放东西&#xff08;学名&#xff1a;入栈&#xff09; 3.从栈往外拿东西 &#xff08;学名&#xff1a;出栈&#xff09; 4.清空栈 5.遍历 Stack 6.获取Stack的长…...

学习threejs,使用第一视角控制器FirstPersonControls控制相机

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️第一视角控制器FirstPerson…...

odoo17 前端 在头像下拉 dropdown 自定义菜单

odoo17 前端 在头像下拉 dropdown 自定义菜单 其实很简单, 我们先找到原来已经创建好的, 找到代码位置 使用 我的资料 为例 odoo-17.0\addons\hr\static\src\user_menu\my_profile.js /** odoo-module **/import { _t } from "web/core/l10n/translation"; import …...

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中&#xff0c;项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面&#xff0c;分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤&#xff1a; 需求分析…...

GPT-5 要来了:抢先了解其创新突破

Microsoft 的工程师计划于 2024 年 11 月在 Azure 上部署 Orion (GPT-5)。虽然这一版本不会向公众开放&#xff0c;但其上线被视为人工智能领域的一个重要里程碑&#xff0c;并将产生深远的影响。 文章目录 GPT-5 真的要来了GPT-4 的局限性GPT-5 的创新突破与遗留挑战GPT-5 预期…...

@ComponentScan:Spring Boot中的自动装配大师

文章目录 1. 什么是ComponentScan注解&#xff1f;2. 为什么需要ComponentScan注解&#xff1f;3. 如何使用ComponentScan注解&#xff1f;4. ComponentScan注解的高级用法5. 注意事项6. 结语推荐阅读文章 在Spring Boot的世界里&#xff0c;自动装配&#xff08;Auto-wiring&a…...

uniapp 面试题总结常考

uniapp 文件详情 ├── pages # 页面文件夹 │ │── index # index文件夹 │ │ │── index.vue # index页面 ├── static # 静态资源&#xff08;类似于图片 字体图标等&#xff09; │ …...

花了36元给我的个人博客上了一道防御

前言 双11活动薅了个羊毛&#xff0c;1折的价格买了一年的EdgeOne&#xff0c;正好可以为我的个人博客站点保驾护航。本文就来看看个人博客接入EdgeOne后的效果&#xff0c;如果也想薅羊毛的&#xff0c;赶紧去双11活动页面&#xff0c;不要错过这次机会。 EdgeOne 介绍 先简…...

浅谈C++之内存管理

一、基本介绍 内存管理是C最令人切齿痛恨的问题&#xff0c;也是C最有争议的问题&#xff0c;C高手从中获得了更好的性能&#xff0c;更大的自由&#xff0c;C菜鸟的收获则是一遍一遍的检查代码和对C的痛恨&#xff0c;但内存管理在C中无处不在&#xff0c;内存泄漏几乎在每个C…...

719. 找出第 K 小的数对距离

目录 题目解法 题目 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.length 。返回 所有数对距离中 第 k 小的数对距离。…...

【图像压缩感知】论文阅读:Self-supervised Scalable Deep Compressed Sensing

tips&#xff1a;本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。 Title&#xff1a;Self-supervised Scalable Deep Compressed Sensing Journal&#xff1a;IJCV 2024 代码链接&#xff1a;GitHub - Guaishou74851/SCNet: Self-Supervised Scalable Deep Comp…...

Swift 宏(Macro)入门趣谈(一)

概述 苹果在去年 WWDC 23 中就为 Swift 语言新增了“其利断金”的重要小伙伴 Swift 宏&#xff08;Swift Macro&#xff09;。为此&#xff0c;苹果特地用 2 段视频&#xff08;入门和进阶&#xff09;颇为隆重的介绍了它。 那么到底 Swift 宏是什么&#xff1f;有什么用&…...

linux常见资源查询命令(持续更新)

年纪大了&#xff0c;很多命令记不住了&#xff0c;但偶尔也需要用到&#xff0c;通过搜索也需要点时间&#xff0c;特此记录。 不同操作系统命令会有所区别&#xff0c;下面是大部分时候工作的机器系统&#xff1a; CentOS release 7.5 (Final)Kernel \r on an \m 1、实时查…...

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…...

C++ 中的异常处理机制是怎样的?

异常处理的基本概念&#xff1a; 异常: 程序在运行时发生的错误或意外情况。 抛出异常: 使用 throw 关键字将异常传递给调用堆栈。 捕获异常: 使用 try-catch 块捕获和处理异常。 异常类型: 表示异常类别的标识符。 异常处理流程&#xff1a; 抛出异常: 当检测到错误或意…...

我在大厂做开发的5年:那些996的日子

作为一名在互联网大厂摸爬滚打五年的开发工程师&#xff0c;如今转型成为软件测试团队的负责人&#xff0c;回望过去那些被996填满的日子&#xff0c;我有太多话想对同为技术从业者的测试同仁们说。这些经历不仅是我个人的成长印记&#xff0c;更藏着开发与测试岗位在高压环境下…...

智慧无人机航拍巡检数据集 红外行人车辆识别数据集 行人车辆计数图像识别 红外建筑物识别 夜间低光环境下视觉感知算法 安防、交通等领域红外视觉任务 第10355期

深度学习数据集 README数据集核心信息总览维度详情数据类别目标检测类&#xff08;建筑物、人们、车辆、路灯、通用物体、单个行人&#xff0c;共 6 类&#xff09;数据数量图像样本共 60 张&#xff0c;包含训练、验证、测试所需的基础样本量数据集格式图像格式&#xff08;支…...

别再乱加“impressionism”!Midjourney印象派风格生效的3个前置条件,90%新手忽略第2条

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;印象派风格在Midjourney中的本质误读与认知纠偏 当用户在 Midjourney 中输入 --style raw --s 750 并附加诸如 “impressionist painting” 或 “Monet style” 等提示词时&#xff0c;模型实际响应的并非印…...

Esp32Robot入门04-服务端架构与本地Docker拉起(实战进阶:手把手教你用Docker部署小智助手服务端)

Esp32Robot入门04-服务端架构与本地Docker拉起&#xff08;实战进阶&#xff1a;手把手教你用Docker部署小智助手服务端&#xff09; &#x1f4cc; 文章简介&#xff1a; 在AI智能硬件开发中&#xff0c;ESP32-S3因高性价比备受青睐&#xff0c;但面对千亿参数的本地大模型与高…...

(良心整理)亲测靠谱的AI论文网站,毕业生收藏备用

毕业季论文写作真的这么难吗&#xff1f;选题卡壳、文献翻不完、写不下去、查重过不了、格式总不对…… 这份亲测靠谱的AI论文工具合集&#xff0c;涵盖中英文写作、全流程辅助和专项功能&#xff0c;免费和高性价比都有&#xff0c;从开题到定稿全程帮你搞定&#xff0c;毕业生…...

Aube:下一代 Node.js 包管理器,性能远超 pnpm

好的&#xff0c;我已经为您整理了关于新一代 Node.js 包管理器 Aube 的详细介绍文章。文章基于您提供的摘要和 GitHub 仓库的详细文档&#xff0c;扩充了功能介绍、使用场景和命令参考&#xff0c;以形成一个完整的详情页面。 Aube&#xff1a;下一代 Node.js 包管理器&#x…...

明日方舟智能基建管理终极指南:5分钟实现全自动资源生产

明日方舟智能基建管理终极指南&#xff1a;5分钟实现全自动资源生产 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 还在为《明日方舟》繁琐的基建管理而头疼吗&#xff1f;每天花费大量时间手动…...

Diablo Edit2:5分钟掌握暗黑破坏神2终极角色编辑器

Diablo Edit2&#xff1a;5分钟掌握暗黑破坏神2终极角色编辑器 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中反复刷装备的无尽循环&#xff1f;是否因为技能点分配失…...

初次使用Taotoken从注册到发出第一个API请求的全流程耗时记录

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初次使用Taotoken从注册到发出第一个API请求的全流程耗时记录 1. 流程概览与预期 对于初次接触大模型聚合平台的开发者而言&#…...

3个关键设置让Windows风扇控制软件发挥最佳性能

3个关键设置让Windows风扇控制软件发挥最佳性能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanControl.Relea…...