Home | History | Annotate | Download | only in config
      1 page.title=Carrier Configuration
      2 @jd:body
      3 
      4 <!--
      5     Copyright 2015 The Android Open Source Project
      6 
      7     Licensed under the Apache License, Version 2.0 (the "License");
      8     you may not use this file except in compliance with the License.
      9     You may obtain a copy of the License at
     10 
     11         http://www.apache.org/licenses/LICENSE-2.0
     12 
     13     Unless required by applicable law or agreed to in writing, software
     14     distributed under the License is distributed on an "AS IS" BASIS,
     15     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16     See the License for the specific language governing permissions and
     17     limitations under the License.
     18 -->
     19 
     20 <div id="qv-wrapper">
     21   <div id="qv">
     22     <h2>In this document</h2>
     23     <ol id="auto-toc">
     24     </ol>
     25   </div>
     26 </div>
     27 
     28 <p>The Android 6.0 Marshmallow release introduces a capability for privileged
     29 applications to provide carrier-specific configuration to the platform. This
     30 functionality, based on the <a href="uicc.html">UICC carrier privilege
     31 functionality</a> introduced in Android 5.1 (Lollipop MR1), will allow carrier
     32 configuration to be moved away from the static configuration overlays and give
     33 carriers and OEMs the ability to dynamically provide carrier configuration to
     34 the platform through a defined interface.</p>
     35 
     36 <p>A properly signed carrier app can either be preloaded in the system image,
     37 installed automatically, or manually installed through an app store. The app
     38 will be queried by the platform to provide configuration for settings
     39 including:</p>
     40 
     41 <ul>
     42   <li>Roaming/Non-roaming networks
     43   <li>Visual Voicemail
     44   <li>SMS/MMS network settings
     45   <li>VoLTE/IMS configurations
     46 </ul>
     47 
     48 <p class="note"><strong>Note</strong>: This app must be signed with the
     49 certificate that has a matching signature to one on the SIM. See the <a
     50 href="#how_privilege_is_granted_to_a_carrier_app">How is privilege granted to a
     51 Carrier App</a> section for details.</p>
     52 
     53 <p>The determination of what values to return is entirely up to the Carrier App
     54 and can be dynamic based on detailed information passed to the app via the
     55 platform. </p>
     56 
     57 <p>The key benefits of this approach are:</p>
     58 
     59 <ul>
     60   <li><strong>Dynamic configuration</strong> - Support for concepts like
     61 non-MCCMNC derived configuration, for example
     62 mobile virtual network operators (MVNOs) or customer opt in to extra services
     63   <li><strong>Support for devices sold through any channel</strong> - e.g. an
     64 open market phone can be automatically configured with the right
     65 settings by downloading an app from an app store.
     66   <li><strong>Security</strong> - Privilege to provide this configuration is
     67 given only to applications signed by the carrier
     68   <li><strong>Defined API</strong> - Previously this configuration was stored
     69 mostly in internal XML overlays within the framework and not through a public
     70 API. The carrier config API in Android 6.0 is public and well defined.
     71 </ul>
     72 
     73 <h2 id=how_it_works>How it works</h2>
     74 
     75 <h3 id=loading_the_config>Loading the config</h3>
     76 
     77 <p>The carrier configuration supplied by this feature is a set of key-value pairs
     78 that change various telephony-related behaviors in the platform.</p>
     79 
     80 <p>The set of values for a particular device is determined by querying the
     81 following components in order:</p>
     82 
     83 <ol>
     84   <li>The Carrier App (although this is technically optional, it is the recommended
     85 location for additional configuration beyond what exists in the Android Open
     86 Source Project - AOSP)
     87   <li>The Platform Config App bundled with the system image
     88   <li>Default values, hardcoded into the framework (equivalent to the behavior prior
     89 to M)
     90 </ol>
     91 
     92 <p class="caution"><strong>Important</strong>: If a value for a particular key
     93 is returned at any stage, the first value found takes precedence over the
     94 further stages.</p>
     95 
     96 <h4 id=the_platform_config_app>The Platform Config App</h4>
     97 
     98 <p>A generic Platform Config App is bundled with the system image that can supply
     99 values for any variables the regular Carrier App does not. The platform config
    100 app can be found (in M) in: <code>packages/apps/CarrierConfig</code></p>
    101 
    102 <p>This apps purpose is to provide some per-network configuration when a Carrier
    103 App is not installed, and carriers/OEMs should make only minimal changes to it
    104 in their own images. Instead carriers should provide the separate Carrier App
    105 for carrier customization, allowing updates to be distributed via avenues such
    106 as app stores.</p>
    107 
    108 <h4 id=how_privilege_is_granted_to_a_carrier_app>How privilege is granted to a Carrier App</h4>
    109 
    110 <p>The Carrier App in question must be signed with the same certificate found on
    111 the SIM card, as documented in <a href="uicc.html">UICC Carrier Privileges</a>.</p>
    112 
    113 <h4 id=what_information_is_passed_to_the_carrier_app>What information is passed to the Carrier App</h4>
    114 
    115 <p>The Carrier App is supplied with the following values, enabling it to make a
    116 dynamic decision as to what values to return:</p>
    117 
    118 <ul>
    119   <li>MCC
    120   <li>MNC
    121   <li>SPN
    122   <li>IMSI
    123   <li>GID1
    124   <li>GID2
    125 </ul>
    126 
    127 <h4 id=when_loading_the_carrier_config_occurs>When loading the carrier config occurs</h4>
    128 
    129 <p>The building of the list of key value pairs occurs:</p>
    130 
    131 <ul>
    132   <li>When the SIM is loaded (boot, or SIM hot swap)
    133   <li>When the Carrier app manually triggers a reload
    134   <li>When the Carrier app gets updated
    135 </ul>
    136 
    137 <p>See the <a
    138 href="http://developer.android.com/reference/android/service/carrier/CarrierService.html#onLoadConfig(android.service.carrier.CarrierIdentifier)">android.service.carrier.CarrierService#onLoadConfig()</a>
    139 reference for more details.</p>
    140 
    141 <p class="note"><strong>Note</strong>: The platform caches carrier
    142 configuration bundles and loads from the cache for SIM state changes. This is
    143 to speed up boot and SIM hot swap. It is assumed that without a package update
    144 or an explicit <code>notifyConfigChangedForSubId</code>, the config bundle has
    145 not been modified.</p>
    146 
    147 <h3 id=using_the_config>Using the config</h3>
    148 
    149 <p>Once the configuration has been built, the values contained within it are used
    150 to set various values of system configuration, including:</p>
    151 
    152 <ul>
    153   <li>Internal framework telephony settings
    154   <li>SDK-returned configuration values, e.g. in SmsManager
    155   <li>App settings like VVM connection values in the Dialer
    156 </ul>
    157 
    158 <h3 id=configuration_keys>Configuration keys</h3>
    159 
    160 <p>The list of keys is defined as part of the public SDK in <code><a
    161 href="http://developer.android.com/reference/android/telephony/CarrierConfigManager.html">android.telephony.CarrierConfigManager</a></code>
    162 and cannot change within the same API level. See the table below for a summary of keys.</p>
    163 
    164 <h2 id=how_to_build_your_application>How to build your application</h2>
    165 
    166 <h3 id=create_your_application>Create your application</h3>
    167 
    168 <p>Your application must target the Android 6.0 API level (23).</p>
    169 
    170 <h3 id=declare_a_class_that_overrides_android_service_carrier_carrierservice>Declare a class that overrides android.service.carrier.CarrierService</h3>
    171 
    172 <ol>
    173   <li>Override <code>onLoadConfig</code> to return the values you wish to
    174 supply based on the <code>service.carrier.CarrierIdentifier</code> object
    175 passed.
    176   <li>Add logic to call <code>notifyConfigChangedForSubId</code> in scenarios
    177 where carrier configuration may change over time (e.g. when the
    178 user adds extra services to their account)
    179 </ol>
    180 
    181 <p>An example is below:</p>
    182 
    183 <pre>
    184 public class SampleCarrierConfigService extends CarrierService {
    185 
    186     private static final String TAG = "SampleCarrierConfigService";
    187 
    188     public SampleCarrierConfigService() {
    189         Log.d(TAG, "Service created");
    190     }
    191 
    192     &#64;Override
    193     public PersistableBundle onLoadConfig(CarrierIdentifier id) {
    194         Log.d(TAG, "Config being fetched");
    195         PersistableBundle config = new PersistableBundle();
    196         config.putBoolean(
    197             CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true);
    198         config.putBoolean(
    199             CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
    200         config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6);
    201         // Check CarrierIdentifier and add more config if needed
    202         return config;
    203     }
    204 }
    205 </pre>
    206 
    207 
    208 <p>Please see the <a
    209 href="https://developer.android.com/reference/android/service/carrier/CarrierService.html">android.service.carrier.CarrierService</a> reference on developer.android.com for more details.</p>
    210 
    211 <h3 id=name_the_class_in_your_manifest>Name the class in your manifest</h3>
    212 
    213 <p>An example is below:</p>
    214 
    215 <pre>
    216 &lt;service android:name=".SampleCarrierConfigService"
    217 android:label="&#64;string/service_name"
    218 android:permission="android.permission.BIND_CARRIER_SERVICES"&gt;
    219       &lt;intent-filter&gt;
    220       &lt;action android:name="android.service.carrier.ConfigService"/&gt;&lt;/intent-filter&gt;
    221 &lt;/service&gt;
    222 </pre>
    223 
    224 <h3 id=sign_app_with_same_certificate_on_sim>Sign app with same certificate on SIM</h3>
    225 
    226 <p>See <a href="uicc.html">UICC Carrier Privileges</a> for the requirements.</p>
    227 
    228 <h2 id=testing_your_application>Testing your application</h2>
    229 
    230 <p>Once you have built your configuration application, you can test your code
    231 with:</p>
    232 
    233 <ul>
    234   <li>A SIM containing a valid certificate signature
    235   <li>A device running Android 6.0 and later, for example a Nexus device
    236 </ul>
    237