1 page.title=Dashboards 2 page.metaDescription=An overview of device characteristics and platform versions that are active in the Android ecosystem. 3 page.tags="android, dashboard, platforms, versions" 4 meta.tags="ecosystem, versions, whatsnew, dashboards" 5 page.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> 10 div.chart, 11 div.screens-chart { 12 display:none; 13 } 14 tr .total { 15 background-color:transparent; 16 border:0; 17 color:#666; 18 } 19 tr 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 30 href="{@docRoot}distribute/googleplay/developer-console.html#app-stats">detailed statistics</a> 31 about your users' devices. Those stats may help you prioritize the device profiles for which 32 you optimize your app.</p> 33 </div> 34 35 <p>This page provides information about the relative number of devices that share a certain 36 characteristic, such as Android version or screen size. This information may 37 help you prioritize efforts for <a 38 href="{@docRoot}training/basics/supporting-devices/index.html">supporting different devices</a> 39 by 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 42 with Android 2.2 and higher. Each snapshot of data represents all the devices that visited the 43 Google 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 50 the Android platform.</p> 51 52 <p>For information about how to target your application to devices based on 53 platform version, read <a 54 href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different 55 Platform 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 71 screen configuration, defined by a combination of screen size and density. To simplify the way that 72 you design your user interfaces for different screen configurations, Android divides the range of 73 actual 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 76 application, read <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple 77 Screens</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 98 version of OpenGL ES. Note that support for one particular version of OpenGL ES also implies 99 support for any lower version (for example, support for version 2.0 also implies support for 100 1.1).</p> 101 102 103 <img alt="" style="float:right" 104 src="//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 107 android:glEsVersion} attribute of the <a 108 href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> 109 element. You can also use the <a 110 href="{@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 112 uses.</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> 143 var 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 176 var 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 236 var 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 470 function changeVersionDate() { 471 var date = $('#date-versions option:selected').val(); 472 473 $(".chart").hide(); 474 $(".chart."+date+"").show(); 475 } 476 477 478 function changeScreensVersionDate() { 479 var date = $('#date-screens option:selected').val(); 480 481 $(".screens-chart").hide(); 482 $(".screens-chart."+date+"").show(); 483 } 484 485 </script> 486