騰訊優測優分享 | 雙卡雙待-工程師難言的痛

騰訊優測是專業的移動雲測試平臺,提供全面兼容性測試,遠程真機租用,漏洞分析等多維度的測試服務,讓測試更簡單!
【引子】
移動互聯網的時代,手機通信錄是自然的強社交關係的關係鏈,若是打通產品關係鏈和通信錄關係鏈的通道,能夠極大的豐富產品的關係鏈(見下圖)。
使用電話本信息、打電話、發短信等功能是許多產品的需求點。Android做爲智能手機平臺,電話相關模塊是系統的重要組成部分。但若是開發電話相關的功能就不得不面對「雙卡雙待」的問題。java

  1. 【雙卡雙待背景分析】
    用戶爲了兼顧運營商優點,使用雙卡雙待手機:
    雙卡雙待這項技術在發展中國家使用很廣泛,由於在發展中國家電信運營商發展不夠成熟,相關管理制度不完善。從用戶的角度出發,主要考慮資費問題,好比:移動通話信號好,聯通3G上網流暢、流量費相對便宜,爲了兼顧運營商的優點,用戶選擇雙卡雙待手機。
     
    運營商爲了爭奪原有2G用戶,推出雙卡雙待手機:
    原有國內六大運營商中國移動,中國聯通,中國電信,中國網通,中國鐵通和中國衛通,通過了整合與拆分,用戶在使用制式上各有不一樣包括GSM、TD-SCDMA、WCDMA、CDMA2000;其中GSM佔有量很是大,各運營商在推廣新業務時,不得不兼顧原有GSM用戶。例如電信若是手機只能使用電信卡,市場上推廣會有不少障礙,運營商經過推出雙卡雙待來解決這個問題。
     
    雙卡雙待相關技術發展:
    .兩套芯片,缺點是耗電量大、硬件成本高。這個至關因而兩個手機「粘」在一塊兒。
    .雙卡單待,須要手動切換,不是真正的雙卡雙待,用戶只能使用一張卡。至關於加了一個「開關」。
    .雙卡雙待,使用芯片控制手機在兩個網絡之間切換,由於切換速度很快用戶感受是兩張卡在同時待機。是目前採用的技術手段。
  2. 【雙卡雙待碎片化現狀】
    雙卡方案不統一:
    Android自己碎片化問題嚴重,Google標準API中沒有雙卡雙待的支持,對於雙卡雙待實現方式業界也沒有標準,因而雙卡解決方案有了如今百花齊放、百家爭鳴的局勢。
     
    涉及模塊衆多:
    做爲一個智能手機平臺,電話部分是Android系統的重點功能。電話部分主要功能包括:呼叫(Call)、短信(Sms)、數據鏈接(Data Connection)、Sim卡相關、電話本等。儘管Android整個框架已經使用AIDL機制來解耦,使得各個模塊之間儘量的獨立,但對於開發者和產品人員來講,全部涉及到這些模塊的功能點都會受到雙卡雙待的困擾。
     
    已成事實標準的雙卡雙待逼迫主流廠家開始支持:
    在過去雙卡雙待是山寨手機的一個代名詞,山寨機是最先發現這塊需求並快速響應;後面隨着用戶的普及,不少大手機廠商紛紛推出雙卡雙待手機,包括一些在國外市場只支持單卡的機型,也會在國內作好了雙卡雙待,才推向市場。
    最新的HTC One在國內沒有單卡機器售賣,本來一體的機身設計,後經改裝加入雙卡雙待功能。三星S系列也逐漸鋪開雙卡機型,雙卡雙待已經不是小衆用戶,也不是低端用戶,這個現狀對於開發者是個繞不過的坎兒。若是要開發電話模塊相關的功能,開發團隊必需要解決雙卡雙待的問題。
  3. 【解決策略】
    雙卡雙待實現和真機ROM的Framework層實現密切相關,不一樣的手機實現方式不同,同一系列的手機實現的策略相似,可是可能有差異。下面介紹分析解決的過程:
    3.1 【準備工做】
    工具準備:smali 和 dex2jar
    詳細操做流程請參見工具網站說明
    https://code.google.com/p/dex2jar/
    https://code.google.com/p/smali/downloads/list
    材料準備:須要將適配的雙卡手機 system目錄下的framework 和 app目錄文件提取出來備作反編譯用。
    3.2 【分析過程】
    經過查看Android源代碼和分析真機反編譯代碼能夠看出Android電話模塊架構主要核心機制是:一個服務(好比本文提到的電話服務)對應一個Manager管理類,一個Manager管理類對應一個AIDL接口(Android進程通訊接口),每一個AIDL接口會對應一個具體服務功能的實現。
    電話服務 —> TelephonyManager —>PhoneInterfaceManager(ITelephony)—>底層具體服務
    TelephonyManager(電話服務管理類)
    Android框架中有上下文(context)的概念,不少資源和系統服務能夠直接從上下文中得到,好比要得到電話管理類(TelephonyManager)能夠經過下面方式得到:
    context.getSystemService(「phone」);
     
    咱們經過context 的實現類ContextImpl能夠獲取對電話管理類的訪問
    @Override
    public Object getSystemService(String name) {
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
    return fetcher == null ? null : fetcher.getService(this);
    }
    全部的系統服務管理類,都註冊在SYSTEM_SERVICE_MAP中。
    從上圖源代碼中能夠看到,getSystemService方法最終是靠傳入對應服務的key從SYSTEM_SERVICE_MAP中得到對應的管理類,這裏第一個坑爹點會出現,由於key對應的值,廠商會修改爲各類值,好比有些手機是」phone2」,有些好比HTC手機是」htctelephony」,
    因此須要反編譯廠商源碼去查找這些key值,下邊會詳細講到。
     
    ITelephony(電話相關的AIDL接口)
    TelephonyManager中的具體操做大部分是經過ITelephony接口訪問的,好比得到電話狀態的操做:
    public class TelephonyManager {

    public int getCallState() {
    try {
    return getITelephony().getCallState();
    } catch (RemoteException ex) {
    return CALL_STATE_IDLE;
    } catch (NullPointerException ex) {
    return CALL_STATE_IDLE;
    }
    }

    }
    ITelephony接口位於com.android.internal.telephony.包中,這個包是支撐android.telephony.對外接口的具體實現。
     
    PhoneInterfaceManager (ITelephony的具體實現類,提供具體服務功能)
    TelephonyManager大部分操做是經過ITelephony接口訪問的,也就是經過其實現類PhoneInterfaceManager 來實際得到具體相關操做
    public class PhoneInterfaceManager extends ITelephony.Stub {

    public int getCallState() {
    return DefaultPhoneNotifier.convertCallState(mCM.getState());
    }

    }
    PhoneInterfaceManager 封裝了電話相關的具體服務操做,這些操做最終將消息發送到RIL.java中轉。
     
    RIL.java和底層通訊
    RIL.java是電話相關服務在Java層的信息收發中心。
    RIL.java使用socket和rild進程通訊,RILRequest是一個請求的封裝,經過RILSender將請求命令發送出去,經過RILReceiver接收命令的響應和主動消息。
    進過上述的分析,能夠總結出電話相關服務的架構。
     
    3.3 【架構分析】


