08
May
gmsTeardown

There should be no doubt, Google is getting ready to make a lot of announcements at I/O. If we've learned anything from past experiences, Google starts packing its apps full of surprises in the weeks leading up to the big show. The latest update to Play Services started rolling out yesterday and it has grown by a whopping 4 MB, almost 30% larger than the previous version. There's obviously a lot of stuff to look at, so let's just jump right in.

Warning: Spoilers Ahead

Teardown

New Permissions And Features

The first thing many of our readers noticed before installing the apk manually is that it requires a stack of new permissions. In fact, this version asks for 18 new permissions that 4.3 did not.

<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

<uses-permission android:name="android.permission.CALL_PHONE"/>

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

<uses-permission android:name="android.permission.GET_TASKS"/>

<uses-permission android:name="android.permission.READ_CALL_LOG"/>

<uses-permission android:name="android.permission.READ_DREAM_STATE"/>

<uses-permission android:name="android.permission.READ_SMS"/>

<uses-permission android:name="android.permission.RECEIVE_DATA_ACTIVITY_CHANGE"/>

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

<uses-permission android:name="android.permission.RECOVERY"/>

<uses-permission android:name="android.permission.VIBRATE"/>

<uses-permission android:name="com.android.vending.INTENT_VENDING_ONLY"/>

<uses-permission android:name="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"/>

<uses-permission android:name="com.google.android.gms.permission.CHECKIN_NOW"/>

<uses-permission android:name="com.google.android.googlequicksearchbox.permission.PAUSE_HOTWORD"/>

<uses-permission android:name="com.google.android.hangouts.START_HANGOUT"/>

<uses-permission android:name="com.google.android.wearable.READ_SETTINGS"/>

By themselves, most of these aren't that exciting. The most notable items are related to SMS, Hangouts, and Recovery; more on all three in a bit.

There are also a pair of brand new permissions created by Play Services. Both of them have a protection level of signature, which prevents non-Google apps from accessing the related APIs.

<permission android:description="@string/nts_bind_permission" android:name="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE" android:protectionLevel="signature"/>

<permission android:name="com.google.android.gms.permission.CHECKIN_NOW" android:protectionLevel="signature"/>

Permissions aren't the only piece of basic metadata stashed away in the Android manifest, there are also a few tags that are used to declare new feature support, as well. New pieces hint that GMS will be reaching into the camera, possibly for the upcoming Camera API, and Bluetooth Low Energy for the Android Wear support mentioned below.

<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>

<uses-feature android:name="android.hardware.camera.flash" android:required="false"/>

<uses-library android:name="com.google.android.ble" android:required="false"/>

It's not that any one of these things is exciting by itself, but it's clear that Play Services is being readied to take on a LOT of new responsibilities. Some of the things in this list will get a better explanation below, while some of them are a mystery Google will reveal in time.

Android Wear Support

I think we all saw this one coming. Why should everybody have to use a separate (and awkward) companion app with Android Wear when Google could just as easily add it into the GMS package.

strings

<string name="wearable_companion_app_name">Android Wear</string>
<string name="wearable_service_name">Android Wear</string>
<string name="wearable_starting_notification_text">Starting Android Wear</string>
<string name="wearable_status_connected">Connected to a wearable</string>
<string name="wearable_status_connecting">Connecting to a wearable</string>
<string name="wearable_status_disconnected">Disconnected from a wearable</string>
<string name="wearable_status_unknown">Starting up</string>
<string name="wearable_status_wire_protocol_mismatch">Incompatible wearable, please apply any updates.</string>

AndroidManifest

<service android:name="com.google.android.gms.wearable.node.bluetooth.BluetoothClientService" android:process="com.google.android.gms.wearable"/>

<service android:name="com.google.android.gms.wearable.node.bluetooth.BluetoothServerService" android:process="com.google.android.gms.wearable"/>

<service android:name="com.google.android.gms.wearable.node.emulator.NetworkConnectionService" android:process="com.google.android.gms.wearable"/>

<service android:exported="true" android:name="com.google.android.gms.wearable.service.WearableService" android:process="com.google.android.gms.wearable">
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND"/>
</intent-filter>
</service>

<service android:name="com.google.android.gms.wearable.service.WearableControlService" android:process="com.google.android.gms.wearable"/>

<receiver android:name="com.google.android.gms.wearable.service.AutoStarterReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="com.google.android.gms.GMS_UPDATED"/>
<action android:name="com.google.android.gms.INITIALIZE"/>
</intent-filter>
</receiver>

<receiver android:name="com.google.android.gms.wearable.service.AutoStarterReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="com.google.android.gms.GMS_UPDATED"/>
<action android:name="com.google.android.gms.INITIALIZE"/>
</intent-filter>
</receiver>

Now we know that support for Android Wear will just automatically appear on every device running Google's Apps. Of course, it will still require Android 4.3 and above to get the most out of notifications.

