06 Dec 2016

feedAndroid Developers Blog

Saving Data: Reducing the size of App Updates by 65%

Posted by Andrew Hayden, Software Engineer on Google Play

Android users are downloading tens of billions of apps and games on Google Play. We're also seeing developers update their apps frequently in order to provide users with great content, improve security, and enhance the overall user experience. It takes a lot of data to download these updates and we know users care about how much data their devices are using. Earlier this year, we announced that we started using the bsdiff algorithm (by Colin Percival). Using bsdiff, we were able to reduce the size of app updates on average by 47% compared to the full APK size.

Today, we're excited to share a new approach that goes further - File-by-File patching.App Updates using File-by-File patching are, on average, 65% smaller than the full app, and in some cases more than 90% smaller.

The savings, compared to our previous approach, add up to 6 petabytes of user data saved per day!

In order to get the new version of the app, Google Play sends your device a patch that describes the differences between the old and new versions of the app.

Imagine you are an author of a book about to be published, and wish to change a single sentence - it's much easier to tell the editor which sentence to change and what to change, rather than send an entirely new book. In the same way, patches are much smaller and much faster to download than the entire APK.

Techniques used in File-by-File patching

Android apps are packaged as APKs, which are ZIP files with special conventions. Most of the content within the ZIP files (and APKs) is compressed using a technology called Deflate. Deflate is really good at compressing data but it has a drawback: it makes identifying changes in the original (uncompressed) content really hard. Even a tiny change to the original content (like changing one word in a book) can make the compressed output of deflate look completely different. Describing the differences between the original content is easy, but describing the differences between the compressed content is so hard that it leads to inefficient patches.

Watch how much the compressed text on the right side changes from a one-letter change in the uncompressed text on the left:

File-by-File therefore is based on detecting changes in the uncompressed data. To generate a patch, we first decompress both old and new files before computing the delta (we still use bsdiff here). Then to apply the patch, we decompress the old file, apply the delta to the uncompressed content and then recompress the new file. In doing so, we need to make sure that the APK on your device is a perfect match, byte for byte, to the one on the Play Store (see APK Signature Schema v2 for why).

When recompressing the new file, we hit two complications. First, Deflate has a number of settings that affect output; and we don't know which settings were used in the first place. Second, many versions of deflate exist and we need to know whether the version on your device is suitable.

Fortunately, after analysis of the apps on the Play Store, we've discovered that recent and compatible versions of deflate based on zlib (the most popular deflate library) account for almost all deflated content in the Play Store. In addition, the default settings (level=6) and maximum compression settings (level=9) are the only settings we encountered in practice.

Knowing this, we can detect and reproduce the original deflate settings. This makes it possible to uncompress the data, apply a patch, and then recompress the data back to exactly the same bytes as originally uploaded.

However, there is one trade off; extra processing power is needed on the device. On modern devices (e.g. from 2015), recompression can take a little over a second per megabyte and on older or less powerful devices it can be longer. Analysis so far shows that, on average, if the patch size is halved then the time spent applying the patch (which for File-by-File includes recompression) is doubled.

For now, we are limiting the use of this new patching technology to auto-updates only, i.e. the updates that take place in the background, usually at night when your phone is plugged into power and you're not likely to be using it. This ensures that users won't have to wait any longer than usual for an update to finish when manually updating an app.

How effective is File-by-File Patching?

Here are examples of app updates already using File-by-File Patching:


Application
Original Size
Previous (BSDiff) Patch Size
(% vs original)
File-by-File Patch Size (% vs original)
71.1 MB
13.4 MB (-81%)
8.0 MB (-89%)
32.7 MB
17.5 MB (-46%)
9.6 MB (-71%)
17.8 MB
7.6 MB (-57%)
7.3 MB (-59%)
18.9 MB
17.2 MB (-9%)
13.1 MB (-31%)
52.4 MB
19.1 MB (-64%)
8.4 MB (-84%)
16.2 MB
7.7 MB (-52%)
1.2 MB (-92%)


Disclaimer: if you see different patch sizes when you press "update" manually, that is because we are not currently using File-by-file for interactive updates, only those done in the background.

Saving data and making our users (& developers!) happy

These changes are designed to ensure our community of over a billion Android users use as little data as possible for regular app updates. The best thing is that as a developer you don't need to do anything. You get these reductions to your update size for free!

If you'd like to know more about File-by-File patching, including the technical details, head over to the Archive Patcher GitHub project where you can find information, including the source code. Yes, File-by-File patching is completely open-source!

