楽天モバイル(楽天UN-LIMIT)対応、VoLTEなカスタムROMを作る

参考) Zenfone2 laser ビルド関連

https://github.com/adazem009
https://github.com/Asus-MSM8916
https://github.com/AospExtended-Devices/device_asus_msm8916-common/
https://github.com/audahadi/android_device_asus_Z00ED
https://github.com/kernel-hut/android_kernel_asus_msm8916/

楽天モバイルのキャリアの特徴

・3GなしのLTEオンリー
・VoLTE対応な端末が必要
・バンドはBAND3
・mcc=440 mnc=11
・VoLTEができない端末向けにRakuten LinkというIP電話アプリが用意されている

ビルドした端末は、Zenfone2Laser/ZE500KL(コード名=Z00ED,Z00xD)

SIMフリー
ブートローダアンロック可能
・BAND3対応
・auVoLTE対応に対応したと記載されている
・バッテリが着脱可能
・SOCはmsm8916とスペック低

したがってLTEオンリー、VoLTE対応のROMをビルドすれば動くはず。
(モデムチップがどこまでVoLTEできているかわからないけど)
9,10では既にLTEオンリー/VoLTEのカスタムROMがダウンロードできるが、7.1では動作しているものが見つからないので実装してみた。

Zenfone2Laserの9.0, 10.0 のバイナリは以下からダウンロードできる

https://github.com/Asus-MSM8916/lineage_OTA/releases/

手順1) 設定の優先ネットワークタイプでLTEオンリーを選べるようにする

設定アプリでは通常 LTE, 3G, 2G がリストで出てくるが、これを変更。
設定アプリの優先ネットワークタイプに*#*#4636#*#*で出てくるリストを選べるようにする

ソース)
packages/services/Telephony/src/com/android/phone/MobileNetworkSettings.java

