diff options
author | fox <[email protected]> | 2021-08-18 07:51:19 +0300 |
---|---|---|
committer | fox <[email protected]> | 2021-08-18 07:51:19 +0300 |
commit | 28eafa2bcd6e327e7014174c4efd4c10d9491e27 (patch) | |
tree | efd9e28718eff791dcaa7ffddbac44c38deedfb8 /plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables | |
parent | a73e3bec45c5523910c711cf882976b71781ac9e (diff) | |
parent | b6b6771d8d7dcf13938d1578099074b0123a5d5e (diff) |
Merge pull request 'pull latest readability-php via composer' (#42) from niehztog/tt-rss:update-readability into master
Reviewed-on: https://git.tt-rss.org/fox/tt-rss/pulls/42
Diffstat (limited to 'plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables')
4 files changed, 3352 insertions, 0 deletions
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-images.json new file mode 100644 index 000000000..c4caaa1ed --- /dev/null +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-images.json @@ -0,0 +1,5 @@ +[ + "https:\/\/2.bp.blogspot.com\/-chCZZinlUTg\/WEcxvJo9gdI\/AAAAAAAADnk\/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB\/w1200-h630-p-k-nu\/ipsum-opsum.gif", + "https:\/\/2.bp.blogspot.com\/-chCZZinlUTg\/WEcxvJo9gdI\/AAAAAAAADnk\/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB\/s640\/ipsum-opsum.gif", + "https:\/\/2.bp.blogspot.com\/-5aRh1dM6Unc\/WEcNs55RGhI\/AAAAAAAADnI\/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB\/s200\/image01.png" +]
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json new file mode 100644 index 000000000..d6b1330af --- /dev/null +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json @@ -0,0 +1,8 @@ +{ + "Author": null, + "Direction": null, + "Excerpt": "Posted by Andrew Hayden, Software Engineer on Google Play Android users are downloading tens of billions of apps and games on Google Pla...", + "Image": "https:\/\/2.bp.blogspot.com\/-chCZZinlUTg\/WEcxvJo9gdI\/AAAAAAAADnk\/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB\/w1200-h630-p-k-nu\/ipsum-opsum.gif", + "Title": "Saving Data: Reducing the size of App Updates by 65%", + "SiteName": null +} diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html new file mode 100644 index 000000000..05e072336 --- /dev/null +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html @@ -0,0 +1,174 @@ +<div id="post-body-2701400044422363572" itemprop="articlesBody"> +<p> +<em>Posted by Andrew Hayden, Software Engineer on Google Play</em> +</p> +<p> +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 <a href="https://android-developers.blogspot.com/2016/07/improvements-for-smaller-app-downloads.html">the +bsdiff algorithm</a> <a href="https://android-developers.blogspot.com/2016/07/improvements-for-smaller-app-downloads.html">(by +Colin Percival)</a>. Using bsdiff, we were able to reduce the size of app +updates on average by 47% compared to the full APK size. +</p> +<p> +Today, we're excited to share a new approach that goes further — <strong><a href="https://github.com/andrewhayden/archive-patcher/blob/master/README.md">File-by-File +patching</a></strong>. App Updates using File-by-File patching are, <strong>on average,</strong> +<strong>65% smaller than the full app</strong>, and in some cases more than 90% +smaller. +</p> +<p> +The savings, compared to our previous approach, add up to 6 petabytes of user +data saved per day! +</p> +<p> +In order to get the new version of the app, Google Play sends your device a +patch that describes the <em>differences</em> between the old and new versions +of the app. +</p> +<p> +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. +</p> +<p> +<strong><span>Techniques used in File-by-File +patching </span></strong> +</p> +<p> +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 <a href="https://en.wikipedia.org/w/index.php?title=DEFLATE&oldid=735386036">Deflate</a>. +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 <em>completely different</em>. Describing +the differences between the <em>original</em> content is easy, but describing +the differences between the <em>compressed</em> content is so hard that it leads +to inefficient patches. +</p> +<p> +Watch how much the compressed text on the right side changes from a one-letter +change in the uncompressed text on the left: +</p> +<p><a href="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s1600/ipsum-opsum.gif" imageanchor="1"><img height="105" src="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif" width="640"></img></a></p> +<p> +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 <a href="https://source.android.com/security/apksigning/v2.html">APK Signature +Schema v2 </a>for why). +</p> +<p> +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. +</p> +<p> +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. +</p> +<p> +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 <em>exactly the same bytes</em> as originally uploaded. +</p> +<p> +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. +</p> +<p> +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. +</p> +<p> +<strong><span>How effective is File-by-File +Patching?</span></strong> +</p> +<p> +Here are examples of app updates already using File-by-File Patching: +</p> +<div dir="ltr" trbidi="on"> + +<div dir="ltr"> +<table readabilityDataTable="1"><colgroup><col width="142"></col><col width="102"></col><col width="176"></col><col width="176"></col></colgroup><tbody><tr><td><p><span>Application</span></p> +</td><td><p><span>Original Size</span></p> +</td><td><p><span>Previous (BSDiff) Patch Size</span></p> +<p><span>(% vs original)</span></p> +</td><td><p><span>File-by-File Patch Size (% vs original)</span></p> +</td></tr><tr><td><div dir="ltr"> +<p><a href="https://play.google.com/store/apps/details?id=com.king.farmheroessupersaga&hl=en"><span>Farm Heroes Super Saga</span></a></p></div> +</td><td><p><span>71.1 MB</span></p> +</td><td><p><span>13.4 MB (-81%)</span></p> +</td><td><p><span>8.0 MB (-89%)</span></p> +</td></tr><tr><td><div dir="ltr"> +<p><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.maps"><span>Google Maps</span></a></p></div> +</td><td><p><span>32.7 MB</span></p> +</td><td><p><span>17.5 MB (-46%)</span></p> +</td><td><p><span>9.6 MB (-71%)</span></p> +</td></tr><tr><td><div dir="ltr"> +<p><a href="https://play.google.com/store/apps/details?id=com.google.android.gm"><span>Gmail</span></a></p></div> +</td><td><p><span>17.8 MB</span></p> +</td><td><p><span>7.6 MB (-57%)</span></p> +</td><td><p><span>7.3 MB (-59%)</span></p> +</td></tr><tr><td><div dir="ltr"> +<p><a href="https://play.google.com/store/apps/details?id=com.google.android.tts"><span>Google TTS</span></a></p></div> +</td><td><p><span>18.9 MB</span></p> +</td><td><p><span>17.2 MB (-9%)</span></p> +</td><td><p><span>13.1 MB (-31%)</span></p> +</td></tr><tr><td><div dir="ltr"> +<p><a href="https://play.google.com/store/apps/details?id=com.amazon.kindle"><span>Kindle</span></a></p></div> +</td><td><p><span>52.4 MB</span></p> +</td><td><p><span>19.1 MB (-64%)</span></p> +</td><td><p><span>8.4 MB (-84%)</span></p> +</td></tr><tr><td><div dir="ltr"> +<p><a href="https://play.google.com/store/apps/details?id=com.netflix.mediaclient"><span>Netflix</span></a></p></div> +</td><td><p><span>16.2 MB</span></p> +</td><td><p><span>7.7 MB (-52%)</span></p> +</td><td><p><span>1.2 MB (-92%)</span></p> +</td></tr></tbody></table></div> + +</div> +<p><em>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.</em></p><p> +<strong><span>Saving data and making our +users (& developers!) happy</span></strong> +</p> +<p> +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! +</p> + +<p> +If you'd like to know more about File-by-File patching, including the technical +details, head over to the <a href="https://github.com/andrewhayden/archive-patcher">Archive Patcher GitHub +project</a> where you can find information, including the source code. Yes, +File-by-File patching is completely open-source! +</p> +<p> +As a developer if you're interested in reducing your APK size still further, +here are some <a href="https://developer.android.com/topic/performance/reduce-apk-size.html?utm_campaign=android_discussion_filebyfile_120616&utm_source=anddev&utm_medium=blog">general +tips on reducing APK size</a>. +</p> +<p><a href="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s1600/image01.png" imageanchor="1"><img height="200" src="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s200/image01.png" width="191"></img></a></p> + +</div>
\ No newline at end of file diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/source.html new file mode 100644 index 000000000..b9ca816ee --- /dev/null +++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/source.html @@ -0,0 +1,3165 @@ +<!DOCTYPE html> +<html class="v2" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" xmlns:b="http://www.google.com/2005/gml/b" xmlns:data="http://www.google.com/2005/gml/data" xmlns:expr="http://www.google.com/2005/gml/expr"><head> +<meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible" /> +<meta content="width=1100" name="viewport" /> +<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> +<meta content="blogger" name="generator" /> +<link href="https://android-developers.googleblog.com/favicon.ico" rel="icon" type="image/x-icon" /> +<link href="https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html" rel="canonical" /> +<link rel="alternate" type="application/atom+xml" title="Android Developers Blog - Atom" href="https://android-developers.googleblog.com/feeds/posts/default" /> +<link rel="alternate" type="application/rss+xml" title="Android Developers Blog - RSS" href="https://android-developers.googleblog.com/feeds/posts/default?alt=rss" /> +<link rel="service.post" type="application/atom+xml" title="Android Developers Blog - Atom" href="https://www.blogger.com/feeds/6755709643044947179/posts/default" /> + +<link rel="alternate" type="application/atom+xml" title="Android Developers Blog - Atom" href="https://android-developers.googleblog.com/feeds/2701400044422363572/comments/default" /> +<!--[if IE]><script type="text/javascript" src="https://www.blogger.com/static/v1/jsbin/3032875878-ieretrofit.js"></script> +<![endif]--> +<link href="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif" rel="image_src" /> +<meta content="https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html" property="og:url" /> +<meta content="Saving Data: Reducing the size of App Updates by 65%" property="og:title" /> +<meta content=" Posted by Andrew Hayden, Software Engineer on Google Play Android users are downloading tens of billions of apps and games on Google Pla..." property="og:description" /> +<meta content="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/w1200-h630-p-k-nu/ipsum-opsum.gif" property="og:image" /> +<!--[if IE]> <script> (function() { var html5 = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i < html5.length; i++) { document.createElement(html5[i]); } try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {} })(); </script> <![endif]--> +<title>Saving Data: Reducing the size of App Updates by 65% | Android Developers Blog</title> +<link href="//fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic,bold" rel="stylesheet" /> +<script async="" src="//cse.google.com/adsense/search/async-ads.js"></script><script src="https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en_GB.oDaXKax7Lmc.O/m=auth/exm=gapi_iframes,gapi_iframes_style_bubble,plus,plusone/rt=j/sv=1/d=1/ed=1/am=AQ/rs=AGLTcCP-QWj14-CfU2w6doKmOqTwfM2Hig/cb=gapi.loaded_3" async=""></script><script src="https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en_GB.oDaXKax7Lmc.O/m=plus/exm=gapi_iframes,gapi_iframes_style_bubble,plusone/rt=j/sv=1/d=1/ed=1/am=AQ/rs=AGLTcCP-QWj14-CfU2w6doKmOqTwfM2Hig/cb=gapi.loaded_2" async=""></script><script type="text/javascript" async="" src="https://ssl.google-analytics.com/ga.js"></script><script type="text/javascript" async="" src="https://apis.google.com/js/plusone.js" gapi_processed="true"></script><script src="https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en_GB.oDaXKax7Lmc.O/m=gapi_iframes,gapi_iframes_style_bubble/exm=plusone/rt=j/sv=1/d=1/ed=1/am=AQ/rs=AGLTcCP-QWj14-CfU2w6doKmOqTwfM2Hig/cb=gapi.loaded_1" async=""></script><script src="https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en_GB.oDaXKax7Lmc.O/m=plusone/rt=j/sv=1/d=1/ed=1/am=AQ/rs=AGLTcCP-QWj14-CfU2w6doKmOqTwfM2Hig/cb=gapi.loaded_0" async=""></script><script async="" src="//www.google-analytics.com/analytics.js"></script><script src="//developer.android.com/assets/jquery-resizable.min.js" type="text/javascript"></script> +<script src="//developer.android.com/assets/prettify.js" type="text/javascript"></script> +<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script> +<script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-961555-37', 'auto'); + ga('send', 'pageview'); + +</script> +<link href="https://fonts.googleapis.com/css?kit=8n8e3dKCuuHkq9niV1adTQ" rel="stylesheet" type="text/css" /><link type="text/css" rel="stylesheet" href="https://www.blogger.com/static/v1/widgets/3887294567-css_bundle_v2.css" /> +<link type="text/css" rel="stylesheet" href="https://www.blogger.com/dyn-css/authorization.css?targetBlogID=6755709643044947179&zx=bf8a639b-dcff-4fa8-b5e3-f8d8e8d734e5" /> +<link type="text/css" rel="stylesheet" href="//www.google.com/uds/css/gsearch.css" /> +<style id="page-skin-1" type="text/css"><!-- +/* +----------------------------------------------- +Blogger Template Style +Name: Simple +Designer: Josh Peterson +URL: www.noaesthetic.com +----------------------------------------------- */ +/* Variable definitions +==================== +<Variable name="keycolor" description="Main Color" type="color" default="#66bbdd"/> +<Group description="Page Text" selector="body"> +<Variable name="body.font" description="Font" type="font" +default="normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> +<Variable name="body.text.color" description="Text Color" type="color" default="#222222"/> +</Group> +<Group description="Backgrounds" selector=".body-fauxcolumns-outer"> +<Variable name="body.background.color" description="Outer Background" type="color" default="#66bbdd"/> +<Variable name="content.background.color" description="Main Background" type="color" default="#ffffff"/> +<Variable name="header.background.color" description="Header Background" type="color" default="transparent"/> +</Group> +<Group description="Links" selector=".main-outer"> +<Variable name="link.color" description="Link Color" type="color" default="#2288bb"/> +<Variable name="link.visited.color" description="Visited Color" type="color" default="#888888"/> +<Variable name="link.hover.color" description="Hover Color" type="color" default="#33aaff"/> +</Group> +<Group description="Blog Title" selector=".header h1"> +<Variable name="header.font" description="Font" type="font" +default="normal normal 60px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> +<Variable name="header.text.color" description="Title Color" type="color" default="#3399bb" /> +</Group> +<Group description="Blog Description" selector=".header .description"> +<Variable name="description.text.color" description="Description Color" type="color" +default="#777777" /> +</Group> +<Group description="Tabs Text" selector=".tabs-inner .widget li a"> +<Variable name="tabs.font" description="Font" type="font" +default="normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> +<Variable name="tabs.text.color" description="Text Color" type="color" default="#999999"/> +<Variable name="tabs.selected.text.color" description="Selected Color" type="color" default="#000000"/> +</Group> +<Group description="Tabs Background" selector=".tabs-outer .PageList"> +<Variable name="tabs.background.color" description="Background Color" type="color" default="#f5f5f5"/> +<Variable name="tabs.selected.background.color" description="Selected Color" type="color" default="#eeeeee"/> +</Group> +<Group description="Post Title" selector="h3.post-title, .comments h4"> +<Variable name="post.title.font" description="Font" type="font" +default="normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> +</Group> +<Group description="Date Header" selector=".date-header"> +<Variable name="date.header.color" description="Text Color" type="color" +default="#666666"/> +<Variable name="date.header.background.color" description="Background Color" type="color" +default="transparent"/> +</Group> +<Group description="Post Footer" selector=".post-footer"> +<Variable name="post.footer.text.color" description="Text Color" type="color" default="#666666"/> +<Variable name="post.footer.background.color" description="Background Color" type="color" +default="#f9f9f9"/> +<Variable name="post.footer.border.color" description="Shadow Color" type="color" default="#eeeeee"/> +</Group> +<Group description="Gadgets" selector="h2"> +<Variable name="widget.title.font" description="Title Font" type="font" +default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> +<Variable name="widget.title.text.color" description="Title Color" type="color" default="#000000"/> +<Variable name="widget.alternate.text.color" description="Alternate Color" type="color" default="#999999"/> +</Group> +<Group description="Images" selector=".main-inner"> +<Variable name="image.background.color" description="Background Color" type="color" default="#ffffff"/> +<Variable name="image.border.color" description="Border Color" type="color" default="#eeeeee"/> +<Variable name="image.text.color" description="Caption Text Color" type="color" default="#666666"/> +</Group> +<Group description="Accents" selector=".content-inner"> +<Variable name="body.rule.color" description="Separator Line Color" type="color" default="#eeeeee"/> +<Variable name="tabs.border.color" description="Tabs Border Color" type="color" default="#eeeeee"/> +</Group> +<Variable name="body.background" description="Body Background" type="background" +color="#f9f9f9" default="$(color) none repeat scroll top left"/> +<Variable name="body.background.override" description="Body Background Override" type="string" default=""/> +<Variable name="body.background.gradient.cap" description="Body Gradient Cap" type="url" +default="url(http://www.blogblog.com/1kt/simple/gradients_light.png)"/> +<Variable name="body.background.gradient.tile" description="Body Gradient Tile" type="url" +default="url(http://www.blogblog.com/1kt/simple/body_gradient_tile_light.png)"/> +<Variable name="content.background.color.selector" description="Content Background Color Selector" type="string" default=".content-inner"/> +<Variable name="content.padding" description="Content Padding" type="length" default="10px"/> +<Variable name="content.padding.horizontal" description="Content Horizontal Padding" type="length" default="10px"/> +<Variable name="content.shadow.spread" description="Content Shadow Spread" type="length" default="40px"/> +<Variable name="content.shadow.spread.webkit" description="Content Shadow Spread (WebKit)" type="length" default="5px"/> +<Variable name="content.shadow.spread.ie" description="Content Shadow Spread (IE)" type="length" default="10px"/> +<Variable name="main.border.width" description="Main Border Width" type="length" default="0"/> +<Variable name="header.background.gradient" description="Header Gradient" type="url" default="none"/> +<Variable name="header.shadow.offset.left" description="Header Shadow Offset Left" type="length" default="-1px"/> +<Variable name="header.shadow.offset.top" description="Header Shadow Offset Top" type="length" default="-1px"/> +<Variable name="header.shadow.spread" description="Header Shadow Spread" type="length" default="1px"/> +<Variable name="header.padding" description="Header Padding" type="length" default="30px"/> +<Variable name="header.border.size" description="Header Border Size" type="length" default="1px"/> +<Variable name="header.bottom.border.size" description="Header Bottom Border Size" type="length" default="1px"/> +<Variable name="header.border.horizontalsize" description="Header Horizontal Border Size" type="length" default="0"/> +<Variable name="description.text.size" description="Description Text Size" type="string" default="140%"/> +<Variable name="tabs.margin.top" description="Tabs Margin Top" type="length" default="0" /> +<Variable name="tabs.margin.side" description="Tabs Side Margin" type="length" default="30px" /> +<Variable name="tabs.background.gradient" description="Tabs Background Gradient" type="url" +default="url(http://www.blogblog.com/1kt/simple/gradients_light.png)"/> +<Variable name="tabs.border.width" description="Tabs Border Width" type="length" default="1px"/> +<Variable name="tabs.bevel.border.width" description="Tabs Bevel Border Width" type="length" default="1px"/> +<Variable name="date.header.padding" description="Date Header Padding" type="string" default="inherit"/> +<Variable name="date.header.letterspacing" description="Date Header Letter Spacing" type="string" default="inherit"/> +<Variable name="date.header.margin" description="Date Header Margin" type="string" default="inherit"/> +<Variable name="post.margin.bottom" description="Post Bottom Margin" type="length" default="25px"/> +<Variable name="image.border.small.size" description="Image Border Small Size" type="length" default="2px"/> +<Variable name="image.border.large.size" description="Image Border Large Size" type="length" default="5px"/> +<Variable name="page.width.selector" description="Page Width Selector" type="string" default=".region-inner"/> +<Variable name="page.width" description="Page Width" type="string" default="auto"/> +<Variable name="main.section.margin" description="Main Section Margin" type="length" default="15px"/> +<Variable name="main.padding" description="Main Padding" type="length" default="15px"/> +<Variable name="main.padding.top" description="Main Padding Top" type="length" default="30px"/> +<Variable name="main.padding.bottom" description="Main Padding Bottom" type="length" default="30px"/> +<Variable name="paging.background" +color="transparent" +description="Background of blog paging area" type="background" +default="transparent none no-repeat scroll top center"/> +<Variable name="footer.bevel" description="Bevel border length of footer" type="length" default="0"/> +<Variable name="mobile.background.overlay" description="Mobile Background Overlay" type="string" +default="transparent none repeat scroll top left"/> +<Variable name="mobile.background.size" description="Mobile Background Size" type="string" default="auto"/> +<Variable name="mobile.button.color" description="Mobile Button Color" type="color" default="#ffffff" /> +<Variable name="startSide" description="Side where text starts in blog language" type="automatic" default="left"/> +<Variable name="endSide" description="Side where text ends in blog language" type="automatic" default="right"/> +*/ +/* Content +----------------------------------------------- */ +body { +font: normal normal 12px Roboto; +color: #333; +background: #f9f9f9 none repeat scroll top left; +padding: 0 40px 40px 40px; +} +html body .region-inner { +min-width: 0; +max-width: 100%; +width: auto; +} +a:link { +text-decoration:none; +color: #258aaf; +} +a:visited { +text-decoration:none; +color: #258aaf; +} +a:hover { +text-decoration:underline; +color: #33b5e5; +} +.body-fauxcolumn-outer .fauxcolumn-inner { +background: transparent url(//www.blogblog.com/1kt/simple/body_gradient_tile_light.png) repeat scroll top left; +_background-image: none; +} +.body-fauxcolumn-outer .cap-top { +position: absolute; +z-index: 1; +height: 400px; +width: 100%; +background: #f9f9f9 none repeat scroll top left; +} +#header-inner img { +margin: 0 auto; +} +.body-fauxcolumn-outer .cap-top .cap-left { +width: 100%; +background: transparent url(//www.blogblog.com/1kt/simple/gradients_light.png) repeat-x scroll top left; +_background-image: none; +} +.content-outer { +-moz-box-shadow: 0 0 40px rgba(0, 0, 0, .15); +-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .15); +-goog-ms-box-shadow: 0 0 10px #333333; +box-shadow: 0 0 40px rgba(0, 0, 0, .15); +margin-bottom: 1px; +} +.fauxcolumn-left-outer .fauxcolumn-inner { +border: none !important; +} +.content-inner { +padding: 10px 10px; +} +.content-outer { +-moz-box-shadow: none !important; +-webkit-box-shadow: none !important; +-goog-ms-box-shadow:none !important; +box-shadow:none !important +} +footer { +display: none; +} +.content-inner { +background-color: transparent; +} +/* -------------------------------------------------------------------------- +Code Style +*/ +pre { +margin: 1em 0; +padding: 1em; +overflow: auto; +border: solid 1px #ddd; +background: #f7f7f7; +} +.str { color: #080; } +.kwd { color: #008; } +.com { color: #800; } +.typ { color: #606; } +.lit { color: #066; } +.pun { color: #660; } +.pln { color: #000; } +.tag { color: #008; } +.atn { color: #828; } +.atv { color: #080; } +.dec { color: #606; } +/* Header +----------------------------------------------- */ +.header-outer { +background: transparent none repeat-x scroll 0 -400px; +_background-image: none; +} +.Header h1 { +font: normal normal 22px Roboto; +color: #333333; +text-shadow: -1px -1px 1px rgba(0, 0, 0, .2); +} +.Header h1 a { +color: #333333; +} +.Header .description { +font-size: 140%; +color: #000000; +} +.header-inner .Header .titlewrapper { +padding: 0; +} +.header-inner .Header .descriptionwrapper { +padding: 0 30px; +} +/* Tabs +----------------------------------------------- */ +.tabs-inner .section:first-child { +border-top: 1px solid #eeeeee; +} +.tabs-inner .section:first-child ul { +margin-top: -1px; +border-top: 1px solid #eeeeee; +border-left: 0 solid #eeeeee; +border-right: 0 solid #eeeeee; +} +.tabs-inner .widget ul { +background: transparent url(//www.blogblog.com/1kt/simple/gradients_light.png) repeat-x scroll 0 -800px; +_background-image: none; +border-bottom: 1px solid #eeeeee; +margin-top: 0; +margin-left: -30px; +margin-right: -30px; +} +.tabs-inner .widget li a { +display: inline-block; +padding: .6em 1em; +font: normal normal 14px Roboto; +color: #000000; +border-left: 1px solid transparent; +border-right: 1px solid #eeeeee; +} +.tabs-inner .widget li:first-child a { +border-left: none; +} +.tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover { +color: #000000; +background-color: #eeeeee; +text-decoration: none; +} +/* Columns +----------------------------------------------- */ +.main-outer { +border-top: 0 solid #eeeeee; +} +.fauxcolumn-left-outer .fauxcolumn-inner { +border-right: 1px solid #eeeeee; +} +.fauxcolumn-right-outer .fauxcolumn-inner { +border-left: 1px solid #eeeeee; +} +.main-inner .column-left-inner { +padding: 0; +} +.sidebar.section { +margin: 0; +} +/* Headings +----------------------------------------------- */ +h2 { +margin: 0 0 1em 0; +font: normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif; +color: #000000; +text-transform: uppercase; +} +/* Removes Blogger navbar */ +#navbar-iframe { +display: none !important; +} +/* Widgets +----------------------------------------------- */ +.widget .zippy { +color: #999999; +text-shadow: 2px 2px 1px rgba(0, 0, 0, .1); +} +.widget .popular-posts ul { +list-style: none; +} +/* Posts +----------------------------------------------- */ +.date-header span { +background-color: #BBB; +color: white; +padding: 0.4em; +letter-spacing: 3px; +margin: inherit; +} +.main-inner { +padding-top: 30px; +padding-bottom: 30px; +} +.main-inner .column-center-inner { +padding: 0 15px; +} +.main-inner .column-center-inner .section { +margin: 0 0 0 20px; +} +.post { +margin: 0 0 25px 0; +} +h3.post-title, .comments h4 { +font: normal normal 22px Roboto; +margin: .75em 0 0; +} +.post-body { +font-size: 110%; +line-height: 1.4; +position: relative; +} +.post-body img, .post-body .tr-caption-container, .Profile img, .Image img, +.BlogList .item-thumbnail img { +} +.post-body img, .post-body .tr-caption-container { +padding: 5px; +} +.post-body .tr-caption-container { +color: #666666; +} +.post-body .tr-caption-container img { +padding: 0; +background: transparent; +border: none; +-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .1); +-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .1); +box-shadow: 0 0 0 rgba(0, 0, 0, .1); +} +.post-header { +margin: 0 0 1.5em; +line-height: 1.6; +font-size: 90%; +} +.post-footer { +margin: 20px -2px 0; +padding: 5px 10px; +color: #666666; +background-color: #f9f9f9; +border-bottom: 1px solid #eeeeee; +line-height: 1.6; +font-size: 90%; +} +#comments .comment-author { +padding-top: 1.5em; +border-top: 1px solid #eeeeee; +background-position: 0 1.5em; +} +#comments .comment-author:first-child { +padding-top: 0; +border-top: none; +} +.avatar-image-container { +margin: .2em 0 0; +} +#comments .avatar-image-container img { +border: 1px solid #eeeeee; +} +/* Comments +----------------------------------------------- */ +.comments .comments-content .icon.blog-author { +background-repeat: no-repeat; +background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==); +} +.comments .comments-content .loadmore a { +border-top: 1px solid #999999; +border-bottom: 1px solid #999999; +} +.comments .comment-thread.inline-thread { +background-color: #f9f9f9; +} +.comments .continue { +border-top: 2px solid #999999; +} +/* Accents +---------------------------------------------- */ +.section-columns td.columns-cell { +border-left: 1px solid #eeeeee; +} +.blog-pager { +background: transparent none no-repeat scroll top center; +} +.blog-pager-older-link, .home-link, +.blog-pager-newer-link { +background-color: transparent; +padding: 5px; +} +.footer-outer { +border-top: 0 dashed #bbbbbb; +} +/* Mobile +----------------------------------------------- */ +body.mobile { +background-size: auto; +} +.mobile .body-fauxcolumn-outer { +background: transparent none repeat scroll top left; +} +.mobile .body-fauxcolumn-outer .cap-top { +background-size: 100% auto; +} +.mobile .content-outer { +-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, .15); +box-shadow: 0 0 3px rgba(0, 0, 0, .15); +padding: 0 40px; +} +body.mobile .AdSense { +margin: 0 -40px; +} +.mobile .tabs-inner .widget ul { +margin-left: 0; +margin-right: 0; +} +.mobile .post { +margin: 0; +} +.mobile .main-inner .column-center-inner .section { +margin: 0; +} +.mobile .date-header span { +padding: 0.1em 10px; +margin: 0 -10px; +} +.mobile h3.post-title { +margin: 0; +} +.mobile .blog-pager { +background: transparent none no-repeat scroll top center; +} +.mobile .footer-outer { +border-top: none; +} +.mobile .main-inner, .mobile .footer-inner { +background-color: transparent; +} +.mobile-index-contents { +color: #666666; +} +.mobile-link-button { +background-color: #258aaf; +} +.mobile-link-button a:link, .mobile-link-button a:visited { +color: #ffffff; +} +.mobile .tabs-inner .section:first-child { +border-top: none; +} +.mobile .tabs-inner .PageList .widget-content { +background-color: #eeeeee; +color: #000000; +border-top: 1px solid #eeeeee; +border-bottom: 1px solid #eeeeee; +} +.mobile .tabs-inner .PageList .widget-content .pagelist-arrow { +border-left: 1px solid #eeeeee; +} +.blog-pager { +background: none !important; +} +.figure-center { +margin: 32px auto 24px; +max-width: 100%; +} +.figure, +.figure-right { +clear: right; +float: right; +margin: 10px 0 0 0; +padding: 0 0 0 20px; +max-width: 50%; +/* width must be defined w/ an inline style matching the image width */ +} +.figure-left { +clear: left; +float: left; +margin: 10px 0 0 0; +padding: 0 20px 0 0; +max-width: 50%; +/* width must be defined w/ an inline style matching the image width */ +} +@media (max-width: 719px) { +/* Collapse on mobile. */ +.figure, +.figure-right, +.figure-left { +float: none; +clear: none; +padding: 0; +margin: 32px auto 24px; +max-width: 100%; +} +} +--></style> +<style id="template-skin-1" type="text/css"><!-- +body { +min-width: 960px; +-webkit-font-smoothing: antialiased; +} +.content-outer, .content-fauxcolumn-outer, .region-inner { +min-width: 960px; +max-width: 960px; +_width: 960px; +} +.main-inner .columns { +padding-left: 160px; +padding-right: 0px; +} +.main-inner .fauxcolumn-center-outer { +left: 160px; +right: 0px; +/* IE6 does not respect left and right together */ +_width: expression(this.parentNode.offsetWidth - +parseInt("160px") - +parseInt("0px") + 'px'); +} +.main-inner .fauxcolumn-left-outer { +width: 160px; +} +.main-inner .fauxcolumn-right-outer { +width: 0px; +} +.main-inner .column-left-outer { +width: 160px; +right: 100%; +margin-left: -160px; +} +.main-inner .column-right-outer { +width: 0px; +margin-right: -0px; +} +#layout { +min-width: 0; +} +#layout .content-outer { +min-width: 0; +width: 800px; +} +#layout .region-inner { +min-width: 0; +width: auto; +} +--></style> +<script type="text/javascript">function a(){var b=window.location.href,c=b.split("?");switch(c.length){case 1:return b+"?m=1";case 2:return 0<=c[1].search("(^|&)m=")?null:b+"&m=1";default:return null}}var d=navigator.userAgent;if(-1!=d.indexOf("Mobile")&&-1!=d.indexOf("WebKit")&&-1==d.indexOf("iPad")||-1!=d.indexOf("Opera Mini")||-1!=d.indexOf("IEMobile")){var e=a();e&&window.location.replace(e)}; +</script><script type="text/javascript" src="//pagead2.googlesyndication.com/pagead/js/google_top_exp.js"></script><style>.gc-bubbleDefault{background-color:transparent !important;text-align:left;padding:0 !important;margin:0 !important;border:0 !important;table-layout:auto !important}.gc-reset{background-color:transparent !important;border:0 !important;padding:0 !important;margin:0 !important;text-align:left}.pls-bubbleTop{border-bottom:1px solid #ccc !important}.pls-topTail,.pls-vertShimLeft,.pls-contentLeft{background-image:url(//ssl.gstatic.com/s2/oz/images/stars/po/bubblev1/border_3.gif) !important}.pls-topTail{background-repeat:repeat-x !important;background-position:bottom !important}.pls-vertShim{background-color:#fff !important;text-align:right}.tbl-grey .pls-vertShim{background-color:#f5f5f5 !important}.pls-vertShimLeft{background-repeat:repeat-y !important;background-position:right !important;height:4px}.pls-vertShimRight{height:4px}.pls-confirm-container .pls-vertShim{background-color:#fff3c2 !important}.pls-contentWrap{background-color:#fff !important;position:relative !important;vertical-align:top}.pls-contentLeft{background-repeat:repeat-y;background-position:right;vertical-align:top}.pls-dropRight{background-image:url(//ssl.gstatic.com/s2/oz/images/stars/po/bubblev1/bubbleDropR_3.png) !important;background-repeat:repeat-y !important;vertical-align:top}.pls-vert,.pls-tailleft,.pls-dropTR .pls-dropBR,.pls-dropBL,.pls-vert img{vertical-align:top}.pls-dropBottom{background-image:url(//ssl.gstatic.com/s2/oz/images/stars/po/bubblev1/bubbleDropB_3.png) !important;background-repeat:repeat-x !important;width:100%;vertical-align:top}.pls-topLeft{background:inherit !important;text-align:right;vertical-align:bottom}.pls-topRight{background:inherit !important;text-align:left;vertical-align:bottom}.pls-bottomLeft{background:inherit !important;text-align:right}.pls-bottomRight{background:inherit !important;text-align:left;vertical-align:top}.pls-tailtop,.pls-tailright,.pls-tailbottom,.pls-tailleft{display:none;position:relative}.pls-tailbottom,.pls-tailtop,.pls-tailright,.pls-tailleft,.pls-dropTR,.pls-dropBR,.pls-dropBL{background-image:url(//ssl.gstatic.com/s2/oz/images/stars/po/bubblev1/bubbleSprite_3.png) !important;background-repeat:no-repeat}.tbl-grey .pls-tailbottom,.tbl-grey .pls-tailtop,.tbl-grey .pls-tailright,.tbl-grey .pls-tailleft,.tbl-grey .pls-dropTR,.tbl-grey .pls-dropBR,.tbl-grey .pls-dropBL{background-image:url(//ssl.gstatic.com/s2/oz/images/stars/po/bubblev1/bubbleSprite-grey.png) !important}.pls-tailbottom{background-position:-23px 0}.pls-confirm-container .pls-tailbottom{background-position:-23px -10px}.pls-tailtop{background-position:-19px -20px}.pls-tailright{background-position:0 0}.pls-tailleft{background-position:-10px 0}.pls-tailtop{vertical-align:top}.gc-bubbleDefault td{line-height:0;font-size:0}.pls-topLeft img,.pls-topRight img,.pls-tailbottom{vertical-align:bottom}.pls-bottomLeft img,.bubbleDropTR,.pls-dropBottomL img,.pls-dropBottom img,.pls-dropBottomR img,.pls-bottomLeft{vertical-align:top}.pls-dropTR{background-position:0 -22px}.pls-dropBR{background-position:0 -27px}.pls-dropBL{background-position:0 -16px}.pls-spacertop,.pls-spacerright,.pls-spacerbottom,.pls-spacerleft{position:static !important}.pls-spinner{bottom:0;position:absolute;left:0;margin:auto;right:0;top:0} </style><script type="text/javascript" src="https://www.google.com/uds/?file=search&v=1&hl=en&async=2"></script><style class="singleton-element" type="text/css">.cookie-choices-info { position:fixed;width:100%;background-color:#666;margin:0;left:0;top:0;padding:0;z-index:4000;text-align:center;color:#fff;line-height:140%;padding:10px 0;font-family:roboto,Arial; } .cookie-choices-info .cookie-choices-inner { position:relative;width:initial;margin:0;left:0;top:0; } .cookie-choices-info .cookie-choices-text { display:inline-block;vertical-align:middle;font-size:16px;margin:10px 20px;color:#ccc;max-width:800px;text-align:left; }.cookie-choices-info .cookie-choices-buttons { display:inline-block;vertical-align:middle;white-space:nowrap;margin:0 10px; } .cookie-choices-info .cookie-choices-button:hover { color: #fff; } .cookie-choices-info .cookie-choices-button { font-weight:bold;text-transform:UPPERCASE;white-space:nowrap;color:#eee;margin-left:8px;padding:0 6px; text-decoration:none; }</style><link type="text/css" href="https://www.google.com/uds/api/search/1.0/0c3990ce7a056ed50667fe0c3873c9b6/default+en.css" rel="stylesheet" /><script type="text/javascript" src="https://www.google.com/uds/api/search/1.0/0c3990ce7a056ed50667fe0c3873c9b6/default+en.I.js"></script></head> +<body class="" itemscope="" itemtype="http://schema.org/Article"> +<div class="navbar section" id="navbar"><div class="widget Navbar" data-version="1" id="Navbar1"><script type="text/javascript"> + function setAttributeOnload(object, attribute, val) { + if(window.addEventListener) { + window.addEventListener('load', + function(){ object[attribute] = val; }, false); + } else { + window.attachEvent('onload', function(){ object[attribute] = val; }); + } + } + </script> +<div id="navbar-iframe-container"><iframe ng-non-bindable="" hspace="0" marginheight="0" marginwidth="0" scrolling="no" style="" tabindex="0" vspace="0" id="navbar-iframe" name="navbar-iframe" src="https://www.blogger.com/navbar.g?targetBlogID=6755709643044947179&blogName=Android+Developers+Blog&publishMode=PUBLISH_MODE_HOSTED&navbarType=LIGHT&layoutType=LAYOUTS&searchRoot=https://android-developers.googleblog.com/search&blogLocale=en&v=2&homepageUrl=https://android-developers.googleblog.com/&targetPostID=2701400044422363572&blogPostOrPageUrl=https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html&vt=-7679880580717935623&usegapi=1&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en_GB.oDaXKax7Lmc.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCP-QWj14-CfU2w6doKmOqTwfM2Hig#id=navbar-iframe&parent=https%3A%2F%2Fandroid-developers.googleblog.com&pfname=&rpctoken=15056989" frameborder="0" width="100%"></iframe></div> +<script type="text/javascript" src="https://apis.google.com/js/plusone.js" gapi_processed="true"></script> +<script type="text/javascript"> + gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { + if (gapi.iframes && gapi.iframes.getContext) { + gapi.iframes.getContext().openChild({ + url: 'https://www.blogger.com/navbar.g?targetBlogID\x3d6755709643044947179\x26blogName\x3dAndroid+Developers+Blog\x26publishMode\x3dPUBLISH_MODE_HOSTED\x26navbarType\x3dLIGHT\x26layoutType\x3dLAYOUTS\x26searchRoot\x3dhttps://android-developers.googleblog.com/search\x26blogLocale\x3den\x26v\x3d2\x26homepageUrl\x3dhttps://android-developers.googleblog.com/\x26targetPostID\x3d2701400044422363572\x26blogPostOrPageUrl\x3dhttps://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html\x26vt\x3d-7679880580717935623', + where: document.getElementById("navbar-iframe-container"), + id: "navbar-iframe" + }); + } + }); + </script><script type="text/javascript"> +(function() { +var script = document.createElement('script'); +script.type = 'text/javascript'; +script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js'; +var head = document.getElementsByTagName('head')[0]; +if (head) { +head.appendChild(script); +}})(); +</script> +</div></div> +<div class="body-fauxcolumns"> +<div class="fauxcolumn-outer body-fauxcolumn-outer"> +<div class="cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left"> +<div class="fauxborder-right"></div> +<div class="fauxcolumn-inner"> +</div> +</div> +<div class="cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +</div> +<div class="content"> +<div class="content-fauxcolumns"> +<div class="fauxcolumn-outer content-fauxcolumn-outer"> +<div class="cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left"> +<div class="fauxborder-right"></div> +<div class="fauxcolumn-inner"> +</div> +</div> +<div class="cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +</div> +<div class="content-outer"> +<div class="content-cap-top cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left content-fauxborder-left"> +<div class="fauxborder-right content-fauxborder-right"></div> +<div class="content-inner"> +<header> +<div class="header-outer"> +<div class="header-cap-top cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left header-fauxborder-left"> +<div class="fauxborder-right header-fauxborder-right"></div> +<div class="region-inner header-inner"> +<div class="header section" id="header"><div class="widget Header" data-version="1" id="Header1"> +<div id="header-inner"> +<a href="https://android-developers.googleblog.com/" style="display: block"> +<img alt="Android Developers Blog" id="Header1_headerimg" src="//1.bp.blogspot.com/-dTliKTChbPA/VXh2idc5lPI/AAAAAAAABxg/xoPCoV_UeuY/s1600/04_blog_3banner.png" style="display: block" width="960px; " height="194px; " /> +</a> +</div> +</div></div> +</div> +</div> +<div class="header-cap-bottom cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +</header> +<div class="tabs-outer"> +<div class="tabs-cap-top cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left tabs-fauxborder-left"> +<div class="fauxborder-right tabs-fauxborder-right"></div> +<div class="region-inner tabs-inner"> +<div class="tabs no-items section" id="crosscol"></div> +<div class="tabs no-items section" id="crosscol-overflow"></div> +</div> +</div> +<div class="tabs-cap-bottom cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +<div class="main-outer"> +<div class="main-cap-top cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left main-fauxborder-left"> +<div class="fauxborder-right main-fauxborder-right"></div> +<div class="region-inner main-inner"> +<div class="columns fauxcolumns"> +<div class="fauxcolumn-outer fauxcolumn-center-outer"> +<div class="cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left"> +<div class="fauxborder-right"></div> +<div class="fauxcolumn-inner"> +</div> +</div> +<div class="cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +<div class="fauxcolumn-outer fauxcolumn-left-outer"> +<div class="cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left"> +<div class="fauxborder-right"></div> +<div class="fauxcolumn-inner"> +</div> +</div> +<div class="cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +<div class="fauxcolumn-outer fauxcolumn-right-outer"> +<div class="cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left"> +<div class="fauxborder-right"></div> +<div class="fauxcolumn-inner"> +</div> +</div> +<div class="cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +<!-- corrects IE6 width calculation --> +<div class="columns-inner"> +<div class="column-center-outer"> +<div class="column-center-inner"> +<div class="main section" id="main"><div id="uds-searchControl"><a name="uds-search-results"></a><div id="uds-searchResults"><div class="gsc-control" dir="ltr"><div class="gsc-results-wrapper-nooverlay"><div class="gsc-tabsAreaInvisible"><div class="gsc-tabHeader gsc-inline-block gsc-tabhActive">This Blog</div><span class="gs-spacer"> </span></div><div class="gsc-above-wrapper-area-invisible"><table class="gsc-above-wrapper-area-container" cellspacing="0" cellpadding="0"><tbody><tr><td class="gsc-result-info-container"><div class="gsc-result-info-invisible"></div></td></tr></tbody></table></div><div class="gsc-resultsbox-invisible"><div class="gsc-resultsRoot gsc-tabData gsc-tabdActive"><table class="gsc-resultsHeader" cellspacing="0" cellpadding="0"><tbody><tr><td class="gsc-twiddleRegionCell"><div class="gsc-twiddle"><div class="gsc-title">This Blog</div></div><div class="gsc-stats"></div><div class="gsc-results-selector gsc-more-results-active"><div class="gsc-result-selector gsc-one-result" title="show one result"> </div><div class="gsc-result-selector gsc-more-results" title="show more results"> </div><div class="gsc-result-selector gsc-all-results" title="show all results"> </div></div></td><td class="gsc-configLabelCell"></td></tr></tbody></table><div><div class="gsc-expansionArea"></div></div></div></div></div></div></div><div id="uds-searchClearResults" class="gsc-clear-button" style="display: none;"> </div></div><div class="widget Blog" data-version="1" id="Blog1"> +<div class="blog-posts hfeed"> + + <div class="date-outer"> + +<h2 class="date-header"><span>06 December 2016</span></h2> + + <div class="date-posts"> + +<div class="post-outer"> +<div class="post hentry" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"> +<a name="2701400044422363572"></a> +<h3 class="post-title entry-title" itemprop="name"> +Saving Data: Reducing the size of App Updates by 65% +</h3> +<div class="post-header"> +<div class="post-header-line-1"></div> +</div> +<div class="post-body entry-content" id="post-body-2701400044422363572" itemprop="articlesBody"> +<p> +<em>Posted by Andrew Hayden, Software Engineer on Google Play</em> +</p> +<p> +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 <a href="https://android-developers.blogspot.com/2016/07/improvements-for-smaller-app-downloads.html">the +bsdiff algorithm</a> <a href="https://android-developers.blogspot.com/2016/07/improvements-for-smaller-app-downloads.html">(by +Colin Percival)</a>. Using bsdiff, we were able to reduce the size of app +updates on average by 47% compared to the full APK size. +</p> +<p> +Today, we're excited to share a new approach that goes further — <strong><a href="https://github.com/andrewhayden/archive-patcher/blob/master/README.md">File-by-File +patching</a></strong>. App Updates using File-by-File patching are, <strong>on average,</strong> +<strong>65% smaller than the full app</strong>, and in some cases more than 90% +smaller. +</p> +<p> +The savings, compared to our previous approach, add up to 6 petabytes of user +data saved per day! +</p> +<p> +In order to get the new version of the app, Google Play sends your device a +patch that describes the <em>differences</em> between the old and new versions +of the app. +</p> +<p> +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. +</p> +<p> +<strong><span style="text-decoration:underline;">Techniques used in File-by-File +patching </span></strong> +</p> +<p> +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 <a href="https://en.wikipedia.org/w/index.php?title=DEFLATE&oldid=735386036">Deflate</a>. +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 <em>completely different</em>. Describing +the differences between the <em>original</em> content is easy, but describing +the differences between the <em>compressed</em> content is so hard that it leads +to inefficient patches. +</p> +<p> +Watch how much the compressed text on the right side changes from a one-letter +change in the uncompressed text on the left: +</p> +<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s1600/ipsum-opsum.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img src="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif" width="640" height="105" border="0" /></a></div> +<p> +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 <a href="https://source.android.com/security/apksigning/v2.html">APK Signature +Schema v2 </a>for why). +</p> +<p> +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. +</p> +<p> +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. +</p> +<p> +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 <em>exactly the same bytes</em> as originally uploaded. +</p> +<p> +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. +</p> +<p> +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. +</p> +<p> +<strong><span style="text-decoration:underline;">How effective is File-by-File +Patching?</span></strong> +</p> +<p> +Here are examples of app updates already using File-by-File Patching: +</p> +<div dir="ltr" style="text-align: left;" trbidi="on"> +<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"> +<br /></div> +<div dir="ltr" style="margin-left: 0pt;"> +<table style="border-collapse: collapse; border: none;"><colgroup><col width="142" /><col width="102" /><col width="176" /><col width="176" /></colgroup><tbody> +<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Application</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Original Size</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Previous (BSDiff) Patch Size</span></div> +<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(% vs original)</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">File-by-File Patch Size (% vs original)</span></div> +</td></tr> +<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"> +<a href="https://play.google.com/store/apps/details?id=com.king.farmheroessupersaga&hl=en" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Farm Heroes Super Saga</span></a></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">71.1 MB</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">13.4 MB (-81%)</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">8.0 MB (-89%)</span></div> +</td></tr> +<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"> +<a href="https://play.google.com/store/apps/details?id=com.google.android.apps.maps" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Google Maps</span></a></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">32.7 MB</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">17.5 MB (-46%)</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">9.6 MB (-71%)</span></div> +</td></tr> +<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"> +<a href="https://play.google.com/store/apps/details?id=com.google.android.gm" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Gmail</span></a></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">17.8 MB</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">7.6 MB (-57%)</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">7.3 MB (-59%)</span></div> +</td></tr> +<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"> +<a href="https://play.google.com/store/apps/details?id=com.google.android.tts" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Google TTS</span></a></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">18.9 MB</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">17.2 MB (-9%)</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">13.1 MB (-31%)</span></div> +</td></tr> +<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"> +<a href="https://play.google.com/store/apps/details?id=com.amazon.kindle" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Kindle</span></a></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">52.4 MB</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">19.1 MB (-64%)</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">8.4 MB (-84%)</span></div> +</td></tr> +<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"> +<a href="https://play.google.com/store/apps/details?id=com.netflix.mediaclient" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Netflix</span></a></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">16.2 MB</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">7.7 MB (-52%)</span></div> +</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 3px 3px 3px 3px; vertical-align: bottom;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"> +<span style="background-color: transparent; color: black; font-family: roboto; font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1.2 MB (-92%)</span></div> +</td></tr> +</tbody></table> +</div> +<span id="docs-internal-guid-de7f0210-d587-05da-d332-146959aa303f"></span><br /> +<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"> +<br /></div> +</div> +<em>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.</em> +<p> +<strong><span style="text-decoration:underline;">Saving data and making our +users (& developers!) happy</span></strong> +</p> +<p> +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! +</p> + +<p> +If you'd like to know more about File-by-File patching, including the technical +details, head over to the <a href="https://github.com/andrewhayden/archive-patcher">Archive Patcher GitHub +project</a> where you can find information, including the source code. Yes, +File-by-File patching is completely open-source! +</p> +<p> +As a developer if you're interested in reducing your APK size still further, +here are some <a href="https://developer.android.com/topic/performance/reduce-apk-size.html?utm_campaign=android_discussion_filebyfile_120616&utm_source=anddev&utm_medium=blog">general +tips on reducing APK size</a>. +</p> +<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s1600/image01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img src="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s200/image01.png" width="191" height="200" border="0" /></a></div> +<span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"> +<meta content="https://plus.google.com/116899029375914044550" itemprop="url" /> +</span> +<div style="clear: both;"></div> +</div> +<div class="post-footer"> +<div class="post-footer-line post-footer-line-1"><span class="post-author vcard"> +Posted by +<span class="fn"> +<a href="https://www.blogger.com/profile/08588467489110681140" itemprop="author" rel="author" title="author profile"> +Android Developers +</a> +</span> +</span> +<span class="post-icons"> +</span> +<span class="post-timestamp"> +at +<a class="timestamp-link" href="https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html" itemprop="url" rel="bookmark" title="permanent link"><abbr class="published" itemprop="datePublished" title="2016-12-06T12:06:00-08:00">12:06 PM</abbr></a> +</span> +<span class="post-backlinks post-comment-link"> +</span> +</div> +<div class="post-footer-line post-footer-line-2"><span class="post-labels"> +Labels: +<a href="https://android-developers.googleblog.com/search/label/%E2%80%98Google%20Play" rel="tag">‘Google Play</a>, +<a href="https://android-developers.googleblog.com/search/label/Android%20Developer" rel="tag">Android Developer</a>, +<a href="https://android-developers.googleblog.com/search/label/Develop" rel="tag">Develop</a>, +<a href="https://android-developers.googleblog.com/search/label/Featured" rel="tag">Featured</a>, +<a href="https://android-developers.googleblog.com/search/label/Google%20Play" rel="tag">Google Play</a>, +<a href="https://android-developers.googleblog.com/search/label/GooglePlay" rel="tag">GooglePlay</a> +</span> +</div> +<div class="post-footer-line post-footer-line-3"></div> +</div> +</div> +<div class="comments" id="comments"> +<a name="comments"></a> +<div id="backlinks-container"> +<div id="Blog1_backlinks-container"><a name="links"></a><h4>Links to this post</h4> +<p class="comment-footer"> +<a class="comment-link" href="https://www.blogger.com/blog-this.g" id="Blog1_backlinks-create-link" target="_blank">Create a Link</a> +</p> +</div> +</div> +</div> +</div> + + </div></div> + +</div> +<div class="blog-pager" id="blog-pager"> +<span id="blog-pager-newer-link"> +<a class="blog-pager-newer-link" href="https://android-developers.googleblog.com/2016/12/watch-sessions-from-the-playtime-2016-events-to-learn-how-to-succeed-on-android-and-google-play.html" id="Blog1_blog-pager-newer-link" title="Newer Post">Newer Post</a> +</span> +<span id="blog-pager-older-link"> +<a class="blog-pager-older-link" href="https://android-developers.googleblog.com/2016/12/welcoming-android-711-nougat.html" id="Blog1_blog-pager-older-link" title="Older Post">Older Post</a> +</span> +<a class="home-link" href="https://android-developers.googleblog.com/">Home</a> +</div> +<div class="clear"></div> +<div class="post-feeds"> +</div> +<script type="text/javascript">window.___gcfg = {'lang': 'en'};</script> +</div></div> +</div> +</div> +<div class="column-left-outer"> +<div class="column-left-inner"> +<aside> +<div class="sidebar section" id="sidebar-left-1"><div class="widget Image" data-version="1" id="Image1"> +<h2> </h2> +<div class="widget-content"> +<a href="http://developer.android.com"> +<img alt=" " id="Image1_img" src="//4.bp.blogspot.com/-WYc90ytWu_o/VXDbFwMO3DI/AAAAAAAABxA/GFg2ZfIgeMw/s1600/backtodac.png" width="160" height="36" /> +</a> +<br /> +</div> +<div class="clear"></div> +<span class="widget-item-control"> +<span class="item-control blog-admin"> +<a class="quickedit" href="//www.blogger.com/rearrange?blogID=6755709643044947179&widgetType=Image&widgetId=Image1&action=editWidget&sectionId=sidebar-left-1" onclick='return _WidgetManager._PopupConfig(document.getElementById("Image1"));' target="configImage1" title="Edit"> +<img alt="" src="https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18" height="18" /> +</a> +</span> +</span> +<div class="clear"></div> +</div><div class="widget CustomSearch" data-version="1" id="CustomSearch1"> +<h2 class="title">Search</h2> +<div class="widget-content"> +<div id="CustomSearch1_form"><form class="gsc-search-box" accept-charset="utf-8"><table class="gsc-search-box" cellspacing="0" cellpadding="0"><tbody><tr><td class="gsc-input"><input autocomplete="off" size="10" class=" gsc-input" name="search" title="search" type="text" /><input name="bgresponse" id="bgresponse" type="hidden" /></td><td class="gsc-search-button"><input value="Search" class="gsc-search-button" title="search" type="submit" /></td></tr></tbody></table><table class="gsc-branding" cellspacing="0" cellpadding="0"><tbody><tr style="display: none;"><td class="gsc-branding-user-defined"></td><td class="gsc-branding-text"><div class="gsc-branding-text">powered by</div></td><td class="gsc-branding-img-noclear"><img src="https://www.google.com/uds/css/small-logo.png" class="gsc-branding-img-noclear" /></td></tr></tbody></table></form></div> +</div> +<style type="text/css"> + #uds-searchControl .gs-result .gs-title, + #uds-searchControl .gs-result .gs-title *, + #uds-searchControl .gsc-results .gsc-trailing-more-results, + #uds-searchControl .gsc-results .gsc-trailing-more-results * { + color:#258aaf; + } + + #uds-searchControl .gs-result .gs-title a:visited, + #uds-searchControl .gs-result .gs-title a:visited * { + color:#258aaf; + } + + #uds-searchControl .gs-relativePublishedDate, + #uds-searchControl .gs-publishedDate { + color: #000000; + } + + #uds-searchControl .gs-result a.gs-visibleUrl, + #uds-searchControl .gs-result .gs-visibleUrl { + color: #258aaf; + } + + #uds-searchControl .gsc-results { + border-color: #eeeeee; + background-color: transparent; + } + + #uds-searchControl .gsc-tabhActive { + border-color: #eeeeee; + border-top-color: #eeeeee; + background-color: transparent; + color: #666666; + } + + #uds-searchControl .gsc-tabhInactive { + border-color: #eeeeee; + background-color: transparent; + color: #258aaf; + } + + #uds-searchClearResults { + border-color: #eeeeee; + } + + #uds-searchClearResults:hover { + border-color: #eeeeee; + } + + #uds-searchControl .gsc-cursor-page { + color: #258aaf; + } + + #uds-searchControl .gsc-cursor-current-page { + color: #666666; + } + </style> +<div class="clear"></div> +<span class="widget-item-control"> +<span class="item-control blog-admin"> +<a class="quickedit" href="//www.blogger.com/rearrange?blogID=6755709643044947179&widgetType=CustomSearch&widgetId=CustomSearch1&action=editWidget&sectionId=sidebar-left-1" onclick='return _WidgetManager._PopupConfig(document.getElementById("CustomSearch1"));' target="configCustomSearch1" title="Edit"> +<img alt="" src="https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18" height="18" /> +</a> +</span> +</span> +<div class="clear"></div> +</div><div class="widget BlogArchive" data-version="1" id="BlogArchive1"> +<h2>Archive</h2> +<div class="widget-content"> +<div id="ArchiveList"> +<div id="BlogArchive1_ArchiveList"> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2017-01-01T00:00:00-08:00&updated-max=2018-01-01T00:00:00-08:00&max-results=11"> +2017 +</a> +<span class="post-count" dir="ltr">(11)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2017_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(11)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate expanded"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy toggle-open"> + + ▼ + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2016-01-01T00:00:00-08:00&updated-max=2017-01-01T00:00:00-08:00&max-results=50"> +2016 +</a> +<span class="post-count" dir="ltr">(136)</span> +<ul class="hierarchy"> +<li class="archivedate expanded"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy toggle-open"> + + ▼ + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(17)</span> +<ul class="posts"> +<li><a href="https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html">Introducing the ExifInterface Support Library</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/get-the-guide-to-finding-success-in-new-markets-on-google-play.html">Get the guide to finding success in new markets on...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/start-building-actions-on-google.html">Start building Actions on Google</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/important-best-practices-to-improve-app-engagement.html">Best practices to improve app engagement</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/games-authentication-adopting-google.html">Games authentication adopting Google Sign-In API</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/four-tips-for-startup-success-from-a-silicon-valley-vc.html">Four tips for startup success from a Silicon Valle...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/get-a-glimpse-of-wear-2-0s-upcoming-standalone-apps.html">Get a glimpse of Wear 2.0’s upcoming standalone ap...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/tips-to-be-better-found-and-discovered-on-google-play.html">Tips to be better found and discovered on Google P...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/android-wear-2-0-for-china-developer-preview.html">Android Wear 2.0 for China - Developer Preview</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/android-wear-2-0-developer-preview-4-authentication-in-app-billing-and-more.html">Android Wear 2.0 Developer Preview 4: Authenticati...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/announcing-googles-new-internet-of-things-platform-with-weave-and-android-things.html">Announcing updates to Google’s Internet of Things ...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/five-steps-to-achieve-sustainable-growth-and-boost-your-apps-long-term-success.html">Five steps to achieve sustainable growth and boost...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/how-augmented-reality-helps-you-buy-furniture-and-capture-pokemon.html">How augmented reality helps you buy furniture and ...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/watch-sessions-from-the-playtime-2016-events-to-learn-how-to-succeed-on-android-and-google-play.html">Watch sessions from the Playtime 2016 events to le...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html">Saving Data: Reducing the size of App Updates by 6...</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/welcoming-android-711-nougat.html">Welcoming Android 7.1.1 Nougat</a></li> +<li><a href="https://android-developers.googleblog.com/2016/12/indie-game-developers-in-latin-america-sustain-growth-after-launch-on-google-play.html">Indie game developers in Latin America sustain gro...</a></li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(16)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(9)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(6)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(7)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(12)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(14)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(16)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(14)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2016_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(9)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2015-01-01T00:00:00-08:00&updated-max=2016-01-01T00:00:00-08:00&max-results=50"> +2015 +</a> +<span class="post-count" dir="ltr">(130)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(9)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(13)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(20)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(15)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(13)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(9)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(10)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(10)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(12)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2015_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2014-01-01T00:00:00-08:00&updated-max=2015-01-01T00:00:00-08:00&max-results=50"> +2014 +</a> +<span class="post-count" dir="ltr">(73)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(9)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(13)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(11)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(6)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(9)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(10)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2014_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2013-01-01T00:00:00-08:00&updated-max=2014-01-01T00:00:00-08:00&max-results=48"> +2013 +</a> +<span class="post-count" dir="ltr">(48)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(7)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(9)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2013_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2012-01-01T00:00:00-08:00&updated-max=2013-01-01T00:00:00-08:00&max-results=41"> +2012 +</a> +<span class="post-count" dir="ltr">(41)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(1)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(1)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(1)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2012_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2011-01-01T00:00:00-08:00&updated-max=2012-01-01T00:00:00-08:00&max-results=50"> +2011 +</a> +<span class="post-count" dir="ltr">(68)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(7)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(7)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(7)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(6)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2011_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2010-01-01T00:00:00-08:00&updated-max=2011-01-01T00:00:00-08:00&max-results=50"> +2010 +</a> +<span class="post-count" dir="ltr">(72)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(7)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(6)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(10)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(11)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(11)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2010_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2009-01-01T00:00:00-08:00&updated-max=2010-01-01T00:00:00-08:00&max-results=50"> +2009 +</a> +<span class="post-count" dir="ltr">(63)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(7)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_07_01_archive.html"> +July +</a> +<span class="post-count" dir="ltr">(1)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(12)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(8)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2009_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2008-01-01T00:00:00-08:00&updated-max=2009-01-01T00:00:00-08:00&max-results=40"> +2008 +</a> +<span class="post-count" dir="ltr">(40)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(1)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_10_01_archive.html"> +October +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_09_01_archive.html"> +September +</a> +<span class="post-count" dir="ltr">(6)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_08_01_archive.html"> +August +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_06_01_archive.html"> +June +</a> +<span class="post-count" dir="ltr">(1)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_05_01_archive.html"> +May +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_04_01_archive.html"> +April +</a> +<span class="post-count" dir="ltr">(4)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_03_01_archive.html"> +March +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_02_01_archive.html"> +February +</a> +<span class="post-count" dir="ltr">(2)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2008_01_01_archive.html"> +January +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/search?updated-min=2007-01-01T00:00:00-08:00&updated-max=2008-01-01T00:00:00-08:00&max-results=8"> +2007 +</a> +<span class="post-count" dir="ltr">(8)</span> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2007_12_01_archive.html"> +December +</a> +<span class="post-count" dir="ltr">(3)</span> +</li> +</ul> +<ul class="hierarchy"> +<li class="archivedate collapsed"> +<a class="toggle" href="javascript:void(0)"> +<span class="zippy"> + + ► + +</span> +</a> +<a class="post-count-link" href="https://android-developers.googleblog.com/2007_11_01_archive.html"> +November +</a> +<span class="post-count" dir="ltr">(5)</span> +</li> +</ul> +</li> +</ul> +</div> +</div> +<div class="clear"></div> +<span class="widget-item-control"> +<span class="item-control blog-admin"> +<a class="quickedit" href="//www.blogger.com/rearrange?blogID=6755709643044947179&widgetType=BlogArchive&widgetId=BlogArchive1&action=editWidget&sectionId=sidebar-left-1" onclick='return _WidgetManager._PopupConfig(document.getElementById("BlogArchive1"));' target="configBlogArchive1" title="Edit"> +<img alt="" src="https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18" height="18" /> +</a> +</span> +</span> +<div class="clear"></div> +</div> +</div><div class="widget HTML" data-version="1" id="HTML1"> +<h2 class="title">Community</h2> +<div class="widget-content"> +<!-- Place this tag in the <head> of your document --> +<script type="text/javascript"> +window.___gcfg = {lang: 'en'}; +(function() +{var po = document.createElement("script"); +po.type = "text/javascript"; po.async = true;po.src = "https://apis.google.com/js/plusone.js"; +var s = document.getElementsByTagName("script")[0]; +s.parentNode.insertBefore(po, s); +})();</script> + +<!-- Place this tag where you want the badge to render --> +<div style="text-indent: 0px; margin: 0px; padding: 0px; background: transparent none repeat scroll 0% 0%; border-style: none; float: none; line-height: normal; font-size: 1px; vertical-align: baseline; display: inline-block; width: 170px; height: 85px;" id="___plus_0"><iframe ng-non-bindable="" hspace="0" marginheight="0" marginwidth="0" scrolling="no" style="position: static; top: 0px; width: 170px; margin: 0px; border-style: none; left: 0px; visibility: visible; height: 85px;" tabindex="0" vspace="0" id="I0_1485775685158" name="I0_1485775685158" src="https://apis.google.com/u/0/_/widget/render/badge?usegapi=1&width=170&height=131&theme=light&hl=en&origin=https%3A%2F%2Fandroid-developers.googleblog.com&url=https%3A%2F%2Fplus.google.com%2F108967384991768947849%3Frel%3Dpublisher&gsrc=3p&ic=1&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en_GB.oDaXKax7Lmc.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCP-QWj14-CfU2w6doKmOqTwfM2Hig#_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart%2Concircled%2Cdrefresh%2Cerefresh%2Conload&id=I0_1485775685158&parent=https%3A%2F%2Fandroid-developers.googleblog.com&pfname=&rpctoken=41542600" data-gapiattached="true" title="+Badge" frameborder="0" width="100%"></iframe></div> + +<p> +<a href="http://android-developers.blogspot.com/atom.xml"><img src="//www.google.com/images/feed-icon.gif" /></a> <a href="http://android-developers.blogspot.com/atom.xml">Subscribe</a> + +<br /> + +<a href="http://feeds.feedburner.com/blogspot/hsDu"><img style="border:0; margin: 7px 0 0 0; vertical-align: top;" alt="Feed subscriber count" src="https://lh3.googleusercontent.com/proxy/6eDGde9GqU8gdSDBsk61c4dikCGa8zbyPVUOl0aRchtp2Dyu30v4Y-Jwh8RQhtStCB5g0iIxltBTr4S5xV0-5kvciEQ8bwF7H6nRVTUe-Z0hqk7EStALd-7iboI=s0-d" width="88" height="26" /></a></p> +</div> +<div class="clear"></div> +<span class="widget-item-control"> +<span class="item-control blog-admin"> +<a class="quickedit" href="//www.blogger.com/rearrange?blogID=6755709643044947179&widgetType=HTML&widgetId=HTML1&action=editWidget&sectionId=sidebar-left-1" onclick='return _WidgetManager._PopupConfig(document.getElementById("HTML1"));' target="configHTML1" title="Edit"> +<img alt="" src="https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18" height="18" /> +</a> +</span> +</span> +<div class="clear"></div> +</div></div> +</aside> +</div> +</div> +<div class="column-right-outer"> +<div class="column-right-inner"> +<aside> +</aside> +</div> +</div> +</div> +<div style="clear: both"></div> +<!-- columns --> +</div> +<!-- main --> +</div> +</div> +<div class="main-cap-bottom cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +<footer> +<div class="footer-outer"> +<div class="footer-cap-top cap-top"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +<div class="fauxborder-left footer-fauxborder-left"> +<div class="fauxborder-right footer-fauxborder-right"></div> +<div class="region-inner footer-inner"> +<div class="foot no-items section" id="footer-1"></div> +<!-- outside of the include in order to lock Attribution widget --> +<div class="foot section" id="footer-3"><div class="widget Attribution" data-version="1" id="Attribution1"> +<div class="widget-content" style="text-align: center;"> +Powered by <a href="https://www.blogger.com" target="_blank">Blogger</a>. +</div> +<div class="clear"></div> +<span class="widget-item-control"> +<span class="item-control blog-admin"> +<a class="quickedit" href="//www.blogger.com/rearrange?blogID=6755709643044947179&widgetType=Attribution&widgetId=Attribution1&action=editWidget&sectionId=footer-3" onclick='return _WidgetManager._PopupConfig(document.getElementById("Attribution1"));' target="configAttribution1" title="Edit"> +<img alt="" src="https://resources.blogblog.com/img/icon18_wrench_allbkg.png" width="18" height="18" /> +</a> +</span> +</span> +<div class="clear"></div> +</div></div> +</div> +</div> +<div class="footer-cap-bottom cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +</footer> +<!-- content --> +</div> +</div> +<div class="content-cap-bottom cap-bottom"> +<div class="cap-left"></div> +<div class="cap-right"></div> +</div> +</div> +</div> +<script type="text/javascript"> + window.setTimeout(function() { + document.body.className = document.body.className.replace('loading', ''); + }, 10); + </script> +<script type="text/javascript"> + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-5831155-1']); + _gaq.push(['_trackPageview']); + (function() { + var ga = document.createElement('script'); + ga.type = 'text/javascript'; + ga.async = true; + ga.src = (document.location.protocol == 'https:' ? + 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(ga, s); + })(); + </script> +<script type="text/javascript"> + $("pre:not(.no-pretty-print)").addClass("prettyprint"); + prettyPrint(); +</script> + + +<!-- 'Het is jouw verantwoordelijkheid om je bezoekers te laten weten dat je cookies gebruikt op je blog. Zie http://www.blogger.com/go/cookiechoices voor meer informatie.' --> +<script src="/js/cookiechoices.js" defer="defer"></script> +<script> + document.addEventListener('DOMContentLoaded', function(event) { + window.cookieChoices && cookieChoices.showCookieConsentBar && cookieChoices.showCookieConsentBar( + (window.cookieOptions && cookieOptions.msg) || 'Deze site gebruikt cookies van Google om services te leveren, advertenties te personaliseren en verkeer te analyseren. Informatie over je gebruik van deze site wordt gedeeld met Google. Als je deze site gebruikt, ga je akkoord met het gebruik van cookies.', + (window.cookieOptions && cookieOptions.close) || 'Ik snap het', + (window.cookieOptions && cookieOptions.learn) || 'Meer informatie', + (window.cookieOptions && cookieOptions.link) || 'https://www.blogger.com/go/blogspot-cookies'); + }); +</script> + + +<script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/1402174469-widgets.js"></script> +<script type="text/javascript" src="https://apis.google.com/js/plusone.js" gapi_processed="true"></script> +<script type="text/javascript" src="//www.google.com/jsapi"></script> +<script type="text/javascript"> +window['__wavt'] = 'AOuZoY5l4X35A238Tm4EK1tT_Jl9HhT9Mg:1485775684055';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d6755709643044947179','//android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html','6755709643044947179'); +_WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '6755709643044947179', 'bloggerUrl': 'https://www.blogger.com', 'title': 'Android Developers Blog', 'pageType': 'item', 'postId': '2701400044422363572', 'url': 'https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html', 'canonicalUrl': 'https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html', 'homepageUrl': 'https://android-developers.googleblog.com/', 'searchUrl': 'https://android-developers.googleblog.com/search', 'canonicalHomepageUrl': 'https://android-developers.googleblog.com/', 'blogspotFaviconUrl': 'https://android-developers.googleblog.com/favicon.ico', 'hasCustomDomain': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-5831155-1', 'useUniversalAnalytics': false, 'pageName': 'Saving Data: Reducing the size of App Updates by 65%', 'pageTitle': 'Android Developers Blog: Saving Data: Reducing the size of App Updates by 65%', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'languageDirection': 'ltr', 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Android Developers Blog - Atom\x22 href\x3d\x22https://android-developers.googleblog.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Android Developers Blog - RSS\x22 href\x3d\x22https://android-developers.googleblog.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Android Developers Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/6755709643044947179/posts/default\x22 /\x3e\n\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Android Developers Blog - Atom\x22 href\x3d\x22https://android-developers.googleblog.com/feeds/2701400044422363572/comments/default\x22 /\x3e\n', 'meTag': '', 'openIdOpTag': '', 'postImageThumbnailUrl': 'https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s72-c/ipsum-opsum.gif', 'postImageUrl': 'https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif', 'mobileHeadScript': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'ieCssRetrofitLinks': '\x3c!--[if IE]\x3e\x3cscript type\x3d\x22text/javascript\x22 src\x3d\x22https://www.blogger.com/static/v1/jsbin/3032875878-ieretrofit.js\x22\x3e\x3c/script\x3e\n\x3c![endif]--\x3e', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/3e7cf79fb5633dcb', 'plusOneApiSrc': 'https://apis.google.com/js/plusone.js', 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'Twitter', 'key': 'twitter', 'shareMessage': 'Share to Twitter', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Google+', 'key': 'googlePlus', 'shareMessage': 'Share to Google+', 'target': 'googleplus'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'googlePlusShareButtonWidth': 300, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}}}, {'name': 'features', 'data': {'widgetVisibility': true}}, {'name': 'messages', 'data': {'linkCopiedToClipboard': 'Link copied to clipboard!', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Saving Data: Reducing the size of App Updates by 65%', 'description': ' Posted by Andrew Hayden, Software Engineer on Google Play Android users are downloading tens of billions of apps and games on Google Pla...', 'featuredImage': 'https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif', 'url': 'https://android-developers.googleblog.com/2016/12/saving-data-reducing-the-size-of-app-updates-by-65-percent.html', 'type': 'item', 'isSingleItem': true, 'isMultipleItems': false, 'isError': false, 'isPage': false, 'isPost': true, 'isHomepage': false, 'isArchive': false, 'isSearch': false, 'isLabelSearch': false, 'postId': 2701400044422363572}}]); +_WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', null, document.getElementById('Navbar1'), {}, 'displayModeFull')); +_WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', null, document.getElementById('Header1'), {}, 'displayModeFull')); +_WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', null, document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'showBacklinks': true, 'postId': '2701400044422363572', 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/1375401262-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/368954415-lightbox_bundle.css'}, 'displayModeFull')); +_WidgetManager._RegisterWidget('_ImageView', new _WidgetInfo('Image1', 'sidebar-left-1', null, document.getElementById('Image1'), {'resize': false}, 'displayModeFull')); +_WidgetManager._RegisterWidget('_CustomSearchView', new _WidgetInfo('CustomSearch1', 'sidebar-left-1', null, document.getElementById('CustomSearch1'), {'title': 'Search', 'includeBlog': true, 'includePostLinks': false, 'includeWeb': false, 'linkLists': [], 'blogUrl': 'https://android-developers.googleblog.com/', 'loadingMsg': 'Loading...', 'thisBlogMsg': 'This Blog', 'linkedFromHereMsg': 'Linked From Here', 'theWebMsg': 'The Web', 'backgroundColor': 'transparent', 'textColor': '#666666', 'dateColor': '#000000', 'linkColor': '#258aaf', 'urlColor': '#258aaf', 'visitedLinkColor': '#258aaf', 'borderColor': '#eeeeee', 'activeBorderColor': '#eeeeee', 'cse_ua': true}, 'displayModeFull')); +_WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar-left-1', null, document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); +_WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML1', 'sidebar-left-1', null, document.getElementById('HTML1'), {}, 'displayModeFull')); +_WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', null, document.getElementById('Attribution1'), {}, 'displayModeFull')); +</script> + +<div id="cookieChoiceInfo" class="cookie-choices-info singleton-element"><div class="cookie-choices-inner"><span class="cookie-choices-text">Deze site gebruikt cookies van Google om services te leveren, advertenties te personaliseren en verkeer te analyseren. Informatie over je gebruik van deze site wordt gedeeld met Google. Als je deze site gebruikt, ga je akkoord met het gebruik van cookies.</span><span class="cookie-choices-buttons"><a href="https://www.blogger.com/go/blogspot-cookies" target="_blank" class="cookie-choices-button">Meer informatie</a><a id="cookieChoiceDismiss" href="#" class="cookie-choices-button">Ik snap het</a></span></div></div><iframe name="oauth2relay2084943440" id="oauth2relay2084943440" src="https://accounts.google.com/o/oauth2/postmessageRelay?parent=https%3A%2F%2Fandroid-developers.googleblog.com&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en_GB.oDaXKax7Lmc.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCP-QWj14-CfU2w6doKmOqTwfM2Hig#rpctoken=251594429&forcesecure=1" style="width: 1px; height: 1px; position: absolute; top: -100px;" tabindex="-1" aria-hidden="true"></iframe><link type="text/css" rel="stylesheet" href="https://www.blogger.com/static/v1/v-css/368954415-lightbox_bundle.css" /><script type="text/javascript" src="https://www.blogger.com/static/v1/jsbin/1375401262-lbx.js"></script></body></html> |