SMS, Hangouts, Google Voice, Oh My

I'm not really sure what's going on here. Several new strings turned up with obvious references to Hangouts, SMS, Google Voice, Google Talk (the original name of Hangouts), and Voice/Video chats. And of course there are the RECEIVE_SMS and READ_SMS permissions mentioned earlier. At first glance this looks like it might be related to account ownership verification or some equally simple chore; but frankly, there's too much here for that. Strings for default text responses and an SMS provider just don't belong outside of Hangouts. We're already anticipating the merger of Google Voice with Hangouts to be announced at I/O, but that wouldn't really explain all of this stuff appearing in Play Services.

My best guess is that Google is preparing to expose an API for Hangouts integration, allowing 3rd-party apps to initiate conversations and send messages through the network. Now that Drive and Maps are so thoroughly exposed to app developers, this would seem to make sense, and it aligns well with the recently added START_HANGOUT permission.

strings

<string name="default_decline_reason">"I'm busy right now."</string>
<string name="conn_auth_error_message">"Couldn't sign in to Google Talk. If this is a Google Apps account, confirm that Chat service is enabled for this account."</string>
<string name="conn_auth_error_notify_ticker">"Couldn't authenticate Google Talk"</string>
<string name="conn_auth_error_notify_title">"Couldn't authenticate Google Talk"</string>
<string name="end_cause_network_problem_video">"You couldn't video chat with %1$s because of a network problem. Try again."</string>
<string name="end_cause_network_problem_voice">"You couldn't voice chat with %1$s because of a network problem. Try again."</string>
<string name="end_cause_received_terminate_video">%1$s ended the video chat.</string>
<string name="end_cause_received_terminate_voice">%1$s ended the voice chat.</string>
<string name="end_cause_sent_terminate_video">You ended the video chat with %1$s.</string>
<string name="end_cause_sent_terminate_voice">You ended the voice chat with %1$s.</string>
<string name="end_cause_user_unavailable_video">"%1$s wasn't available for video chat."</string>
<string name="end_cause_user_unavailable_voice">"%1$s wasn't available for voice chat."</string>
<string name="enter_manually_details">Please manually enter your credit or debit card number</string>
<string name="gsf_label">Google Services Framework</string>
<string name="gtalk_service_monitor">GTalk Service Monitor</string>
<string name="gtalkservice_label">Google Messaging Service</string>
<string name="message_too_long">"You can't send messages over 2000 characters in length."</string>
<string name="missed_video_chat_message">%1$s tried to initiate a video chat with you.</string>
<string name="missed_video_chat_message_no_wifi">"%1$s tried to start a video chat with you while you weren't connected to Wi-Fi."</string>
<string name="missed_video_chat_notification">You missed a video chat invite</string>
<string name="missed_video_chat_notification_no_wifi">"You missed a video chat invite because you weren't connected to Wi-Fi."</string>
<string name="missed_voice_chat_message">%1$s tried to initiate a voice chat with you.</string>
<string name="missed_voice_chat_message_no_wifi">"%1$s tried to start a voice chat with you while you weren't connected to Wi-Fi."</string>
<string name="missed_voice_chat_notification">You missed a voice chat invite</string>
<string name="missed_voice_chat_notification_no_wifi">"You missed a voice chat invite because you weren't connected to Wi-Fi."</string>

AndroidManifest

<provider android:authorities="com.google.android.gms.icing.proxy.sms" android:exported="true" android:name="com.google.android.gms.icing.proxy.SmsContentProvider"/>

<service android:enabled="true" android:name="com.google.android.gms.icing.proxy.ProxySmsProviderService"/>

Miscellaneous

There were a few things that probably won't play very big roles, but they might be worth a mention.

Screen Mirroring Via Casting

There are already several strings and a few services dedicated to casting, but a couple of additions may finally bring the built-in screen mirroring feature people have been looking forward to. Not that people didn't have a good reason to think this was already there.

<string name="cast_display_description_extension">(beta feature)</string>

<service android:exported="true" android:name="com.google.android.gms.cast_mirroring.CastMirroringService" android:process="com.google.android.gms.cm">
<intent-filter>
<action android:name="com.google.android.gms.cast_mirroring.service.START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>

Permissions For Google Apps

A bunch of new strings were added with a clear distinction that they are about permissions, but there are no conventional Android permissions to which these would belong. Virtually all of these are specific to either Google's own apps or the services they might reach out to. This implies that Google might be exposing even more services to 3rd-party developers, but adding some kind of confirmation step before granting access to any non-Google app. If I'm right about that, it would probably work a lot like an app requesting root access from most superuser managers like Chainfire's SuperSU or Koush's Superuser.

None of the strings appear to be in use, so we'll probably have to wait a bit to see something done with them, assuming they even stick around. There are several standard or uninteresting examples like AdWords and Google Finance, but there are a few codenames and even a couple of defunct services like Orkut and Knol.

