日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ims开机注册流程

發布時間:2023/12/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ims开机注册流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???????????????????

目錄

  • 概述
  • Ims注冊時序圖
  • PhoneApp的啟動過程
  • Ims注冊主要代碼
  • 總結
    • 概述

    IMS(IP Multimedia Subsystem)是IP多媒體系統, 是一種新的多媒體業務形式,ims service 結構主要包括 ImsService、ImsManager、MmTelFeatureConnection、ImsCallSession。其中:

  • ImsService:ims的Service,實現了所有的ImsFeature(MmTelFeature和RcsFeature)和ims協議行為。通過ImsResolver綁定。由ImsServiceController來負責管理其生命周期及這個service所支持的ImsFeatures。其主要操作可以通過IImsServiceController來調用。
  • ImsManager:單例類。提供了與IMS services交互的API,如創建ims call。這個類是所有ims相關操作的起點。
  • MmTelFeatureConnection:IImsServiceController binder的容器類。
  • ImsCallSession:負責ImsCall的發起和終止,以及兩個ims端點間的媒體交換。它和ImsService直接交互。
    • Ims注冊時序圖


    ??時序圖從開機后PhoneApp啟動開始到最終發出請求

    PhoneApp是如何開機啟動的呢,下面我們簡要說明一下。

    三、PhoneApp的啟動過程

    首先PhoneApp的主要功能是什么呢?

  • 負責實例化創建Telephony應用框架層(phone),且和phone一起運行在com.android.phone進程中。
  • 管理(CallManager),控制通話相關的UI、功能操作、業務邏輯實現
  • 這里我們需要知道,Android系統中多個應用程序(Apk)是可以運行在同一個進程中的,PhoneApp就是這樣,連同Stk、SMSProvider、TelephonyProvider等模塊都運行在com.android.phone進程中(簡稱phone進程)。

    ??? <application android:name="PhoneApp"android:persistent="true"android:label="@string/phoneAppLabel"android:icon="@mipmap/ic_launcher_phone"android:allowBackup="false"android:supportsRtl="true"android:usesCleartextTraffic="true"android:defaultToDeviceProtectedStorage="true"android:directBootAware="true">


    PhoneApp的路徑是:packages\services\Telephony,我們來看看它的AndroidManifest.xml內容:

  • persistent屬性的作用:開機時被系統自動初始化;該模塊所在的進程(com.android.phone)由于任何原因被kill掉之后,都會自動重啟(這種情況只針對系統內置app,第三方安裝的app不會被重啟)
  • directBootAware屬性的作用:該屬性使得用戶在加密狀態(未解鎖)下能夠正常使用一些手機功能,如鬧鐘、接電話等,但不允許訪問私有應用數據

  • 系統在啟動時會先啟動SystemService,SystemService會啟動各種系統服務,包括AMS:

    private void startBootstrapServices() { .....mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer); ...... }

    ?而ActivityManagerService的SystemReady方法中就有一個啟動PersistentApps的方法,且該應用還需要MATCH_DIRECT_BOOT_AWARE,而PhoneApp正滿足此需求:

    public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { ......startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE); ...... }

    由此可見,PhoneApp會在系統啟動起來的時候由系統自動啟動

    四、Ims注冊主要代碼

    PhoneApp啟動后會先執行onCreate()方法

    packages\services\Telephony\src\com\android\phone\PhoneApp.java

    public class PhoneApp extends Application {PhoneGlobals mPhoneGlobals;TelephonyGlobals mTelephonyGlobals;public PhoneApp() {}@Overridepublic void onCreate() {if (UserHandle.myUserId() == 0) {// We are running as the primary user, so should bring up the// global phone state.mPhoneGlobals = new PhoneGlobals(this);// 創建PhoneGlobals,即Phone的全局狀態mPhoneGlobals.onCreate();mTelephonyGlobals = new TelephonyGlobals(this);mTelephonyGlobals.onCreate();}}

    PhoenApp的onCreate()方法主要創建了mPhoneGlobals對象和mTelephonyGlobals對象,并執行了兩個對象的onCreate()方法,接下來的流程也將圍繞mPhoneGlobals對象的onCreate展開:
    packages\services\Telephony\src\com\android\phone\PhoneGlobals.java

    ??? public void onCreate() {......if (mCM == null) {// Initialize the telephony frameworkPhoneFactory.makeDefaultPhones(this);}......}

    首先通過PhoneFactory makeDefaultPhones,下面看一下makeDefaultPhones方法主要執行的動作
    frameworks\opt\telephony\src\java\com\android\internal\telephony\PhoneFactory.java

    public static void makeDefaultPhone(Context context) { ......for (int i = 0; i < numPhones; i++) {Phone phone = null;int phoneType = TelephonyManager.getPhoneType(networkModes[i]);if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {phone = telephonyComponentFactory.makePhone(context,sCommandsInterfaces[i], sPhoneNotifier, i,PhoneConstants.PHONE_TYPE_GSM,telephonyComponentFactory);} else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {phone = telephonyComponentFactory.makePhone(context,sCommandsInterfaces[i], sPhoneNotifier, i,PhoneConstants.PHONE_TYPE_CDMA_LTE,telephonyComponentFactory);}Rlog.i(LOG_TAG, "Creating Phone with type = " + phoneType + " sub = " + i);sPhones[i] = phone;}// Set the default phone in base class.// FIXME: This is a first best guess at what the defaults will be. It// FIXME: needs to be done in a more controlled manner in the future.sPhone = sPhones[0];sCommandsInterface = sCommandsInterfaces[0];......// Start monitoring after defaults have been made.// Default phone must be ready before ImsPhone is created because ImsService might// need it when it is being opened. This should initialize multiple ImsPhones for// ImsResolver implementations of ImsService.for (int i = 0; i < numPhones; i++) {sPhones[i].startMonitoringImsService();} }

    主要貼了創建GSMPhone和CDMAPhone的方法。

    總結一下makeDefaultPhone()方法:

  • 初始化各種控制接口SubscriptionController,UiccController,主要負責SIM卡狀態信息的控制監聽
  • 根據SIM卡數量創建Phone和RIL實例,并且設置默認Phone和RIL,Phone分為GSM和CDMA兩大種類
  • 啟動ImsResolver并綁定到ImsServices
  • Android中有三種PhoneFactory:

    1.PhoneFactory.java ——–>用于創建GsmCdmaPhone對象

    2.ImsPhoneFactory.java ——–>用于創建ImsPhone對象

    3.SipPhoneFactory.java ——–>用于創建SipPhone對象

    下面跟進startMonitoringImsService方法

    frameworks\opt\telephony\src\java\com\android\internal\telephony\Phone.java

    public void startMonitoringImsService() {if (getPhoneType() == PhoneConstants.PHONE_TYPE_SIP) {return;}synchronized(Phone.lockForRadioTechnologyChange) {IntentFilter filter = new IntentFilter();ImsManager imsManager = ImsManager.getInstance(mContext, getPhoneId());// Don't listen to deprecated intents using the new dynamic binding.if (imsManager != null && !imsManager.isDynamicBinding()) {filter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);filter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);}mContext.registerReceiver(mImsIntentReceiver, filter);if (imsManager != null) {if (imsManager.isDynamicBinding() || imsManager.isServiceAvailable()) {mImsServiceReady = true;updateImsPhone();}}} }

    從上面的代碼中可以看到,startMonitoringImsService() 做了如下動作:

  • 初始化ImsManager
  • 注冊ImsService的UP/DOWN兩個廣播
  • 更新ImsPhone.
  • 當接收到UP廣播后

    private BroadcastReceiver mImsIntentReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) { ......synchronized (Phone.lockForRadioTechnologyChange) {if (intent.getAction().equals(ImsManager.ACTION_IMS_SERVICE_UP)) {mImsServiceReady = true;updateImsPhone();ImsManager.getInstance(mContext, mPhoneId).updateImsServiceConfig(false);} else if (intent.getAction().equals(ImsManager.ACTION_IMS_SERVICE_DOWN)) {mImsServiceReady = false;updateImsPhone();}} }

    通過ImsManager更新ImsService的配置
    frameworks\opt\net\ims\src\java\com\android\ims\ImsManager.java

    public void updateImsServiceConfig(boolean force) { ......if (!mConfigUpdated || force) {try {boolean isImsUsed = updateVolteFeatureValue();isImsUsed |= updateWfcFeatureAndProvisionedValues();isImsUsed |= updateVideoCallFeatureValue();if (isImsUsed || !isTurnOffImsAllowedByPlatform()) {log("updateImsServiceConfig: turnOnIms");turnOnIms();} else {// Turn off IMS if it is not used AND turning off is allowed for carrier.log("updateImsServiceConfig: turnOffIms");turnOffIms();}mConfigUpdated = true;} catch (ImsException e) {loge("updateImsServiceConfig: ", e);mConfigUpdated = false;}}}

    此處turnOnIms()會經過TelephonyManager、ImsResolver、ImsServiceController等類的實現、重寫等。最終在高通私有類ImsService中實現。

    下面是高通私有類的流程

    vendor\qcom\proprietary\commonsys\telephony-apps\ims\src\org\codeaurora\ims\ ImsService.java

    ????@Overridepublic void enableIms(int slotId) {Log.i(this, "enableIms :: slotId=" + slotId);if (slotId > INVALID_SLOT_ID && slotId < getNumSlots()) {mServiceSubs[slotId].turnOnIms();} else {Log.e(this, "enableIms :: Invalid slotId " + slotId);}}

    vendor\qcom\proprietary\commonsys\telephony-apps\ims\src\org\codeaurora\ims\ ImsServiceSub.java

    ????public void turnOnIms() {mCi.sendImsRegistrationState(ImsRegistrationInfo.REGISTERED,mHandler.obtainMessage(EVENT_SET_IMS_STATE));}

    vendor\qcom\proprietary\commonsys\telephony-apps\ims\src\org\codeaurora\ims\ ImsSenderRxr.java

    ???public void sendImsRegistrationState(int imsRegState, Message result) {……queueRequest(rr);try {……?????????imsRadioV10().requestRegistrationChange(rr.mSerial,ImsRadioUtils.regStateToHal(imsRegState));} catch (Exception ex) {removeFromQueueAndSendResponse(rr.mSerial);Log.e(this, msgIdString + "request to IImsRadio: Exception: " + ex);}}

    最后通過ImsSenderRxr把請求發出去。

    上述就是ims從開機到注冊的主要流程,關于時序圖中的ImsPhone那塊,就不在詳細說明了。

    五、總結

    Ims的概念很大,上述只是介紹了它很小的一部分。IMS是一個在分組域(PS)上的多媒體控制/呼叫控制平臺,IMS使得PS具有電路域(CS)的部分功能,支持會話類和非會話類的多媒體業務。IMS為未來的多媒體應用提供了一個通用的業務平臺。

    總結

    以上是生活随笔為你收集整理的Ims开机注册流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。