blob: 063084df74771d38b8b364b622c2ff03401d16ca [file] [log] [blame]
Scott Main50e990c2012-06-21 17:14:39 -07001page.title=Dashboards
Dirk Dougherty3506ac82014-02-21 11:15:52 -08002page.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"
Scott Main50e990c2012-06-21 17:14:39 -07005@jd:body
6
Scott Main3cd0b462013-02-27 17:51:49 -08007<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
Dirk Dougherty3506ac82014-02-21 11:15:52 -080028href="{@docRoot}distribute/googleplay/developer-console.html#app-stats">detailed statistics</a>
Scott Main3cd0b462013-02-27 17:51:49 -080029about 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
Scott Main847480c2013-09-03 18:01:31 -070036href="{@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>
Scott Main3cd0b462013-02-27 17:51:49 -080038
Scott Main847480c2013-09-03 18:01:31 -070039<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>
Scott Main3cd0b462013-02-27 17:51:49 -080042
Scott Main847480c2013-09-03 18:01:31 -070043
Scott Main50e990c2012-06-21 17:14:39 -070044
45<h2 id="Platform">Platform Versions</h2>
46
Scott Main3cd0b462013-02-27 17:51:49 -080047<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
Scott Mainbf03f392013-08-01 15:23:19 -070051platform version, read <a
Scott Main3cd0b462013-02-27 17:51:49 -080052href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different
53Platform Versions</a>.</p>
Scott Main50e990c2012-06-21 17:14:39 -070054
55
Scott Main3cd0b462013-02-27 17:51:49 -080056<div id="version-chart">
Scott Main50e990c2012-06-21 17:14:39 -070057</div>
58
Scott Main50e990c2012-06-21 17:14:39 -070059
Joe Fernandez1f5acf82014-12-01 10:25:01 -080060<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014.
Scott Main3cd0b462013-02-27 17:51:49 -080061<br/>Any versions with less than 0.1% distribution are not shown.</em>
62</p>
Scott Main50e990c2012-06-21 17:14:39 -070063
Scott Main847480c2013-09-03 18:01:31 -070064<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>
Scott Main50e990c2012-06-21 17:14:39 -070069
70
71
72
73
74<h2 id="Screens">Screen Sizes and Densities</h2>
75
Scott Maind46023d2012-09-04 20:55:57 -070076
Scott Main3cd0b462013-02-27 17:51:49 -080077<p>This section provides data about the relative number of devices that have a particular
Scott Main50e990c2012-06-21 17:14:39 -070078screen 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
Scott Main3cd0b462013-02-27 17:51:49 -080080actual screen sizes and densities into several buckets as expressed by the table below.</p>
Scott Main50e990c2012-06-21 17:14:39 -070081
82<p>For information about how you can support multiple screen configurations in your
Scott Main3cd0b462013-02-27 17:51:49 -080083application, read <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple
Scott Main50e990c2012-06-21 17:14:39 -070084Screens</a>.</p>
85
Scott Main3cd0b462013-02-27 17:51:49 -080086
87<div id="screens-chart">
88</div>
Scott Main50e990c2012-06-21 17:14:39 -070089
90
Joe Fernandez1f5acf82014-12-01 10:25:01 -080091<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014.
Robert Ly52a18162014-09-09 15:40:50 -070092
Scott Main3cd0b462013-02-27 17:51:49 -080093<br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
Scott Main50e990c2012-06-21 17:14:39 -070094
95
96
97
98
99
100
101
102<h2 id="OpenGL">Open GL Version</h2>
103
Scott Main3cd0b462013-02-27 17:51:49 -0800104<p>This section provides data about the relative number of devices that support a particular
Scott Main50e990c2012-06-21 17:14:39 -0700105version 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
Scott Maind46023d2012-09-04 20:55:57 -0700109
110<img alt="" style="float:right"
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800111src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0&chf=bg%2Cs%2C00000000&chd=t%3A72.2%2C27.8&chco=c4df9b%2C6fad0c&cht=p&chs=400x250" />
112
Scott Maind46023d2012-09-04 20:55:57 -0700113
Scott Main50e990c2012-06-21 17:14:39 -0700114<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
Scott Main50e990c2012-06-21 17:14:39 -0700122
Scott Maind46023d2012-09-04 20:55:57 -0700123<table style="width:350px">
Scott Main50e990c2012-06-21 17:14:39 -0700124<tr>
125<th scope="col">OpenGL ES Version</th>
126<th scope="col">Distribution</th>
127</tr>
128<tr>
Robert Ly52a18162014-09-09 15:40:50 -0700129<td>2.0</td>
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800130<td>72.2%</td>
Scott Main50e990c2012-06-21 17:14:39 -0700131</tr>
132<tr>
Robert Ly52a18162014-09-09 15:40:50 -0700133<td>3.0</td>
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800134<td>27.8%</td>
Scott Main50e990c2012-06-21 17:14:39 -0700135</tr>
136</table>
Scott Main50e990c2012-06-21 17:14:39 -0700137
138
Scott Maind46023d2012-09-04 20:55:57 -0700139
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800140<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014</em></p>
Scott Main3cd0b462013-02-27 17:51:49 -0800141
142
143
144
145
146
147
148
149
150
151
152
153
154<script>
155var VERSION_DATA =
156[
157 {
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800158 "chart": "//chart.googleapis.com/chart?chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chf=bg%2Cs%2C00000000&chd=t%3A0.5%2C9.1%2C7.8%2C48.7%2C33.9&chco=c4df9b%2C6fad0c&cht=p&chs=500x250",
Scott Main3cd0b462013-02-27 17:51:49 -0800159 "data": [
160 {
Scott Main3cd0b462013-02-27 17:51:49 -0800161 "api": 8,
162 "name": "Froyo",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800163 "perc": "0.5"
Scott Main3cd0b462013-02-27 17:51:49 -0800164 },
165 {
166 "api": 10,
167 "name": "Gingerbread",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800168 "perc": "9.1"
Scott Main3cd0b462013-02-27 17:51:49 -0800169 },
170 {
171 "api": 15,
172 "name": "Ice Cream Sandwich",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800173 "perc": "7.8"
Scott Main3cd0b462013-02-27 17:51:49 -0800174 },
175 {
176 "api": 16,
177 "name": "Jelly Bean",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800178 "perc": "21.3"
Scott Main3cd0b462013-02-27 17:51:49 -0800179 },
180 {
181 "api": 17,
182 "name": "Jelly Bean",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800183 "perc": "20.4"
Scott Mainf5468f62013-10-02 16:21:42 -0700184 },
185 {
186 "api": 18,
187 "name": "Jelly Bean",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800188 "perc": "7.0"
Scott Main65907fd2013-12-02 11:38:42 -0800189 },
190 {
191 "api": 19,
192 "name": "KitKat",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800193 "perc": "33.9"
Scott Main3cd0b462013-02-27 17:51:49 -0800194 }
195 ]
196 }
197];
198
199
Scott Main3cd0b462013-02-27 17:51:49 -0800200var SCREEN_DATA =
201[
202 {
203 "data": {
204 "Large": {
Dirk Doughertyccc5ca12014-01-08 15:52:27 -0800205 "hdpi": "0.6",
Robert Lyba5c49dcd2014-08-12 12:26:37 -0700206 "ldpi": "0.5",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800207 "mdpi": "4.6",
208 "tvdpi": "2.0",
Robert Ly52a18162014-09-09 15:40:50 -0700209 "xhdpi": "0.6"
Scott Main3cd0b462013-02-27 17:51:49 -0800210 },
211 "Normal": {
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800212 "hdpi": "36.9",
213 "mdpi": "9.4",
214 "tvdpi": "0.2",
215 "xhdpi": "18.8",
216 "xxhdpi": "16.3"
Scott Main3cd0b462013-02-27 17:51:49 -0800217 },
218 "Small": {
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800219 "ldpi": "5.4"
Scott Main3cd0b462013-02-27 17:51:49 -0800220 },
221 "Xlarge": {
Scott Main749120f2014-02-04 10:57:47 -0800222 "hdpi": "0.3",
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800223 "mdpi": "3.8",
224 "xhdpi": "0.6"
Scott Main3cd0b462013-02-27 17:51:49 -0800225 }
226 },
Joe Fernandez1f5acf82014-12-01 10:25:01 -0800227 "densitychart": "//chart.googleapis.com/chart?chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chf=bg%2Cs%2C00000000&chd=t%3A5.9%2C17.8%2C2.2%2C37.8%2C20.0%2C16.3&chco=c4df9b%2C6fad0c&cht=p&chs=400x250",
228 "layoutchart": "//chart.googleapis.com/chart?chl=Xlarge%7CLarge%7CNormal%7CSmall&chf=bg%2Cs%2C00000000&chd=t%3A4.7%2C8.3%2C81.6%2C5.4&chco=c4df9b%2C6fad0c&cht=p&chs=400x250"
Scott Main3cd0b462013-02-27 17:51:49 -0800229 }
230];
231
232
233
234var VERSION_NAMES =
235[
236 {"api":0},{"api":1},{"api":2},{"api":3},
Scott Mainbf03f392013-08-01 15:23:19 -0700237 {
Scott Main3cd0b462013-02-27 17:51:49 -0800238 "api":4,
239 "link":"<a href='/about/versions/android-1.6.html'>1.6</a>",
240 "codename":"Donut",
241 },
242 { "api":5},
243 { "api":6},
Scott Mainbf03f392013-08-01 15:23:19 -0700244 {
Scott Main3cd0b462013-02-27 17:51:49 -0800245 "api":7,
246 "link":"<a href='/about/versions/android-2.1.html'>2.1</a>",
247 "codename":"Eclair",
248 },
249 {
250 "api":8,
251 "link":"<a href='/about/versions/android-2.2.html'>2.2</a>",
252 "codename":"Froyo"
253 },
254 {
255 "api":9,
256 "link":"<a href='/about/versions/android-2.3.html'>2.3 -<br>2.3.2</a>",
257 "codename":"Gingerbread"
258 },
259 {
260 "api":10,
261 "link":"<a href='/about/versions/android-2.3.3.html'>2.3.3 -<br>2.3.7</a>",
262 "codename":"Gingerbread"
263 },
264 { "api":11},
265 {
266 "api":12,
267 "link":"<a href='/about/versions/android-3.1.html'>3.1</a>",
268 "codename":"Honeycomb"
269 },
270 {
271 "api":13,
272 "link":"<a href='/about/versions/android-3.2.html'>3.2</a>",
273 "codename":"Honeycomb"
274 },
275 { "api":14},
276 {
277 "api":15,
278 "link":"<a href='/about/versions/android-4.0.html'>4.0.3 -<br>4.0.4</a>",
279 "codename":"Ice Cream Sandwich"
280 },
281 {
282 "api":16,
283 "link":"<a href='/about/versions/android-4.1.html'>4.1.x</a>",
284 "codename":"Jelly Bean"
285 },
286 {
287 "api":17,
288 "link":"<a href='/about/versions/android-4.2.html'>4.2.x</a>",
289 "codename":"Jelly Bean"
Scott Main847480c2013-09-03 18:01:31 -0700290 },
291 {
292 "api":18,
293 "link":"<a href='/about/versions/android-4.3.html'>4.3</a>",
294 "codename":"Jelly Bean"
Scott Main65907fd2013-12-02 11:38:42 -0800295 },
296 {
297 "api":19,
298 "link":"<a href='/about/versions/android-4.4.html'>4.4</a>",
299 "codename":"KitKat"
Joe Fernandez9dc852a2014-10-30 10:57:31 -0700300 },
301 {
302 "api":20,
303 "link":"<a href='/about/versions/android-4.4.html'>4.4W</a>",
304 "codename":"KitKat for Wear"
305 },
306 {
307 "api":21,
308 "link":"<a href='/about/versions/android-5.0.html'>4.4</a>",
309 "codename":"Lollipop"
Scott Main3cd0b462013-02-27 17:51:49 -0800310 }
311];
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331$(document).ready(function(){
332 // for each set of data (each month)
333 $.each(VERSION_DATA, function(i, set) {
334
335 // set up wrapper divs
336 var $div = $('<div class="chart"'
337 + ((i == 0) ? ' style="display:block"' : '')
338 + ' >');
339 var $divtable = $('<div class="col-5" style="margin-left:0">');
340 var $divchart = $('<div class="col-8" style="margin-right:0">');
341
342 // set up a new table
343 var $table = $("<table>");
344 var $trh = $("<tr><th>Version</th>"
345 + "<th>Codename</th>"
346 + "<th>API</th>"
347 + "<th>Distribution</th></tr>");
348 $table.append($trh);
349
350 // loop each data set (each api level represented in stats)
351 $.each(set.data, function(i, data) {
352 // check if we need to rowspan the codename
353 var rowspan = 1;
354 // must not be first row
355 if (i > 0) {
356 // if this row's codename is the same as previous row codename
357 if (data.name == set.data[i-1].name) {
358 rowspan = 0;
359 // otherwise, as long as this is not the last row
360 } else if (i < (set.data.length - 1)) {
361 // increment rowspan for each subsequent row w/ same codename
362 while (data.name == set.data[i+rowspan].name) {
363 rowspan++;
364 // unless we've reached the last row
365 if ((i + rowspan) >= set.data.length) break;
366 }
367 }
368 }
369
370 // create table row and get corresponding version info from VERSION_NAMES
371 var $tr = $("<tr>");
372 $tr.append("<td>" + VERSION_NAMES[data.api].link + "</td>");
373 if (rowspan > 0) {
374 $tr.append("<td rowspan='" + rowspan + "'>" + VERSION_NAMES[data.api].codename + "</td>");
375 }
376 $tr.append("<td>" + data.api + "</td>");
377 $tr.append("<td>" + data.perc + "%</td>");
378 $table.append($tr);
379 });
380
381 // create chart image
382 var $chart = $('<img style="margin-left:30px" alt="" src="' + set.chart + '" />');
383
384 // stack up and insert the elements
385 $divtable.append($table);
386 $divchart.append($chart);
387 $div.append($divtable).append($divchart);
388 $("#version-chart").append($div);
389 });
390
391
392
393 var SCREEN_SIZES = ["Small","Normal","Large","Xlarge"];
394 var SCREEN_DENSITIES = ["ldpi","mdpi","tvdpi","hdpi","xhdpi","xxhdpi"];
395
396
397 // for each set of screens data (each month)
398 $.each(SCREEN_DATA, function(i, set) {
399
400 // set up wrapper divs
401 var $div = $('<div class="screens-chart"'
402 + ((i == 0) ? ' style="display:block"' : '')
403 + ' >');
404
405 // set up a new table
406 var $table = $("<table>");
407 var $trh = $("<tr><th></th></tr>");
408 $.each(SCREEN_DENSITIES, function(i, density) {
409 $trh.append("<th scope='col'>" + density + "</th>");
410 });
411 $trh.append("<th scope='col' class='total'>Total</th>");
412 $table.append($trh);
413
414 // array to hold totals for each density
415 var densityTotals = new Array(SCREEN_DENSITIES.length);
416 $.each(densityTotals, function(i, total) {
417 densityTotals[i] = 0; // make them all zero to start
418 });
419
420 // loop through each screen size
421 $.each(SCREEN_SIZES, function(i, size) {
422 // if there are any devices of this size
423 if (typeof set.data[size] != "undefined") {
424 // create table row and insert data
425 var $tr = $("<tr>");
426 $tr.append("<th scope='row'>" + size + "</th>");
427 // variable to sum all densities for this size
428 var total = 0;
429 // loop through each density
430 $.each(SCREEN_DENSITIES, function(i, density) {
431 var num = typeof set.data[size][density] != "undefined" ? set.data[size][density] : 0;
432 $tr.append("<td>" + (num != 0 ? num + "%" : "") + "</td>");
433 total += parseFloat(num);
434 densityTotals[i] += parseFloat(num);
435 })
436 $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>");
437 $table.append($tr);
438 }
439 });
440
441 // create row of totals for each density
442 var $tr = $("<tr><th class='total'>Total</th></tr>");
443 $.each(densityTotals, function(i, total) {
444 $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>");
445 });
446 $table.append($tr);
447
448 // create charts
449 var $sizechart = $('<img style="float:left;width:380px" alt="" src="'
450 + set.layoutchart + '" />');
451 var $densitychart = $('<img style="float:left;width:380px" alt="" src="'
452 + set.densitychart + '" />');
453
454 // stack up and insert the elements
455 $div.append($table).append($sizechart).append($densitychart);
456 $("#screens-chart").append($div);
457 });
458
459
460});
461
462
463
464function changeVersionDate() {
465 var date = $('#date-versions option:selected').val();
466
467 $(".chart").hide();
468 $(".chart."+date+"").show();
469}
470
471
472function changeScreensVersionDate() {
473 var date = $('#date-screens option:selected').val();
474
475 $(".screens-chart").hide();
476 $(".screens-chart."+date+"").show();
477}
478
479</script>