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