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