<string name="perm_data_msg_broadcast_desc">Can broadcast data messages received from the Internet to apps registered to listen for them.</string>
<string name="perm_data_msg_broadcast_label">Broadcast data messages to apps.</string>
<string name="perm_receive_data_message_desc">"Allows apps to accept cloud to device messages sent by the app's service. Using this service will incur data usage. Malicious apps could cause excess data usage."</string>
<string name="perm_receive_data_message_label">receive data from Internet</string>
<string name="perm_receive_xmpp_desc">Allows Google apps to send and receive XMPP messages to and from Google servers.</string>
<string name="perm_receive_xmpp_label">send and receive XMPP messages to and from Google servers</string>
<string name="perm_use_xmpp_endpoint_desc">Allows Google apps to send and receive XMPP messages to and from Google servers.</string>
<string name="perm_use_xmpp_endpoint_label">send and receive XMPP messages to and from Google servers</string>
<string name="perm_xmpp_broadcast_desc">Can broadcast XMPP messages received from the Google servers to apps registered to listen for them.</string>
<string name="perm_xmpp_broadcast_label">Broadcast XMPP messages to apps.</string>
<string name="perm_xmpp_endpoint_broadcast_desc">Can broadcast XMPP messages received from the Google servers to apps.</string>
<string name="perm_xmpp_endpoint_broadcast_label">Broadcast XMPP messages to apps.</string>
<string name="permdesc_googleAuth">Allows apps to see the usernames (email addresses) of the Google account(s) you have configured.</string>
<string name="permdesc_googleAuth_adsense">Allows apps to sign in to Google AdSense using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_adwords">Allows apps to sign in to Google AdWords using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_ah">Allows apps to sign in to Google App Engine using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_ALL">Allows apps to sign in to ALL Google services using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_android">Allows apps to sign in to Android services using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_blogger">Allows apps to sign in to Blogger using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_cl">Allows apps to sign in to Google Calendar using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_cp">Allows apps to access the contacts and profile information of account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_dodgeball">Allows apps to sign in to Dodgeball using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_finance">Allows apps to sign in to Google Finance using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_gbase">Allows apps to sign in to Google Base using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_grandcentral">Allows apps to sign in to Google Voice using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_groups2">Allows apps to sign in to Google Groups using the account(s) stored on this Android device</string>
<string name="permdesc_googleAuth_health">Allows apps to sign in to Google Health using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_ig">Allows apps to sign in to iGoogle using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_jotspot">Allows apps to sign in to JotSpot using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_knol">Allows apps to sign in to Knol using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_lh2">Allows apps to sign in to Picasa Web Albums using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_local">Allows apps to sign in to Google Maps using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_mail">Allows apps to sign in to Google mail services using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_mobile">Allows apps to sign in to Google mobile apps using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_news">Allows apps to sign in to Google News using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_notebook">Allows apps to sign in to Google Notebook using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_orkut">Allows apps to sign in to Orkut using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_OTHER">Allows apps to sign in to unspecified Google services using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_print">Allows apps to sign in to Google Book Search using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_sierra">Allows apps to sign in to Google Checkout (and potentially make purchases) using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_sierraqa">Allows apps to sign in to Google Checkout QA using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_sierrasandbox">Allows apps to sign in to Google Checkout Sandbox using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_sitemaps">Allows apps to sign in to Google Webmaster Tools using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_speech">Allows apps to sign in to Google Voice Search using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_speechpersonalization">Allows apps to sign in to the Personalized Speech Recognition service using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_talk">Allows apps to sign in to Google Talk using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_wifi">Allows apps to sign in to Google Wi-Fi using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_wise">Allows apps to sign in to Google Spreadsheets using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_writely">Allows apps to sign in to Google Docs using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_youtube">Allows apps to sign in to YouTube using the account(s) stored on this Android device.</string>
<string name="permdesc_googleAuth_YouTubeUser">Allows apps to see the YouTube username(s) associated with the Google account(s) stored on this Android device.</string>
<string name="permdesc_heartbeat">Can send a heartbeat packet to the Google Talk server to ensure the health of the connection.</string>
<string name="permdesc_intentVendingOnly">Can send broadcasts to Android Market requesting app installation and removal.</string>
<string name="permdesc_readGservices">Allows this app to read Google service configuration data.</string>
<string name="permdesc_readGsettings">Allows this app to read Google settings.</string>
<string name="permdesc_writeGservices">Allows this app to modify Google service configuration data.</string>
<string name="permdesc_writeGsettings">Allows this app to modify Google settings.</string>
<string name="ro_perm_desc">Allows apps to read data from the Google Talk content provider.</string>
<string name="permlab_googleAuth">view configured accounts</string>
<string name="permlab_googleAuth_adsense">AdSense</string>
<string name="permlab_googleAuth_adwords">AdWords</string>
<string name="permlab_googleAuth_ah">Google App Engine</string>
<string name="permlab_googleAuth_ALL">access all Google services</string>
<string name="permlab_googleAuth_android">Android services</string>
<string name="permlab_googleAuth_blogger">Blogger</string>
<string name="permlab_googleAuth_cl">Google Calendar</string>
<string name="permlab_googleAuth_cp">contacts data in Google accounts</string>
<string name="permlab_googleAuth_dodgeball">Dodgeball</string>
<string name="permlab_googleAuth_finance">Google Finance</string>
<string name="permlab_googleAuth_gbase">Google Base</string>
<string name="permlab_googleAuth_grandcentral">Google Voice</string>
<string name="permlab_googleAuth_groups2">Google Groups</string>
<string name="permlab_googleAuth_health">Google Health</string>
<string name="permlab_googleAuth_ig">iGoogle accounts</string>
<string name="permlab_googleAuth_jotspot">JotSpot</string>
<string name="permlab_googleAuth_knol">Knol</string>
<string name="permlab_googleAuth_lh2">Picasa Web Albums</string>
<string name="permlab_googleAuth_local">Google Maps</string>
<string name="permlab_googleAuth_mail">Google mail</string>
<string name="permlab_googleAuth_mobile">Google mobile apps</string>
<string name="permlab_googleAuth_news">Google News</string>
<string name="permlab_googleAuth_notebook">Google Notebook</string>
<string name="permlab_googleAuth_orkut">Orkut</string>
<string name="permlab_googleAuth_OTHER">access other Google services</string>
<string name="permlab_googleAuth_print">Google Book Search</string>
<string name="permlab_googleAuth_sierra">Google Checkout accounts</string>
<string name="permlab_googleAuth_sierraqa">Google Checkout QA accounts</string>
<string name="permlab_googleAuth_sierrasandbox">Google Checkout Sandbox accounts</string>
<string name="permlab_googleAuth_sitemaps">Google Webmaster Tools</string>
<string name="permlab_googleAuth_speech">Google Voice Search</string>
<string name="permlab_googleAuth_speechpersonalization">Personalized Speech Recognition</string>
<string name="permlab_googleAuth_talk">Google Talk</string>
<string name="permlab_googleAuth_wifi">Google Wi-Fi</string>
<string name="permlab_googleAuth_wise">Google Spreadsheets</string>
<string name="permlab_googleAuth_writely">Google Docs</string>
<string name="permlab_googleAuth_youtube">YouTube</string>
<string name="permlab_googleAuth_YouTubeUser">YouTube usernames</string>
<string name="permlab_heartbeat">Send heartbeat to Google Talk server</string>
<string name="permlab_intentVendingOnly">Send broadcasts to Android Market.</string>
<string name="permlab_readGservices">read Google service configuration</string>
<string name="permlab_readGsettings">Read Google settings</string>
<string name="permlab_writeGservices">Modify Google service configuration</string>
<string name="permlab_writeGsettings">Modify Google settings</string>

