Home | History | Annotate | Download | only in dashboards
      1 page.title=Dashboards
      2 page.metaDescription=An overview of device characteristics and platform versions that are active in the Android ecosystem.
      3 page.tags="android, dashboard, platforms, versions"
      4 meta.tags="ecosystem, versions, whatsnew, dashboards"
      5 page.image=https://chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0%7CGL%203.1&chf=bg%2Cs%2C00000000&chd=t%3A51.6%2C40.7%2C7.7&chco=c4df9b%2C6fad0c&cht=p&chs=400x250
      6 
      7 @jd:body
      8 
      9 <style>
     10 div.chart,
     11 div.screens-chart {
     12   display:none;
     13 }
     14 tr .total {
     15   background-color:transparent;
     16   border:0;
     17   color:#666;
     18 }
     19 tr th.total {
     20   font-weight:bold;
     21 }
     22 </style>
     23 
     24 
     25 
     26 
     27 <div class="sidebox">
     28 <h2>Google Play Install Stats</h2>
     29 <p>The Google Play Developer Console also provides <a
     30 href="{@docRoot}distribute/googleplay/developer-console.html#app-stats">detailed statistics</a>
     31 about your users' devices. Those stats may help you prioritize the device profiles for which
     32 you optimize your app.</p>
     33 </div>
     34 
     35 <p>This page provides information about the relative number of devices that share a certain
     36 characteristic, such as Android version or screen size. This information may
     37 help you prioritize efforts for <a
     38 href="{@docRoot}training/basics/supporting-devices/index.html">supporting different devices</a>
     39 by revealing which devices are active in the Android and Google Play ecosystem.</p>
     40 
     41 <p>This data reflects devices running the latest Google Play Store app, which is compatible
     42 with Android 2.2 and higher. Each snapshot of data represents all the devices that visited the
     43 Google Play Store in the prior 7 days.</p>
     44 
     45 
     46 
     47 <h2 id="Platform">Platform Versions</h2>
     48 
     49 <p>This section provides data about the relative number of devices running a given version of
     50 the Android platform.</p>
     51 
     52 <p>For information about how to target your application to devices based on
     53 platform version, read <a
     54 href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different
     55 Platform Versions</a>.</p>
     56 
     57 
     58 <div id="version-chart">
     59 </div>
     60 
     61 
     62 <p style="clear:both"><em>Data collected during a 7-day period ending on June 6, 2016.
     63 <br/>Any versions with less than 0.1% distribution are not shown.</em>
     64 </p>
     65 
     66 
     67 
     68 <h2 id="Screens">Screen Sizes and Densities</h2>
     69 
     70 <p>This section provides data about the relative number of devices that have a particular
     71 screen configuration, defined by a combination of screen size and density. To simplify the way that
     72 you design your user interfaces for different screen configurations, Android divides the range of
     73 actual screen sizes and densities into several buckets as expressed by the table below.</p>
     74 
     75 <p>For information about how you can support multiple screen configurations in your
     76 application, read <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple
     77 Screens</a>.</p>
     78 
     79 
     80 <div id="screens-chart">
     81 </div>
     82 
     83 
     84 <p style="clear:both"><em>Data collected during a 7-day period ending on June 6, 2016.
     85 
     86 <br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
     87 
     88 
     89 
     90 
     91 
     92 
     93 
     94 
     95 <h2 id="OpenGL">Open GL Version</h2>
     96 
     97 <p>This section provides data about the relative number of devices that support a particular
     98 version of OpenGL ES. Note that support for one particular version of OpenGL ES also implies
     99 support for any lower version (for example, support for version 2.0 also implies support for
    100 1.1).</p>
    101 
    102 
    103 <img alt="" style="float:right"
    104 src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0%7CGL%203.1&chf=bg%2Cs%2C00000000&chd=t%3A48.6%2C41.8%2C9.6&chco=c4df9b%2C6fad0c&cht=p&chs=400x250">
    105 
    106 <p>To declare which version of OpenGL ES your application requires, you should use the {@code
    107 android:glEsVersion} attribute of the <a
    108 href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a>
    109 element. You can also use the <a
    110 href="{@docRoot}guide/topics/manifest/supports-gl-texture-element.html">{@code
    111 <supports-gl-texture>}</a> element to declare the GL compression formats that your application
    112 uses.</p>
    113 
    114 
    115 <table style="width:350px">
    116 <tr>
    117 <th scope="col">OpenGL ES Version</th>
    118 <th scope="col">Distribution</th>
    119 </tr>
    120 <tr>
    121 <td>2.0</td>
    122 <td>48.6%</td>
    123 </tr>
    124 <tr>
    125 <td>3.0</td>
    126 <td>41.8%</td>
    127 </tr>
    128 <tr>
    129 <td>3.1</td>
    130 <td>9.6%</td>
    131 </tr>
    132 </table>
    133 
    134 
    135 
    136 <p style="clear:both"><em>Data collected during a 7-day period ending on June 6, 2016</em></p>
    137 
    138 
    139 
    140 
    141 
    142 <script>
    143 var SCREEN_DATA =
    144 [
    145   {
    146     "data": {
    147       "Large": {
    148         "hdpi": "0.5",
    149         "ldpi": "0.2",
    150         "mdpi": "4.5",
    151         "tvdpi": "2.2",
    152         "xhdpi": "0.5"
    153       },
    154       "Normal": {
    155         "hdpi": "41.1",
    156         "mdpi": "4.2",
    157         "tvdpi": "0.1",
    158         "xhdpi": "25.6",
    159         "xxhdpi": "15.0"
    160       },
    161       "Small": {
    162         "ldpi": "2.0"
    163       },
    164       "Xlarge": {
    165         "hdpi": "0.3",
    166         "mdpi": "3.1",
    167         "xhdpi": "0.7"
    168       }
    169     },
    170     "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A2.2%2C11.8%2C2.3%2C41.9%2C26.8%2C15.0&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi",
    171     "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A4.1%2C7.9%2C86.0%2C2.0&chl=Xlarge%7CLarge%7CNormal%7CSmall"
    172   }
    173 ];
    174 
    175 
    176 var VERSION_DATA =
    177 [
    178   {
    179     "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A0.1%2C2.0%2C1.9%2C18.9%2C31.6%2C35.4%2C10.1&chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat%7CLollipop%7CMarshmallow",
    180     "data": [
    181       {
    182         "api": 8,
    183         "name": "Froyo",
    184         "perc": "0.1"
    185       },
    186       {
    187         "api": 10,
    188         "name": "Gingerbread",
    189         "perc": "2.0"
    190       },
    191       {
    192         "api": 15,
    193         "name": "Ice Cream Sandwich",
    194         "perc": "1.9"
    195       },
    196       {
    197         "api": 16,
    198         "name": "Jelly Bean",
    199         "perc": "6.8"
    200       },
    201       {
    202         "api": 17,
    203         "name": "Jelly Bean",
    204         "perc": "9.4"
    205       },
    206       {
    207         "api": 18,
    208         "name": "Jelly Bean",
    209         "perc": "2.7"
    210       },
    211       {
    212         "api": 19,
    213         "name": "KitKat",
    214         "perc": "31.6"
    215       },
    216       {
    217         "api": 21,
    218         "name": "Lollipop",
    219         "perc": "15.4"
    220       },
    221       {
    222         "api": 22,
    223         "name": "Lollipop",
    224         "perc": "20.0"
    225       },
    226       {
    227         "api": 23,
    228         "name": "Marshmallow",
    229         "perc": "10.1"
    230       }
    231     ]
    232   }
    233 ];
    234 
    235 
    236 var VERSION_NAMES =
    237 [
    238   {"api":0},{"api":1},{"api":2},{"api":3},
    239   {
    240     "api":4,
    241     "link":'<a href="/about/versions/android-1.6.html">1.6</a>',
    242     "codename":"Donut",
    243   },
    244   { "api":5},
    245   { "api":6},
    246   {
    247     "api":7,
    248     "link":'<a href="/about/versions/android-2.1.html">2.1</a>',
    249     "codename":"Eclair",
    250   },
    251   {
    252     "api":8,
    253     "link":'<a href="/about/versions/android-2.2.html">2.2</a>',
    254     "codename":"Froyo"
    255   },
    256   {
    257     "api":9,
    258     "link":'<a href="/about/versions/android-2.3.html">2.3 -<br>2.3.2</a>',
    259     "codename":"Gingerbread"
    260   },
    261   {
    262     "api":10,
    263     "link":'<a href="/about/versions/android-2.3.3.html">2.3.3 -<br>2.3.7</a>',
    264     "codename":"Gingerbread"
    265   },
    266   { "api":11},
    267   {
    268     "api":12,
    269     "link":'<a href="/about/versions/android-3.1.html">3.1</a>',
    270     "codename":"Honeycomb"
    271   },
    272   {
    273     "api":13,
    274     "link":'<a href="/about/versions/android-3.2.html">3.2</a>',
    275     "codename":"Honeycomb"
    276   },
    277   { "api":14},
    278   {
    279     "api":15,
    280     "link":'<a href="/about/versions/android-4.0.html">4.0.3 -<br>4.0.4</a>',
    281     "codename":"Ice Cream Sandwich"
    282   },
    283   {
    284     "api":16,
    285     "link":'<a href="/about/versions/android-4.1.html">4.1.x</a>',
    286     "codename":"Jelly Bean"
    287   },
    288   {
    289     "api":17,
    290     "link":'<a href="/about/versions/android-4.2.html">4.2.x</a>',
    291     "codename":"Jelly Bean"
    292   },
    293   {
    294     "api":18,
    295     "link":'<a href="/about/versions/android-4.3.html">4.3</a>',
    296     "codename":"Jelly Bean"
    297   },
    298   {
    299     "api":19,
    300     "link":'<a href="/about/versions/android-4.4.html">4.4</a>',
    301     "codename":"KitKat"
    302   },
    303   {
    304     "api":20,
    305     "link":'<a href="/about/versions/android-4.4.html">4.4W</a>',
    306     "codename":"KitKat for Wear"
    307   },
    308   {
    309     "api":21,
    310     "link":'<a href="/about/versions/android-5.0.html">5.0</a>',
    311     "codename":"Lollipop"
    312   },
    313   {
    314     "api":22,
    315     "link":'<a href="/about/versions/android-5.1.html">5.1</a>',
    316     "codename":"Lollipop"
    317   },
    318   {
    319     "api":23,
    320     "link":'<a href="/about/versions/marshmallow/index.html">6.0</a>',
    321     "codename":"Marshmallow"
    322   }
    323 ];
    324 
    325 
    326 
    327 $(document).ready(function(){
    328   // for each set of data (each month)
    329   $.each(VERSION_DATA, function(i, set) {
    330 
    331     // set up wrapper divs
    332     var $div = $('<div class="chart"'
    333          + ((i == 0) ? ' style="display:block"' : '')
    334          + ' >');
    335     var $divtable = $('<div class="col-5" style="margin-left:0">');
    336     var $divchart = $('<div class="col-8" style="margin-right:0">');
    337 
    338     // set up a new table
    339     var $table = $("<table>");
    340     var $trh = $("<tr><th>Version</th>"
    341                    + "<th>Codename</th>"
    342                    + "<th>API</th>"
    343                    + "<th>Distribution</th></tr>");
    344     $table.append($trh);
    345 
    346     // loop each data set (each api level represented in stats)
    347     $.each(set.data, function(i, data) {
    348       // check if we need to rowspan the codename
    349       var rowspan = 1;
    350       // must not be first row
    351       if (i > 0) {
    352         // if this row's codename is the same as previous row codename
    353         if (data.name == set.data[i-1].name) {
    354           rowspan = 0;
    355         // otherwise, as long as this is not the last row
    356         } else if (i < (set.data.length - 1)) {
    357           // increment rowspan for each subsequent row w/ same codename
    358           while (data.name == set.data[i+rowspan].name) {
    359             rowspan++;
    360             // unless we've reached the last row
    361             if ((i + rowspan) >= set.data.length) break;
    362           }
    363         }
    364       }
    365 
    366       // create table row and get corresponding version info from VERSION_NAMES
    367       var $tr = $("<tr>");
    368       $tr.append("<td>" + VERSION_NAMES[data.api].link + "</td>");
    369       if (rowspan > 0) {
    370         $tr.append("<td rowspan='" + rowspan + "'>" + VERSION_NAMES[data.api].codename + "</td>");
    371       }
    372       $tr.append("<td>" + data.api + "</td>");
    373       $tr.append("<td>" + data.perc + "%</td>");
    374       $table.append($tr);
    375     });
    376 
    377     // create chart image
    378     var $chart = $('<img style="margin-left:30px" alt="" data-dac-src="' + set.chart + '" />');
    379 
    380     // stack up and insert the elements
    381     $divtable.append($table);
    382     $divchart.append($chart);
    383     $div.append($divtable).append($divchart);
    384     $("#version-chart").append($div);
    385   });
    386 
    387 
    388 
    389   var SCREEN_SIZES = ["Small","Normal","Large","Xlarge"];
    390   var SCREEN_DENSITIES = ["ldpi","mdpi","tvdpi","hdpi","xhdpi","xxhdpi"];
    391 
    392 
    393   // for each set of screens data (each month)
    394   $.each(SCREEN_DATA, function(i, set) {
    395 
    396     // set up wrapper divs
    397     var $div = $('<div class="screens-chart"'
    398          + ((i == 0) ? ' style="display:block"' : '')
    399          + ' >');
    400 
    401     // set up a new table
    402     var $table = $("<table>");
    403     var $trh = $("<tr><th></th></tr>");
    404     $.each(SCREEN_DENSITIES, function(i, density) {
    405       $trh.append("<th scope='col'>" + density + "</th>");
    406     });
    407     $trh.append("<th scope='col' class='total'>Total</th>");
    408     $table.append($trh);
    409 
    410     // array to hold totals for each density
    411     var densityTotals = new Array(SCREEN_DENSITIES.length);
    412     $.each(densityTotals, function(i, total) {
    413       densityTotals[i] = 0; // make them all zero to start
    414     });
    415 
    416     // loop through each screen size
    417     $.each(SCREEN_SIZES, function(i, size) {
    418       // if there are any devices of this size
    419       if (typeof set.data[size] != "undefined") {
    420         // create table row and insert data
    421         var $tr = $("<tr>");
    422         $tr.append("<th scope='row'>" + size + "</th>");
    423         // variable to sum all densities for this size
    424         var total = 0;
    425         // loop through each density
    426         $.each(SCREEN_DENSITIES, function(i, density) {
    427           var num = typeof set.data[size][density] != "undefined" ? set.data[size][density] : 0;
    428           $tr.append("<td>" + (num != 0 ? num + "%" : "") + "</td>");
    429           total += parseFloat(num);
    430           densityTotals[i] += parseFloat(num);
    431         })
    432         $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>");
    433         $table.append($tr);
    434       }
    435     });
    436 
    437     // create row of totals for each density
    438     var $tr = $("<tr><th class='total'>Total</th></tr>");
    439     $.each(densityTotals, function(i, total) {
    440       $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>");
    441     });
    442     $table.append($tr);
    443 
    444     // create charts
    445     var $sizechart = $('<img style="float:left;width:380px" alt="" data-dac-src="'
    446             + set.layoutchart + '" />');
    447     var $densitychart = $('<img style="float:left;width:380px" alt="" data-dac-src="'
    448             + set.densitychart + '" />');
    449 
    450     // stack up and insert the elements
    451     $div.append($table).append($sizechart).append($densitychart);
    452     $("#screens-chart").append($div);
    453   });
    454 
    455   // TODO (akassay): Remove this.
    456   // I replaced the src attributes in the javascript above with data-dac-src
    457   // so the value would not be molested by the DevSite parser. So this code here
    458   // moves that src value into a real src attribute at runtime. This should be
    459   // removed once we either move this script out of the content body or update
    460   // the parser to not modify src attributes in <script> tags.
    461   $('img[data-dac-src]').each(function() {
    462     var src = $(this).attr('data-dac-src');
    463     $(this).attr('src', src);
    464   });
    465 
    466 });
    467 
    468 
    469 
    470 function changeVersionDate() {
    471   var date = $('#date-versions option:selected').val();
    472 
    473   $(".chart").hide();
    474   $(".chart."+date+"").show();
    475 }
    476 
    477 
    478 function changeScreensVersionDate() {
    479   var date = $('#date-screens option:selected').val();
    480 
    481   $(".screens-chart").hide();
    482   $(".screens-chart."+date+"").show();
    483 }
    484 
    485 </script>
    486