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