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 ;)