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