1page.title=Dashboards
2page.metaDescription=An overview of device characteristics and platform versions that are active in the Android ecosystem.
3page.tags="android, dashboard, platforms, versions"
4meta.tags="ecosystem, versions, whatsnew, dashboards"
5page.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>
10div.chart,
11div.screens-chart {
12  display:none;
13}
14tr .total {
15  background-color:transparent;
16  border:0;
17  color:#666;
18}
19tr 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
30href="{@docRoot}distribute/googleplay/developer-console.html#app-stats">detailed statistics</a>
31about your users' devices. Those stats may help you prioritize the device profiles for which
32you optimize your app.</p>
33</div>
34
35<p>This page provides information about the relative number of devices that share a certain
36characteristic, such as Android version or screen size. This information may
37help you prioritize efforts for <a
38href="{@docRoot}training/basics/supporting-devices/index.html">supporting different devices</a>
39by 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
42with Android 2.2 and higher. Each snapshot of data represents all the devices that visited the
43Google 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
50the Android platform.</p>
51
52<p>For information about how to target your application to devices based on
53platform version, read <a
54href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different
55Platform 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
71screen configuration, defined by a combination of screen size and density. To simplify the way that
72you design your user interfaces for different screen configurations, Android divides the range of
73actual 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
76application, read <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple
77Screens</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
98version of OpenGL ES. Note that support for one particular version of OpenGL ES also implies
99support for any lower version (for example, support for version 2.0 also implies support for
1001.1).</p>
101
102
103<img alt="" style="float:right"
104src="//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
107android:glEsVersion} attribute of the <a
108href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a>
109element. You can also use the <a
110href="{@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
112uses.</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>
143var 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
176var 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
236var 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
470function changeVersionDate() {
471  var date = $('#date-versions option:selected').val();
472
473  $(".chart").hide();
474  $(".chart."+date+"").show();
475}
476
477
478function changeScreensVersionDate() {
479  var date = $('#date-screens option:selected').val();
480
481  $(".screens-chart").hide();
482  $(".screens-chart."+date+"").show();
483}
484
485</script>
486