Firmware Updater!!!

Alright, I confess, I wanted to finish on something big. Don't get too excited, there's not enough information to be sure of exactly how this will be used.

With most teardown discoveries, we have to make guesses based on a few strings and a few images. Rarely is a feature so...complete. I'll just say it: Google Play Services 4.4 has a firmware updater. It's already working, you can pull it up with a simple command line from your computer (or remove 'adb shell' to run it from a terminal emulator right on your device):

adb shell am start -n com.google.android.gms/.update.SystemUpdateActivity

2014-05-08 08.15.132014-05-08 21.41.142014-05-08 08.16.25

Left: Nexus 5, Center: HTC One, Right: Settings and GMS updaters running side-by-side.

It looks and works exactly like the built-in updater on all Nexus devices and most AOSP-based ROMs. My first suspicion was that this is just a shortcut to the standard updater, but it clearly doesn't match HTC's updater when run on the One, and it appears in the task switcher with a different name and process. This explains the presence of android.permission.RECOVERY in the new permissions, and there is certainly enough code to start running this thing today.

strings

<plurals name="system_update_countdown_message">
<item quantity="other">Rebooting to install in %d seconds…</item>
<item quantity="one">Rebooting to install in 1 second…</item>
</plurals>
<string name="system_update_activity_battery_low_charging_text">Battery too low to install system update. Wait for battery to charge sufficiently.</string>
<string name="system_update_activity_battery_low_text">Battery too low to install system update. Connect charger to continue.</string>
<string name="system_update_activity_name">System updates</string>
<string name="system_update_activity_roaming_text">"System updates can't be downloaded while roaming."</string>
<string name="system_update_activity_title">System updates</string>
<string name="system_update_check_now_button_text">Check now</string>
<string name="system_update_complete_label">System update</string>
<string name="system_update_complete_ok_button">OK</string>
<string name="system_update_connection_lost_button_text">Connect to Wi-Fi</string>
<string name="system_update_connection_lost_text">The network connection was lost.</string>
<string name="system_update_countdown_cancel_button">Cancel install</string>
<string name="system_update_countdown_complete">Rebooting now…</string>
<string name="system_update_download_button_text">Download</string>
<string name="system_update_download_failed_no_space_status_text">Insufficient space available to download</string>
<string name="system_update_download_failed_status_text">"Couldn't download"</string>
<string name="system_update_download_retry_button_text">Retry download</string>
<string name="system_update_download_waiting_status_text">Waiting to download</string>
<string name="system_update_downloading_required_update_text">"This could take up to ^1 minutes. Afterwards, the device will automatically restart."</string>
<string name="system_update_downloading_required_update_text_tablet">"This could take up to ^1 minutes. Afterwards, the tablet will automatically restart."</string>
<string name="system_update_downloading_required_update_title">Downloading update…</string>
<string name="system_update_downloading_status_text">Downloading</string>
<string name="system_update_downloading_wifi_status2_text">Via Wi-Fi only until ^1</string>
<string name="system_update_install_button_text">Restart &amp; install</string>
<string name="system_update_installing_update_text">"This could take up to 5 minutes. Afterwards, you'll be able to finish setting up your phone."</string>
<string name="system_update_installing_update_title">Installing update…</string>
<string name="system_update_last_checkin">Last checked for update ^1.</string>
<string name="system_update_no_update_content_text">Your system is up to date.</string>
<string name="system_update_nonmandatory_update_download_failure_notification_message">Download was unsuccessful. Try again.</string>
<string name="system_update_nonmandatory_update_download_failure_notification_title">"Couldn't download system update"</string>
<string name="system_update_not_owner_text">A system software update is available, but only the owner can install it.</string>
<string name="system_update_required_update_restart_text">The device will restart so your system update can be installed.</string>
<string name="system_update_required_update_restart_text_tablet">The tablet will restart so your system update can be installed.</string>
<string name="system_update_required_update_restart_title">About to restart</string>
<string name="system_update_requires_restart_status_text">Requires a restart</string>
<string name="system_update_restart_button_text">Restart (^1)</string>
<string name="system_update_update_available_download_message">Touch to download.</string>
<string name="system_update_update_available_notification_title">System update available</string>
<string name="system_update_update_download_failure_no_space_notification_message">Not enough space available to download system update.</string>
<string name="system_update_update_downloaded_install_message">Touch to install.</string>
<string name="system_update_update_downloaded_notification_title">System update downloaded</string>
<string name="system_update_verification_failed_text">Verification failed</string>
<string name="system_update_verified_status_text">Downloaded and verified</string>
<string name="system_update_verifying_status_text">Verifying</string>