As a developer if you're interested in reducing your APK size still further, here are some general tips on reducing APK size.

06 Dec 2016 8:06pm GMT

05 Dec 2016

feedAndroid Developers Blog

Welcoming Android 7.1.1 Nougat

Posted by Dave Burke, VP of Engineering

Android Nougat

Android 7.1.1 Nougat!

Today we're rolling out an update to Nougat -- Android 7.1.1 for Pixel and Pixel XL devices and the full lineup of supported Nexus devices. We're also pushing the Android 7.1.1 source code to the Android Open Source Project (AOSP) so that device makers can get their hands on the latest version of Android.

With Android 7.1.1 officially on it's way to users, it's a good time to make sure your apps are ready.

What's in Android 7.1.1?

Android 7.1.1 is an incremental release that builds on the features already available on Pixel and Pixel XL devices, adding a handful of new features for consumers as well as optimizations and bug fixes on top of the base Android 7.1 platform (API level 25).

If you haven't explored the developer features, you'll want to take a look at app shortcuts, round icon resources, and image keyboard support, among others -- you can see the full list of developer features here. For details on API Level 25, check out the API diffs and the API reference.

You can find an overview of all of the Android Nougat developer resources here, including details on the core Android 7.0 Nougat behavior changes and developer features.c

Coming to consumer devices soon

We're starting the Android 7.1.1 rollout today, and we expect it to reach all eligible devices over the next several weeks. Pixel and Pixel XL devices will get the over-the-air (OTA) update, as will Nexus 5X, Nexus 6P, Nexus 6, Nexus 9, Nexus Player, Pixel C, and General Mobile 4G (Android One) devices. Devices enrolled in the Android Beta Program will receive the final version as well. As always, you can also download and flash this update manually.

We've also been working with our device manufacturer partners to bring Android 7.1.1 to their devices in the months ahead.

Make sure your apps are ready

Take this opportunity to test your apps for compatibility and optimize them to look their best on Android 7.1.1, such as by providing round icons and adding app shortcuts. We recommend compiling your app with, and ideally targeting, API 25. See our recent post for details.

With the final platform we're updating the platform and build tools in Android Studio, as well as the API Level 25 emulator system images. The latest version of the support library (25.0.1) is also available for you to add image keyboard support, bottom navigation, and other features for devices running API Level 25 or earlier.

We're also providing downloadable factory and OTA images on the Nexus Images page to help you do final testing on your Pixel and Nexus devices. To help scale your testing, make sure to take advantage of Firebase Test Lab for Android and run your tests in the cloud at no charge through the end of December.

After your final testing, publish your apps to your alpha, beta, or production channels in the Google Play Developer Console.

What's next?

We'll soon be closing open bugs logged against Developer Preview builds, but please keep the feedback coming! If you still see an issue that you filed in the preview tracker, just file a new issue against Android 7.1 in the AOSP issue tracker. You can also continue to give us feedback or ask questions in the developer community.

As mentioned back in August, we've moved Android Nougat into a regular maintenance cycle and we're already started work on refinements and bug fixes for the next incremental update. If you have an eligible device that's currently enrolled in the Android Beta Program, your device will automatically receive preview updates of upcoming Android Nougat releases as soon as they are available. If you don't want to receive those updates, just visit the Beta site and unenroll the device.

Thanks for being part of the developer preview. Let us know how this year's preview met your needs by taking a short survey. Your feedback helps to shape our future releases.

05 Dec 2016 7:23pm GMT

01 Dec 2016

feedAndroid Developers Blog

Indie game developers in Latin America sustain growth after launch on Google Play

Posted by Kacey Fahey, Marketing Programs Manager, Google Play

Indie game developers are some of the most exciting and innovative teams to work with. While developers large and small exist on the same field, gone are the days where you hit publish and turn your back, moving on to the next project. We've gathered a few developer stories coming out of Latin America sharing experiences and advice.

Oktagon Games

Ronaldo Cruz, Founder and CEO of Oktagon Games tells us how "reviews provide great qualitative insight on the game helping us identify problems that may not be caught by analytics."



Tiny Bytes

Tiny Bytes reduced churn by 5% using an in-game tutorial and analytics.


Impossible Apps

Cleverson Schmidt of Impossible Apps shares how introducing in-app purchases helps diversify revenue streams and "can make the game profitable and self sustainable."



How useful did you find this blogpost?


01 Dec 2016 8:24pm GMT