Android電話系統分爲四個層次(見上圖):
Phone應用程序層:主要包括電話服務和Phone應用程序。
Java Framework層:主要包括兩個程序包,其中:android.telephony.* 是framework對外溝通的接口,com.android.internal.telephony* 是和底層溝通的橋樑(socket )。
Native Framework層: Rild守護進程。
驅動層:與網絡進行溝通傳輸。
 
爲了支持雙卡雙待功能,廠商實現的Java Framework層在TelephonyManager的節點向下開始自定義API實現對第二張卡的支持,經過反編譯並分析真機的framework.jar能夠獲得自TelephonyManager如下廠商自定義的操做。而後,在App層經過反射調用對應的功能點就能夠實現對兩張卡的操做。
 
3.4【解決方案舉例】
經過對市面上大部分雙卡機型的反編譯分析看,雙卡雙待的解決方案能夠總結爲3類:
TelephonyManager異化:三星、Moto系列
這類真機中提供了兩個電話服務管理類,經過context.getSystemService(」phone2″)能夠獲得電話服務類中的第二張卡的電話服務管理類。這個方案屬於最有節操的,開發成本是最低的。
在android.app.ContextImpl
中註冊上下文的各類管理類,如下爲Google官方代碼中的實現:

如下是反編譯三星 Node2 framework.jar獲得的相關代碼塊
registerService(「phone「, new ServiceFetcher()
{
public Object createService(ContextImpl paramContextImpl)
{
return new TelephonyManager(paramContextImpl.getOuterContext(), 0);
}
});
registerService(「phone2「, new ServiceFetcher()
{
public Object createService(ContextImpl paramContextImpl)
{
return new TelephonyManager(paramContextImpl.getOuterContext(), 1);
}
});
能夠看出經過context.getSystemService(」phone2″),就能夠從上文中提到的SYSTEM_SERVICE_MAP拿到第二張卡的管理類,由於只是管理類實例不同,只須要拿到第二張卡的TelephonyManager實例,全部的方法均可以按照標準API正常使用。
方法異化:MTK芯片系列
MTK解決方案普遍用於聯想以及中興廠商中,這類手機沒有新建Manager管理類,而是在管理類中新加入xxxGemini(int para)的方法,其中int參數表明卡槽,0爲一卡槽,1爲二卡槽。開發者須要經過反射來調用和標準API對應的Gemini方法來實現對應的操做。如下爲反編譯 聯想A750 對應的得到Sim卡狀態的方法具體實現。
public int getSimState()
{
return getSimStateGemini(getDefaultSim());
}
public int getSimStateGemini(int paramInt)
{……}
調用對應的Gemini方法能夠實現對兩張卡的操做,好比:經過反射調用getSimStateGemini分別傳入0和1做爲參數,就能夠得到兩張卡的SIM卡狀態。
新建Manager類:華爲系列
這種方案比較隱蔽的,經過修改增長本身實現類完成對雙卡的支持,如下爲華爲C8825D的處理方案:
首先,獲得對應的管理類
c = Class.forName(「android.telephony.MSimTelephonyManager「);
//其中MSimTelephonyManager類爲廠商自定義的電話服務管理類
而後,經過反射調用對應的方法,能夠成功的返回操做結果
method = c.getDeclaredMethod(「getSimState」, int.class);
 