AndroidManifest

<activity android:hardwareAccelerated="true" android:label="@string/system_update_activity_name" android:launchMode="singleTop" android:name="com.google.android.gms.update.SystemUpdateActivity" android:theme="@android:style/Theme.Holo.NoActionBar">
<intent-filter>
<action android:name="android.settings.SYSTEM_UPDATE_SETTINGS"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

<service android:name="com.google.android.gms.update.SystemUpdateService"/>

<receiver android:name="com.google.android.gms.update.SystemUpdateService$SecretCodeReceiver" android:permission="android.permission.REBOOT">
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SECRET_CODE"/>
<data android:host="947322243" android:scheme="android_secret_code"/>
</intent-filter>
</receiver>

<receiver android:exported="true" android:name="com.google.android.gms.update.SystemUpdateService$Receiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_DEVICE_STORAGE_OK"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="android.os.UpdateLock.UPDATE_LOCK_CHANGED"/>
<action android:name="com.google.gservices.intent.action.GSERVICES_CHANGED"/>
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.SECRET_CODE"/>
<data android:host="46" android:scheme="android_secret_code"/>
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.SECRET_CODE"/>
<data android:host="7867" android:scheme="android_secret_code"/>
</intent-filter>
</receiver>

So, what does a fully functional firmware installer in Play Services actually mean? I'm going to kill one dream before it starts. Google is not about to "fix" the device ecosystem by installing stock Android or sending out patches to fix the network stack when exploits like Heartbleed are discovered. That would require violating partnership agreements, carrier policies, bypassing locked bootloaders, and many more things that are far more trouble than they are worth. Sorry guys, it's not happening.

In a more realistic direction, this could simply be an adjustment to how the Nexus devices are updated, giving Google the ability to change aspects of the firmware update process without having to first flash a new firmware. Even I think that sounds a little silly, but it's the simplest explanation. Another easy explanation is that this updater will be tied into Google Cloud Messaging and instead of polling for updates, you'll receive push notifications when there is a new version. Again, I'm doubtful.

