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