總結:
雙卡雙待手機的適配過程主要是分析「異化」點,找到在Framework層中是如何區分卡槽的,不一樣的手機實現不一樣,對於TelephonyManager相關的解決方案總結有以上三種。對於短信相關的操做位於SmsManager中,解決策略和TelephonyManager相似,再也不詳細分析。
通過上面的分析過程能夠知道,一個模塊的功能點,適配開發過程當中都須要進行下面三個步驟:
.反編譯系統framework.jar、phone.apk等找到對應功能不一樣卡槽的操做方式。
.在本地代碼中經過反射調用該方法。
.驗證操做是否成功。
過程相對比較複雜,須要反覆的試驗和驗證,並且每款手機都要這樣調查和解決一遍,所以開發成本是至關高的。
大連在Android機型適配上有着豐富的經驗,目前已經開發出一套自動化的機型適配掃描工具–騰訊優測機型掃描系統。經過騰訊優測平臺去檢索代碼中關於雙卡雙待的適配問題,平臺自動檢測代碼可能的機型問題,並提供解決方案,從而能夠極大的減輕開發者負擔,提升適配開發效率。
目前騰訊優測平臺已經接入RDM,在持續集成時能夠勾選機型掃描,持續集成完成後項目組會收到機型掃描後的郵件報告,報告詳細展現了機型適配的問題、影響的機型數量與型號、影響的用戶數評估、相應適配問題的解決方案等;
項目若是想掃描機型問題,能夠經過rdm的持續集成啓動機型掃描。
_______________________________________________________________________________________
 
騰訊優測是專業的移動雲測試平臺,爲應用、遊戲、H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不只在線上平臺提供自動化兼容性測試、雲手機遠程租用與調試、漏洞分析、自動化測試工具Xtest等多種質量檢測工具,更爲VIP客戶配備了專家團隊提供定製化綜合測試解決方案。android

相關文章
相關標籤/搜索