本文基于 Android 7.1.1 版本,对 Phone 的创建流程进行简介。
Android 开源项目代码参见 Android Google Source 和 AndroidXRef,这里使用后者。
GsmCdmaPhone 和 ImsPhone 的创建流程
com.android.phone
Git Repo: platform/packages/services/Telephony/
AndroidManifest
- persistent
应用程序保持永久运行 - defaultToDeviceProtectedStorage & directBootAware
应用程序支持“直接启动”模式
1 | <application android:name="PhoneApp" |
PhoneAPP.onCreate
1 | public void onCreate() { |
PhoneGlobals.onCreate
- 调用 PhoneFactory.makeDefaultPhones,初始化
Phone
- 调用 CallManager.registerPhone,对
Phone
进行注册 - 调用 PhoneInterfaceManager.init, 初始化
Phone
对外的接口
1 | public void onCreate() { |
com.android.internal.telephony
Git Repo: platform/frameworks/opt/telephony
PhoneFactory.makeDefaultPhones
makeDefaultPhone
代码过多,见以下的分段。
1 | public static void makeDefaultPhones(Context context) { |
- 调用 TelephonyDevController.create,管理 telephony 硬件相关的配置,如 SIM 卡
1 | // create the telephony device controller. |
- 创建 DefaultPhoneNotifier对象
1 | sPhoneNotifier = new DefaultPhoneNotifier(); |
- 调用 CdmaSubscriptionSourceManager.getDefault,读取
PREFERRED_CDMA_SUBSCRIPTION
的默认设置 (RUIM/NV)
1 | int cdmaSubscription = CdmaSubscriptionSourceManager.getDefault(context); |
- 考虑 Multi SIM 的情况,根据 SIM 的数量创建存储对象
1 | /* In case of multi SIM mode two instances of Phone, RIL are created, |
- 获取 RILConstants.PREFERRED_NETWORK_MODE,设置首选网络模式
- 为每个
Phone
创建 RIL 对象,负责与 Modem 的通信
1 | for (int i = 0; i < numPhones; i++) { |
- 调用 SubscriptionController.init,管理 Subscription 相关信息
- 调用 UiccController.make,管理 Uicc 相关信息
1 | Rlog.i(LOG_TAG, "Creating SubscriptionController"); |
- 根据
Phone
类型的不同,创建不同的Phone
对象 GsmPhone
和CdmaPhone
在 Android N 中合并为 GsmCdmaPhone
1 | for (int i = 0; i < numPhones; i++) { |
- 设置默认的
Phone
为Phone[0]
,未来应该要加入一些控制条件
1 | // Set the default phone in base class. |
- 建立 SubscriptionInfoUpdater 对象,上报 SIM 卡信息
- 更新
Phone
的能力
1 | Rlog.i(LOG_TAG, "Creating SubInfoRecordUpdater "); |
- 调用 Phone.startMonitoringImsService,监听 IMS 的状态
1 | // Start monitoring after defaults have been made. |
- 通过 ServiceMnager 获取 TelephonyRegistry 的 Binder 代理, 监听当前的状态并上报
1 | ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface( |
- 创建 SubscriptionMonitor 的对象,监听
Subscription
的变化
1 | SubscriptionController sc = SubscriptionController.getInstance(); |
- 创建 PhoneSwitcher 的对象,管理
Phone
的切换
1 | sPhoneSwitcher = new PhoneSwitcher(MAX_ACTIVE_PHONES, numPhones, |
- 创建 ProxyController 的对象,控制 RadioCapability 的相关信息
1 | sProxyController = ProxyController.getInstance(context, sPhones, |
- 为每个
Phone
创建 TelephonyNetworkFactory 的对象,并通过NetworkFactory
和ConnectivityService
进行通信
1 | sTelephonyNetworkFactories = new TelephonyNetworkFactory[numPhones]; |
总结
Phone
的作用:
- 和RIL交互,注册监听事件,并上报消息
- 为上层提供接口