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