
description: “SIM卡/UICC模块的核心架构设计,剖析从底层 HAL 状态上报到 Framework 层的对象树建立、卡状态流转、eSIM MEP 支持以及 Google 的核心设计技巧。”本篇文档聚焦于SIM卡/UICC模块(Universal Integrated Circuit Card)。主要讲解当用户将一张 SIM 卡插入手机后,Android Telephony 框架是如何感知、建立卡状态树,并管理这张卡的生命周期的。设计理念: Google 在 UICC 模块的设计中体现了多项经典软件工程实践:全局单例控制、分层对象树建模、观察者模式事件分发、双缓存(内存+SharedPrefs)快速卡识别、以及完善的关机保护机制。1. 核心职责UICC 模块是 Telephony 运行的基石,它的核心职责包括:状态监听:接收底层 HAL (Radio) 的SIM_STATUS_CHANGED等事件,并解析为 Framework 可读的状态。卡对象树维护:在内存中构建和维护一套反映物理卡片层次结构的对象树(UiccSlot-UiccCard-UiccProfile-UiccCardApplication)。安全与认证:处理 PIN/PUK 码校验,读取卡上的文件系统(EF,Elementary File)获取 IMSI、ICCID 等核心参数。eSIM/MEP 支持:支持 eUICC(嵌入式 SIM)及 MEP(Multiple Enabled Profiles)特性,实现单卡多 Profile 的管理。2. 核心类与源码锚点 (Source Code Anchors)当前工作区内的核心类均位于frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/目录下:[UiccController.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccController.java):UICC 模块的"总司令",全局单例。负责监听所有 RIL 实例的卡状态变化事件。[UiccSlot.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccSlot.java):代表手机上的物理卡槽或 eUICC(eSIM)卡槽。[UiccCard.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccCard.java):代表插在卡槽里的物理卡片。如果卡槽为空,则该对象为 null。[UiccProfile.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccProfile.java):代表卡片上激活的配置文件。对于传统的实体 SIM 卡,一张卡对应一个 Profile;对于 eSIM,一张卡可以包含多个 Profile,但同一时刻只有一个被激活。[UiccCardApplication.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccCardApplication.java):代表 Profile 中的具体应用(如 USIM 应用负责 3G/4G 网络认证,CSIM 应用负责 CDMA 网络认证,ISIM 负责 IMS 认证)。[IccCardStatus.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/IccCardStatus.java):从底层 HAL 上报的卡状态原始数据结构模型。[EuiccCard.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/euicc/EuiccCard.java):继承自UiccCard的 eSIM 卡片实现,支持 Profile 下载、切换等 eUICC 特有操作。[PinStorage.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/PinStorage.java):PIN 码安全存储模块,负责 PIN/PUK 码的加密持久化存储。3. UICC 对象树模型 (Object Hierarchy)Android 框架通过严格的层级关系在内存中模拟了真实的物理卡片结构。"1 对 多""1 对 1""1 对 多 (MEP)""1 对 多""eSIM 扩展"«Singleton»UiccController-UiccSlot[] mUiccSlots-int[] mPhoneIdToSlotId-CommandsInterface[] mCis-ArrayListString mCardStrings-int[] mSimCardState-int[] mSimApplicationState-int mDefaultEuiccCardId+getUiccSlot(int phoneId)+getUiccProfile(int phoneId)+getUiccCardForPhone(int phoneId)UiccSlot-UiccCard mUiccCard-boolean mActive-boolean mIsEuicc-int[] mPortToActiveAppIndexUiccCard-UiccProfile[] mUiccProfiles-int mCardId