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