I really suspect this is in preparation for the heavily rumored Android Silver program. While we don't have any concrete details, almost everything about Silver points to Google taking very direct control over the specially branded devices. This includes technical support, warranty, replacement, and we can probably assume: software updates. This would be a significant shift from the Google Play Edition family where manufacturers are responsible for both producing and distributing firmware updates after new versions of Android are released. How exactly an updater in GMS will play into that is still not entirely clear, but it will certainly give Google more agility in the update process.

Or maybe I'm wrong and Google is about to go all CyanogenMod on the world.

Wrap-up

That's it for this teardown. It was a monster and I'm exhausted, so I'm not going to waste time with a lot of words. With so many major changes, it's clear Google is going to have a lot of stuff to announce this year. We've still got about 6 more weeks for updates to wiggle out to our devices, so we may still have many more great things to look forward to!

Thanks, Santiago Rosales.

P.S. To the developers in charge of GMS: I saw what you did there. It was annoying, and it slowed me down, a bit... Well done. What else ya' got ;)

Cody Toombs
Cody is a Software Engineer and Writer with a mildly overwhelming obsession with smartphones and the mobile world. If he’s been pulled away from the computer for any length of time, you might find him talking about cocktails and movies, sometimes resulting in the consumption of both.

  • Julius Besser

    What did the devs do to try to slow you down?

    • Jooyoung Hong

      also curious here :)

      • Christopher Mason

        Maybe they obfuscated the apk like with Google Now?

    • Francois Roy

      He cant spoil the fun. Thats Jazz for devs.

    • NF

      /sub

    • http://www.androidpolice.com/ David Ruddock

      If they wanted to slow us down they would hide things. They don't. Google doesn't give us enough to make concrete conclusions, but there's plenty to be inferred.

    • siddude11

      They tried to drug them with more more awesomeness by providing them more code and more teardowns.

    • Waleed Al Suwaimel

      If I remember correctly, Google once referred to the Android Police with a joke in the code lines . They know things can be spoiled if they revealed too much, even in code lines inside of an APK. I think what Mr. Toombs meant by that is that they ran into a lot of "not found" messages before they found a work-around. :D

  • jm9843

    The firmware updater most likely is Google beginning preparation for Project Ara support.

    • http://mwinter.in/ Yan Gabriel Minário

      This. Then Generic Kernel like PC Linux.

  • bhake

    I appreciate the time that the AP team puts into these teardowns. Awesome stuff as always.

  • http://techsym.com/ cubanresourceful

    Is it possible the firmware updater is for Android Wear?

    • Aooga

      Not likely. There are some mentions of "phone" in the updater and I doubt that it would need to reboot your phone into recovery to update a wearable.

  • Darrien Glasser

    Personally I'm hoping the firmware updater makes it so that android works kind of like Windows Phone. Where Microsoft can just go ahead and update the core OS without messing with proprietary apps.

    If android got support for that in the next release, man oh man that'd be great.

    • Aooga

      Meh...I doubt Android will do that any time in the near future. I hope it does, but I doubt it. Android doesn't really have a "core OS". Once the manufacturer/carrier starts messing with stuff, it's going to be really hard to not remove their "customizations" if google were to do this. With WP, the manufacturers/carriers don't really mess too much up. It's mostly adding or removing features which is why wp can do it.

      • Christopher Mason

        What google really needs is stricter rules on how much oems can modify android before they lose gapps. That way they could do that, and wed be rid of some of that overlay crap that oems like to torture users with.

        • TheLastAngel

          We had these discussions at least for five years. Nothing has changed.

  • hp420

    There's something for Wallet in there too, I know it! Yesterday, I installed Paranoid Android, then the Gapps package from May 3, and when I rebooted I got a crap-ton of pop ups telling me to update GMS....Google Wallet is the only one I remember seeing that wasn't covered in this teardown. Maybe it's something you guys should look into. I don't have more evidence than what I've mentioned, but I'd say it's fairly safe to assume that if there wasn't something new in the latest GMS update for wallet, then no pop up would have ever appeared in relation to wallet needing a GMS update.

    • Aooga

      Maybe the gapps package had a older version of play service installed. I could be wrong.

      • hp420

        It did....that was exactly my point. The gapps package was from may 3, and contained the newest version of gms on may 3. It was updated in the play store before I installed gapps, and none of the apps I had installed could use the gms app that was included with the may 5th gapps package.

        • Aooga

          I've lost you. Doesn't it always do that if there's an update to gms?

  • KGB

    Awesome article! Anyone else getting crazy battery drain after updating this? Over the course of this morning, I noticed a 4 hour wake lock because of it. Uninstalled for the time being.

    • Brad Stewart

      I had the same, solved after a reboot

    • godutch

      checkin handoff? I had that one :(

  • cheeto0

    Probably getting it ready for all the stuff that will be added at Google i/o

  • Andrew

    This update tweaked my YouTube app into organizing things. Sent it in as a tip earlier today

    • Fatal1ty_93_RUS

      You mean like this?

      • Andrew

        That's the one.

  • valapsp

    Sometimes I come to the conclusion that AP is Google's secret spoiler.

  • Yuku Sugianto

    Yay for Dodgeball!

  • Christopher Mason

    It makes perfect sense to have the updater built in to GMS. Its currently built into Google Services Framework, but thats quickly being replaced by GMS. Hopefully, GSF wont be in the next android version.

    • didibus

      Why is the acronym for Google Play Services GMS ?

      • http://www.androidpolice.com/author/cody-toombs/ Cody Toombs

        Google Mobile Services. It was the official name before the Play branding came in. I kinda wish it had stayed that way instead of being renamed to Play Services. There really isn't much need to have branded this framework, since it's meant to stay mostly invisible to regular users.

        • Christopher Mason

          I like Play Services. Even developer frameworks need branding.

          • http://www.androidpolice.com/author/cody-toombs/ Cody Toombs

            I don't strictly disagree because the overall statement is true, but there are a couple subtleties that lead me to take an opposing side. To begin with, Google Mobile Services is already branded - it has Google right in the name. Taking on the Play branding is fairly unnecessary, especially since it's actually a less meaningful name.

            Of course, that's just picking at nits; there's a very real reason why adopting sub-brands in developer frameworks is a bad idea. Anybody who has ever worked extensively with Microsoft development technologies will know what I'm about to say. When lower-level branding changes, it results in a lot of tools and libraries carrying different names, especially as some things remain tied to the original name for technical reasons and others adopt new names. This is a very real problem for Microsoft devs. For example, OneDrive has already gone through 3 names in just a few years. The libraries carry the Live branding, most of the documentation and developer blogs still reference SkyDrive, and the actual product is now called OneDrive. I'm not one of those people that still clingings to the hope that Google will go back to using the Android Market name, but I also don't really believe that the Play branding is going to live on forever. When it is eventually changed, it will be a nuisance for devs.

  • NF

    There's personal speech showing up again. That'll be good seeing how voice is taking over everything.

  • Waleed Al Suwaimel

    "So, what does a fully functional firmware installer in Play Services actually mean?"

    Maybe it's 1-click "convert to stock Android" button. Maybe that is the whole story to the "Android silver" thing. Google did not sell a lot of those GPe devices, probably. If in Google's mind, the GPe program was or was partly meant to support the Nexus devices at distributing Google's vision of a streamlined Android and showcase the Android team's efforts, then it was not very successful at that.
    Say this was alive today, owners of non-GPe S4's and One's can convert their phones to Stock without hacking them. A pop-up update message would surely beat sales of GPe devices. The same hardware is in the hands of a lot of people. Why not just send the software wirelessly??
    Devices get certified for the conversion as time goes by. I know the carrier phones will be harder to crack if there was such thing. But think of how Apple works with carriers on updates. Maybe Google can get the carriers certification processes closer to the program and thus accelerating updates.

    Old way:
    GPe Device+ Stock Android ---> User

    New Way:
    Stock Android ------------------>non-GPe Device+User

  • Fatal1ty_93_RUS

    Gotta buy a whole lotta popcorn for I/O this year

  • Gpzhdkxj

    Confused.
    signing into iGoogle? Is that proof service is coming back?

    • Fatal1ty_93_RUS

      Instead of Google+! Yay!

  • Martin Larsson

    Im more thinking that google is trying to merge in apps in their core apps and use the apos as a little chell that starts it all (like the google now launcher does) this could make it harder for manufacturers to block the apps, and possibly allow third party "chell" apps

  • Jonathon Grigg

    Just a warning to those more adventurous like myself, do not enter the secret code 947322243 without a bit of time on your hands (plus it's not worth it). I tried it out of curiosity and subsequently shat my pants as my Nexus 5 immediately proceeded to reboot and then load up a recovery screen saying "Erasing". I have since left it and fortunately it seemed to time out after around 5 minutes and restarted the phone with all my data still intact. Gave me a right fright though. I can't vouch for any of the other codes listed, but I would be careful and have a backup beforehand just in case.

    • Fatal1ty_93_RUS

      What code?

      • Jonathon Grigg

        I found it from this section of the manifest posted above:

        As with any other secret codes (like 4636 for the testing menu) you enter *#*# number with no spaces #*#* into the dialer and it does something. In this case the number is 947322243 but I wouldn't suggest trying it because I can't guarantee that it won't wipe your phone (maybe I was just lucky)

  • TheLastAngel

    Having Android update in the background like Windows, Mac OS and Linux would be the sane thing to do.

    They are just computers and carriers don't need any "policies". If the phone is FCC, CE approved it is fit to run on any network.

    Windows phone shows the way, it is possible to have multiple OEMs and central updates from the OS vendor.

    Is it really too late for Android to ever change into that direction?

    • Thomas

      That's the way they're already supposedly going with Android Silver.

      Even though you are technically correct, that isn't really the reality in the US, that's what Google has tried to fight against both with the Secure Element in the NFC chip and the LTE capabilities.

      Also in the carriers defense, CM also proved that OS updates can be potentially dangerous when they had that build that disabled emergency calls on a device due to a lack of support, granted that would be unlikely to happen in this case, but it does go to show that there's a good reason to have a testing process in place outside the FCC and CE regulations on the hardware.

      Anyway back on topic, I think it's intended that you should take the statement in the context that Google Play Services is a backdoor of sorts for Google, i.e. they do obviously mean Google suddenly pushing updates to devices they really have no right to push updates to.

  • Pierre Gardin

    "Allows apps to sign in to iGoogle"
    "Allows apps to sign in to Google Health"

    Oh, oh.

  • Karan Shrof Karan Shrof

    So is AP Spoiler of Google

  • someone755

    4MB BIGGER? Imagine all the poor saps with 2010 devices with no root that'll complain about storage!

    • http://mavi222.deviantart.com/gallery/ Mavi

      I am seriously upset by this .. I have ZTE Blade with about 100MB-ish of free internal memory space after the factory reset, I am rooted but still there isn't a good way to force apps to the SD card, apps are really slow when I use Link2SD, other apps doesn't work well :C every app I install is still using a little of internal memory.

      It is kick in the face from Google, I am kinda mad, but on the other hand, if they would need to think about the older devices all the time, it would really slow the process of updating the Android OS with new functions and stuff.

      • someone755

        Get a Class 10 SD card. Then, partition your new SDcard so that your /data partition sits there. Now you have all the memory you want (since you can resize the SD card partition as you like) and apps aren't as slow.

      • Alex higs

        I'm sorry, but no company is going to be held back by a crappy (Even back when it was released) 4 year old smart phone.The fact that you think they should, is ridiculous.

        • http://mavi222.deviantart.com/gallery/ Mavi

          Did you even read my comment before replying to it? Because it looks like you didn't...

  • Reyes Cedeño

    "P.S. To the developers in charge of GMS: I saw what you did there. It was annoying, and it slowed me down, a bit... Well done. What else ya' got ;)" #crack

  • Guest

    Could the firmware updater be for the "Android Silver" that we've been hearing so much about??

  • Michał Bednarski

    It seems that what's really happened here is that code from Google Services Framework was moved into Google Play Services, since both permissions for Google apps and firmware updater existed there for some time.

    So we had this firmware updater on our devices installed all the time and I don't expect it to update now something else than Nexus/GPE devices.

    This permission got me interested, since there's no such permission in Android. In order to perform system update you need ACCESS_CACHE_FILESYSTEM + REBOOT + package signed with manufacturer certificate (and of course system with all required drivers...).

    On the upside, although it's not really related to this update, there's in Android 4.3+ config updater that can silently install security updates (SELinux policy, intent firewall policy, list of blocked SMS shortcodes) from Google.

  • Robert Macri

    Whatever happened to Google Body?

  • mid-kid

    You need Google Play Services for Android Wear? I'm out.

  • Jesslyn Hendrix

    You did end on a high note. I now have hope of a Note 3 Silver Edition. I love the Nexus 5, but can't seem to give up my phablet's size.

  • HotTightAss

    I dont really undrstand this stuff but in my personal opinion...as far as permussions go....well I think its all bs cuz they can get into n e thing on n e phone if they really wanted to. (They is the govt/feds or n e 1 who is a good enough hackr to get in) but my guess is u gotta b some1 they r really watchin or maybe jst cuz theyr bored) but thats a good thing if u r a real bad person like a killer or child molester so that I like cuz that way they will get that bad person off the streets n out of society, tho it might b a privacy issue but Im sure there r ways to get around that all together if need b)
    They can also count on the phones service providers which is good too if they need evidence against those who r bad ppl...esp if they know one or more is guilty but cant prove it...so yaaah! service provider records!
    But I was just here cuz I saw on my phone "service wearableservice us in use" n I wanted to kno what it meant.
    I still dont kno...cant seem to find answer.
    Oh well.
    Well, tc all. God bless.

  • HotTightAss

    Oh n 1 more thing...uts called Windows.
    Did u ever stop n think y its called Windows?

    Cuz thats exactly what it is.
    Its a window.

    When u think of a window u think yr car window...house window.

    But this is also called Windows.

    Its called that for a reason.

    Which is a awesome thing if thrs a bad person out thr (n Im sure thr r many) .cuz they can get them...on the othr hand, if ur in ur bedroom n ur masterbating or goin number 2 on the
    toilet....well, thats not such a good thing. N fact thats just downright embarrassing.
    Especially if ur constipated or have the runs or whatever.

    Juuuuust smthn to ponder on.

  • m ratha

    I cannot update Google play service,

Quantcast