• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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
65Store app, which supports Android 2.2 and above, 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 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
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&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
115android:glEsVersion} attribute of the <a
116href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a>
117element. You can also use the <a
118href="{@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
120uses.</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>
155var 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
205var 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
239var 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
469function changeVersionDate() {
470  var date = $('#date-versions option:selected').val();
471
472  $(".chart").hide();
473  $(".chart."+date+"").show();
474}
475
476
477function changeScreensVersionDate() {
478  var date = $('#date-screens option:selected').val();
479
480  $(".screens-chart").hide();
481  $(".screens-chart."+date+"").show();
482}
483
484</script>
485