private void updateBodyAdvancedFields(Activity activity, PreferenceScreen prefSet,
        int phoneSubId, boolean hasActiveSubscriptions) {
...
    //Get the networkMode from Settings.System and displays    it
    mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
    mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
    UpdatePreferredNetworkModeSummary(settingsNetworkMode);
    UpdateEnabledNetworksValueAndSummary(settingsNetworkMode);
+
+   // Display preferred network type based    on what modem returns b/18676277
+   mPhone.setPreferredNetworkType(settingsNetworkMode, 
+       mHandler.obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));

   /**
     * Enable/disable depending upon if there are any active subscriptions.
     *
     * I've decided to put this enable/disable code at the bottom as the

※この挿入のコードは、8.x~9.xでもそのまま動作するみたい

手順2) apns-conf.xmlの修正

楽天用にvendor/cm/prebuilt/common/etc/apns-conf.xml に以下の2行を挿入する

  <apn carrier="rakuten.jp" mcc="440" mnc="11" apn="rakuten.jp" protocol="IPV4V6" roaming_protocol="IPV4V6" type="default,supl" />
  <apn carrier="IMS" mcc="440" mnc="11" apn="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" type="ims" />

※8.x以降は、vendor/lineage/prebuilt/common/etc/apns-conf.xml

手順3) overlay/frameworks/base/core/res/res/values/config.xmlにvolteのフラグを追加する

    <bool name="config_device_volte_available">true</bool>

手順4) overlay/packages/apps/CarrierConfig/res/xml/vendor.xmlにキャリア分を登録する

※packages/apps/CarrierConfig/assertに直接各種キャリア分を作成しても構わない

<carrier_config_list>
    <carrier_config>
        <boolean name="apn_expand_bool" value="true" />
        <boolean name="allow_adding_apns_bool" value="true" />
        <boolean name="world_phone_bool" value="true" />
        <boolean name="show_cdma_choices_bool" value="true" />
        <boolean name="show_apn_setting_cdma_bool" value="true" />
         ....
    </carrier_config>

<!-- docomo -->
    <carrier_config mcc="440" mnc="10">
        <boolean name="carrier_volte_available_bool" value="true" />
        <boolean name="enabledMMS" value="false" />
        <boolean name="hide_ims_apn_bool" value="false" />
        <boolean name="hide_enhanced_4g_lte_bool" value="false" /> <!-- for 9.0 --> 
    </carrier_config>

<!-- rakuten -->
    <carrier_config mcc="440" mnc="11">
        <boolean name="carrier_volte_available_bool" value="true" />
        <boolean name="config_carrier_ims_call_deflect" value="true" />
        <boolean name="hide_ims_apn_bool" value="false" />
        <boolean name="enabledMMS" value="false" />
        <boolean name="hide_enhanced_4g_lte_bool" value="false" /> <!-- for 9.0 --> 
    </carrier_config>

<!-- softbank -->
    <carrier_config mcc="440" mnc="20">
        <boolean name="carrier_volte_available_bool" value="true" />
        <boolean name="hide_enhanced_4g_lte_bool" value="false" /> <!-- for 9.0 --> 
        <boolean name="hide_ims_apn_bool" value="false" />
    </carrier_config>

<!-- kddi lte/cdma -->
    <carrier_config mcc="440" mnc="50">
        <boolean name="show_cdma_choices_bool" value="true" />
        <boolean name="show_apn_setting_cdma_bool" value="true" />
    </carrier_config>

<!-- kddi volte -->
    <carrier_config mcc="440" mnc="51">
        <boolean name="carrier_volte_available_bool" value="true" />
        <boolean name="show_cdma_choices_bool" value="true" />
        <boolean name="show_apn_setting_cdma_bool" value="true" />
        <boolean name="carrier_wfc_ims_available_bool" value="true" />
        <int name="carrier_default_wfc_ims_mode_int" value="2" />
        <boolean name="hide_ims_apn_bool" value="false" />
        <boolean name="hide_enhanced_4g_lte_bool" value="false" /> <!-- for 9.0 --> 
    </carrier_config>

</carrier_config_list>

ソフトバンクDocomo, au 分も記述しているが、SIMを持っていないので不明。

備考1)4G LTE拡張モードボタンが出るかどうかの判定(9.0も併記)

判定のリソース
packages/apps/CarrierConfig/assets or device/xxx/overlay/apps/CarrierConfig/xml で記述

<boolean name="editable_enhanced_4g_lte_bool" value="true" />

これはtrueに設定してもアプリ設定で表示されるか否かは、ソース内で判定している
(デフォルトはソース内でtrueに設定されている)

ソース1)

frameworks/base/telephony/java/android/telephony/CarrierConfigManager.java

public static final String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool";

9.0では以下が追加

public static final String KEY_HIDE_ENHANCED_4G_LTE_BOOL = "hide_enhanced_4g_lte_bool";

ソース2)設定でのボタン名称

packages/services/Telephony/res/values-ja/strings.xml

  <string name="enhanced_4g_lte_mode_title" msgid="522191650223239171">"4G LTE拡張モード"</string>
   <string name="enhanced_4g_lte_mode_title_variant" msgid="4871126028907265406">"高度な通話機能"</string>

ソース3)

7.1でのソース
packages/services/Telephony/src/com/android/phone/MobileNetworkSettings.java

    // Enable enhanced 4G LTE mode settings depending on whether exists on platform
    // or in multi-sim cases, depending on whether ImsPhone exists for that subscription
    if (!(ImsManager.isVolteEnabledByPlatform(this)
            && ImsManager.isVolteProvisionedOnDevice(this)) || (mPhone.getImsPhone() == null)) {
        Preference pref = prefSet.findPreference(BUTTON_4G_LTE_KEY);
        if (pref != null) {
            prefSet.removePreference(pref);
        }
    }

9.0では以下のようになっている
packages/services/Telephony/src/com/android/phone/MobileNetworkSettings.java

    try {
        if ((mImsMgr == null
                || mImsMgr.getImsServiceState() != ImsFeature.STATE_READY
                || !mImsMgr.isVolteEnabledByPlatform()
                || !mImsMgr.isVolteProvisionedOnDevice()
                || carrierConfig.getBoolean(
                CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL))) {
            getPreferenceScreen().removePreference(mButton4glte);
        } else {
            mButton4glte.setEnabled(is4gLtePrefEnabled(carrierConfig)
                    && hasActiveSubscriptions());
            boolean enh4glteMode = mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
                    && mImsMgr.isNonTtyOrTtyOnVolteEnabled();
            mButton4glte.setChecked(enh4glteMode);
        }
    } catch (ImsException ex) {

結果)各判定のログ出力を仕込んで見てみる

$ logcat -b all | grep CHECK
...
 D NetworkSettings: CHECK:isVolteEnabledByPlatform()==TRUE
 D NetworkSettings: CHECK:isVolteProvisionedOnDevice()==TRUE
 D NetworkSettings: CHECK:mPhone.getImsPhone()==NULL

となって、getImsPhone()で失敗している。残念ながらVoLTEは出来なかった。
RakutenLinkアプリで通話やSMSができるようになったからまあ良しとするか。

備考2)RR7.1の日本語が足りない表記の修正

・Connected line identificationが英語のまま
packages/services/Telephony/res/values/cm_strings.xml

   <!-- Mobile network settings, COLP -->
    <string name="connected_line_identification_title">Connected line identification</string>
    <string name="connected_line_identification_summary">Disable this option if the numbers of the recipients don't show up in the call history</string>

-> LineageOS github から values-ja/cm_strings.xml を参照して持ってくる

備考3)RR7.1の拡張カスタマイズの日本語タイトル名が表示されない、数字が出ている。英語名=Pie control

apps/Settings/res/values-en-rUS/rr_strings.xml

<string name="pa_pie_control_title">Pie control</string>

apps/Settings/res/values-ja/rr_strings.xml に以下を追加

  <string name="pa_pie_control_title">Pie設定</string>