index.jd revision 749120f39bdac49a96771d06d25b7f9edf70be67
1page.title=Dashboards 2@jd:body 3 4<style> 5div.chart, 6div.screens-chart { 7 display:none; 8} 9tr .total { 10 background-color:transparent; 11 border:0; 12 color:#666; 13} 14tr th.total { 15 font-weight:bold; 16} 17</style> 18 19 20 21 22<div class="sidebox"> 23<h2>Google Play Install Stats</h2> 24<p>The Google Play Developer Console also provides <a 25href="{@docRoot}distribute/googleplay/about/distribution.html#stats">detailed statistics</a> 26about your users' devices. Those stats may help you prioritize the device profiles for which 27you optimize your app.</p> 28</div> 29 30<p>This page provides information about the relative number of devices that share a certain 31characteristic, such as Android version or screen size. This information may 32help you prioritize efforts for <a 33href="{@docRoot}training/basics/supporting-devices/index.html">supporting different devices</a> 34by revealing which devices are active in the Android and Google Play ecosystem.</p> 35 36<p>This data reflects devices running the latest Google Play Store app, which is compatible 37with Android 2.2 and higher. Each snapshot of data represents all the devices that visited the 38Google Play Store in the prior 7 days.</p> 39 40 41<div class="note"> 42<p><strong>Note:</strong> Beginning in September, 2013, devices running versions older than Android 432.2 do not appear in this data because those devices do not support the new Google Play Store 44app. Only the new app is able to measure the number of devices that actively visit Google Play Store 45and we believe this measurement best reflects your potential user-base.</p> 46</div> 47 48 49<h2 id="Platform">Platform Versions</h2> 50 51<p>This section provides data about the relative number of devices running a given version of 52the Android platform.</p> 53 54<p>For information about how to target your application to devices based on 55platform version, read <a 56href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different 57Platform Versions</a>.</p> 58 59 60<div id="version-chart"> 61</div> 62 63 64<p style="clear:both"><em>Data collected during a 7-day period ending on February 4, 2014. 65<br/>Any versions with less than 0.1% distribution are not shown.</em> 66</p> 67 68<p class="note"><strong>Note:</strong> Because this data is gathered from the new Google Play 69Store app, which supports Android 2.2 and above, devices running older versions are not included. 70However, in August, 2013, versions older than Android 2.2 accounted for about 1% of devices that 71<em>checked in</em> to Google servers (not those that actually visited Google Play Store). 72</p> 73 74 75 76 77 78<h2 id="Screens">Screen Sizes and Densities</h2> 79 80 81<p>This section provides data about the relative number of devices that have a particular 82screen configuration, defined by a combination of screen size and density. To simplify the way that 83you design your user interfaces for different screen configurations, Android divides the range of 84actual screen sizes and densities into several buckets as expressed by the table below.</p> 85 86<p>For information about how you can support multiple screen configurations in your 87application, read <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple 88Screens</a>.</p> 89 90 91<div id="screens-chart"> 92</div> 93 94 95<p style="clear:both"><em>Data collected during a 7-day period ending on February 4, 2014. 96<br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p> 97 98 99 100 101 102 103 104 105<h2 id="OpenGL">Open GL Version</h2> 106 107<p>This section provides data about the relative number of devices that support a particular 108version of OpenGL ES. Note that support for one particular version of OpenGL ES also implies 109support for any lower version (for example, support for version 2.0 also implies support for 1101.1).</p> 111 112 113<img alt="" style="float:right" 114src="//chart.googleapis.com/chart?chl=GL%201.1%20only%7CGL%202.0%7CGL%203.0&chf=bg%2Cs%2C00000000&chd=t%3A0.1%2C93.5%2C6.4&chco=c4df9b%2C6fad0c&chs=400x250&cht=p" /> 115 116<p>To declare which version of OpenGL ES your application requires, you should use the {@code 117android:glEsVersion} attribute of the <a 118href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> 119element. You can also use the <a 120href="{@docRoot}guide/topics/manifest/supports-gl-texture-element.html">{@code 121<supports-gl-texture>}</a> element to declare the GL compression formats that your application 122uses.</p> 123 124 125<table style="width:350px"> 126<tr> 127<th scope="col">OpenGL ES Version</th> 128<th scope="col">Distribution</th> 129</tr> 130<tr> 131<td>1.1 only</th> 132<td>0.1%</td> 133</tr> 134<tr> 135<td>2.0</th> 136<td>92.3%</td> 137</tr> 138<tr> 139<td>3.0</th> 140<td>7.6%</td> 141</tr> 142</table> 143 144 145 146<p style="clear:both"><em>Data collected during a 7-day period ending on February 4, 2014</em></p> 147 148 149 150 151 152 153 154 155 156 157 158 159 160<script> 161var VERSION_DATA = 162[ 163 { 164 "chart": "//chart.googleapis.com/chart?cht=p&chs=500x250&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chf=bg%2Cs%2C00000000&chd=t%3A1.3%2C20.0%2C0.1%2C16.1%2C60.7%2C1.8&chco=c4df9b%2C6fad0c", 165 "data": [ 166 { 167 "api": 8, 168 "name": "Froyo", 169 "perc": "1.3" 170 }, 171 { 172 "api": 10, 173 "name": "Gingerbread", 174 "perc": "20.0" 175 }, 176 { 177 "api": 13, 178 "name": "Honeycomb", 179 "perc": "0.1" 180 }, 181 { 182 "api": 15, 183 "name": "Ice Cream Sandwich", 184 "perc": "16.1" 185 }, 186 { 187 "api": 16, 188 "name": "Jelly Bean", 189 "perc": "35.5" 190 }, 191 { 192 "api": 17, 193 "name": "Jelly Bean", 194 "perc": "16.3" 195 }, 196 { 197 "api": 18, 198 "name": "Jelly Bean", 199 "perc": "8.9" 200 }, 201 { 202 "api": 19, 203 "name": "KitKat", 204 "perc": "1.8" 205 } 206 ] 207 } 208]; 209 210 211 212 213 214var SCREEN_DATA = 215[ 216 { 217 "data": { 218 "Large": { 219 "hdpi": "0.6", 220 "ldpi": "0.8", 221 "mdpi": "4.4", 222 "tvdpi": "1.6", 223 "xhdpi": "0.6" 224 }, 225 "Normal": { 226 "hdpi": "33.3", 227 "ldpi": "0.1", 228 "mdpi": "13.9", 229 "xhdpi": "20.2", 230 "xxhdpi": "11.3" 231 }, 232 "Small": { 233 "ldpi": "8.1" 234 }, 235 "Xlarge": { 236 "hdpi": "0.3", 237 "ldpi": "0.1", 238 "mdpi": "4.5", 239 "xhdpi": "0.2" 240 } 241 }, 242 "densitychart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chf=bg%2Cs%2C00000000&chd=t%3A9.1%2C22.8%2C1.6%2C34.3%2C21.0%2C11.3&chco=c4df9b%2C6fad0c", 243 "layoutchart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chl=Xlarge%7CLarge%7CNormal%7CSmall&chf=bg%2Cs%2C00000000&chd=t%3A5.1%2C8.0%2C78.9%2C8.1&chco=c4df9b%2C6fad0c" 244 } 245]; 246 247 248 249var VERSION_NAMES = 250[ 251 {"api":0},{"api":1},{"api":2},{"api":3}, 252 { 253 "api":4, 254 "link":"<a href='/about/versions/android-1.6.html'>1.6</a>", 255 "codename":"Donut", 256 }, 257 { "api":5}, 258 { "api":6}, 259 { 260 "api":7, 261 "link":"<a href='/about/versions/android-2.1.html'>2.1</a>", 262 "codename":"Eclair", 263 }, 264 { 265 "api":8, 266 "link":"<a href='/about/versions/android-2.2.html'>2.2</a>", 267 "codename":"Froyo" 268 }, 269 { 270 "api":9, 271 "link":"<a href='/about/versions/android-2.3.html'>2.3 -<br>2.3.2</a>", 272 "codename":"Gingerbread" 273 }, 274 { 275 "api":10, 276 "link":"<a href='/about/versions/android-2.3.3.html'>2.3.3 -<br>2.3.7</a>", 277 "codename":"Gingerbread" 278 }, 279 { "api":11}, 280 { 281 "api":12, 282 "link":"<a href='/about/versions/android-3.1.html'>3.1</a>", 283 "codename":"Honeycomb" 284 }, 285 { 286 "api":13, 287 "link":"<a href='/about/versions/android-3.2.html'>3.2</a>", 288 "codename":"Honeycomb" 289 }, 290 { "api":14}, 291 { 292 "api":15, 293 "link":"<a href='/about/versions/android-4.0.html'>4.0.3 -<br>4.0.4</a>", 294 "codename":"Ice Cream Sandwich" 295 }, 296 { 297 "api":16, 298 "link":"<a href='/about/versions/android-4.1.html'>4.1.x</a>", 299 "codename":"Jelly Bean" 300 }, 301 { 302 "api":17, 303 "link":"<a href='/about/versions/android-4.2.html'>4.2.x</a>", 304 "codename":"Jelly Bean" 305 }, 306 { 307 "api":18, 308 "link":"<a href='/about/versions/android-4.3.html'>4.3</a>", 309 "codename":"Jelly Bean" 310 }, 311 { 312 "api":19, 313 "link":"<a href='/about/versions/android-4.4.html'>4.4</a>", 314 "codename":"KitKat" 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 469function changeVersionDate() { 470 var date = $('#date-versions option:selected').val(); 471 472 $(".chart").hide(); 473 $(".chart."+date+"").show(); 474} 475 476 477function changeScreensVersionDate() { 478 var date = $('#date-screens option:selected').val(); 479 480 $(".screens-chart").hide(); 481 $(".screens-chart."+date+"").show(); 482} 483 484</script> 485