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