index.jd revision b0b84487c1e6d050d7f5ffe7964c57ef1db4f3b8
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 April 1, 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 April 1, 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>89.4%</td> 137</tr> 138<tr> 139<td>3.0</th> 140<td>10.5%</td> 141</tr> 142</table> 143 144 145 146<p style="clear:both"><em>Data collected during a 7-day period ending on April 1, 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&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A1.1%2C17.8%2C0.1%2C14.3%2C61.4%2C5.3&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat", 165 "data": [ 166 { 167 "api": 8, 168 "name": "Froyo", 169 "perc": "1.1" 170 }, 171 { 172 "api": 10, 173 "name": "Gingerbread", 174 "perc": "17.8" 175 }, 176 { 177 "api": 13, 178 "name": "Honeycomb", 179 "perc": "0.1" 180 }, 181 { 182 "api": 15, 183 "name": "Ice Cream Sandwich", 184 "perc": "14.3" 185 }, 186 { 187 "api": 16, 188 "name": "Jelly Bean", 189 "perc": "34.4" 190 }, 191 { 192 "api": 17, 193 "name": "Jelly Bean", 194 "perc": "18.1" 195 }, 196 { 197 "api": 18, 198 "name": "Jelly Bean", 199 "perc": "8.9" 200 }, 201 { 202 "api": 19, 203 "name": "KitKat", 204 "perc": "5.3" 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.7", 221 "mdpi": "4.4", 222 "tvdpi": "1.5", 223 "xhdpi": "0.6" 224 }, 225 "Normal": { 226 "hdpi": "33.7", 227 "mdpi": "13.2", 228 "xhdpi": "19.8", 229 "xxhdpi": "12.5" 230 }, 231 "Small": { 232 "ldpi": "8.1" 233 }, 234 "Xlarge": { 235 "hdpi": "0.3", 236 "ldpi": "0.1", 237 "mdpi": "4.2", 238 "xhdpi": "0.3" 239 } 240 }, 241 "densitychart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A8.9%2C21.8%2C1.5%2C34.6%2C20.7%2C12.6&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi", 242 "layoutchart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A4.9%2C7.8%2C79.3%2C8.1&chl=Xlarge%7CLarge%7CNormal%7CSmall" 243 } 244]; 245 246 247 248var VERSION_NAMES = 249[ 250 {"api":0},{"api":1},{"api":2},{"api":3}, 251 { 252 "api":4, 253 "link":"<a href='/about/versions/android-1.6.html'>1.6</a>", 254 "codename":"Donut", 255 }, 256 { "api":5}, 257 { "api":6}, 258 { 259 "api":7, 260 "link":"<a href='/about/versions/android-2.1.html'>2.1</a>", 261 "codename":"Eclair", 262 }, 263 { 264 "api":8, 265 "link":"<a href='/about/versions/android-2.2.html'>2.2</a>", 266 "codename":"Froyo" 267 }, 268 { 269 "api":9, 270 "link":"<a href='/about/versions/android-2.3.html'>2.3 -<br>2.3.2</a>", 271 "codename":"Gingerbread" 272 }, 273 { 274 "api":10, 275 "link":"<a href='/about/versions/android-2.3.3.html'>2.3.3 -<br>2.3.7</a>", 276 "codename":"Gingerbread" 277 }, 278 { "api":11}, 279 { 280 "api":12, 281 "link":"<a href='/about/versions/android-3.1.html'>3.1</a>", 282 "codename":"Honeycomb" 283 }, 284 { 285 "api":13, 286 "link":"<a href='/about/versions/android-3.2.html'>3.2</a>", 287 "codename":"Honeycomb" 288 }, 289 { "api":14}, 290 { 291 "api":15, 292 "link":"<a href='/about/versions/android-4.0.html'>4.0.3 -<br>4.0.4</a>", 293 "codename":"Ice Cream Sandwich" 294 }, 295 { 296 "api":16, 297 "link":"<a href='/about/versions/android-4.1.html'>4.1.x</a>", 298 "codename":"Jelly Bean" 299 }, 300 { 301 "api":17, 302 "link":"<a href='/about/versions/android-4.2.html'>4.2.x</a>", 303 "codename":"Jelly Bean" 304 }, 305 { 306 "api":18, 307 "link":"<a href='/about/versions/android-4.3.html'>4.3</a>", 308 "codename":"Jelly Bean" 309 }, 310 { 311 "api":19, 312 "link":"<a href='/about/versions/android-4.4.html'>4.4</a>", 313 "codename":"KitKat" 314 } 315]; 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335$(document).ready(function(){ 336 // for each set of data (each month) 337 $.each(VERSION_DATA, function(i, set) { 338 339 // set up wrapper divs 340 var $div = $('<div class="chart"' 341 + ((i == 0) ? ' style="display:block"' : '') 342 + ' >'); 343 var $divtable = $('<div class="col-5" style="margin-left:0">'); 344 var $divchart = $('<div class="col-8" style="margin-right:0">'); 345 346 // set up a new table 347 var $table = $("<table>"); 348 var $trh = $("<tr><th>Version</th>" 349 + "<th>Codename</th>" 350 + "<th>API</th>" 351 + "<th>Distribution</th></tr>"); 352 $table.append($trh); 353 354 // loop each data set (each api level represented in stats) 355 $.each(set.data, function(i, data) { 356 // check if we need to rowspan the codename 357 var rowspan = 1; 358 // must not be first row 359 if (i > 0) { 360 // if this row's codename is the same as previous row codename 361 if (data.name == set.data[i-1].name) { 362 rowspan = 0; 363 // otherwise, as long as this is not the last row 364 } else if (i < (set.data.length - 1)) { 365 // increment rowspan for each subsequent row w/ same codename 366 while (data.name == set.data[i+rowspan].name) { 367 rowspan++; 368 // unless we've reached the last row 369 if ((i + rowspan) >= set.data.length) break; 370 } 371 } 372 } 373 374 // create table row and get corresponding version info from VERSION_NAMES 375 var $tr = $("<tr>"); 376 $tr.append("<td>" + VERSION_NAMES[data.api].link + "</td>"); 377 if (rowspan > 0) { 378 $tr.append("<td rowspan='" + rowspan + "'>" + VERSION_NAMES[data.api].codename + "</td>"); 379 } 380 $tr.append("<td>" + data.api + "</td>"); 381 $tr.append("<td>" + data.perc + "%</td>"); 382 $table.append($tr); 383 }); 384 385 // create chart image 386 var $chart = $('<img style="margin-left:30px" alt="" src="' + set.chart + '" />'); 387 388 // stack up and insert the elements 389 $divtable.append($table); 390 $divchart.append($chart); 391 $div.append($divtable).append($divchart); 392 $("#version-chart").append($div); 393 }); 394 395 396 397 var SCREEN_SIZES = ["Small","Normal","Large","Xlarge"]; 398 var SCREEN_DENSITIES = ["ldpi","mdpi","tvdpi","hdpi","xhdpi","xxhdpi"]; 399 400 401 // for each set of screens data (each month) 402 $.each(SCREEN_DATA, function(i, set) { 403 404 // set up wrapper divs 405 var $div = $('<div class="screens-chart"' 406 + ((i == 0) ? ' style="display:block"' : '') 407 + ' >'); 408 409 // set up a new table 410 var $table = $("<table>"); 411 var $trh = $("<tr><th></th></tr>"); 412 $.each(SCREEN_DENSITIES, function(i, density) { 413 $trh.append("<th scope='col'>" + density + "</th>"); 414 }); 415 $trh.append("<th scope='col' class='total'>Total</th>"); 416 $table.append($trh); 417 418 // array to hold totals for each density 419 var densityTotals = new Array(SCREEN_DENSITIES.length); 420 $.each(densityTotals, function(i, total) { 421 densityTotals[i] = 0; // make them all zero to start 422 }); 423 424 // loop through each screen size 425 $.each(SCREEN_SIZES, function(i, size) { 426 // if there are any devices of this size 427 if (typeof set.data[size] != "undefined") { 428 // create table row and insert data 429 var $tr = $("<tr>"); 430 $tr.append("<th scope='row'>" + size + "</th>"); 431 // variable to sum all densities for this size 432 var total = 0; 433 // loop through each density 434 $.each(SCREEN_DENSITIES, function(i, density) { 435 var num = typeof set.data[size][density] != "undefined" ? set.data[size][density] : 0; 436 $tr.append("<td>" + (num != 0 ? num + "%" : "") + "</td>"); 437 total += parseFloat(num); 438 densityTotals[i] += parseFloat(num); 439 }) 440 $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>"); 441 $table.append($tr); 442 } 443 }); 444 445 // create row of totals for each density 446 var $tr = $("<tr><th class='total'>Total</th></tr>"); 447 $.each(densityTotals, function(i, total) { 448 $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>"); 449 }); 450 $table.append($tr); 451 452 // create charts 453 var $sizechart = $('<img style="float:left;width:380px" alt="" src="' 454 + set.layoutchart + '" />'); 455 var $densitychart = $('<img style="float:left;width:380px" alt="" src="' 456 + set.densitychart + '" />'); 457 458 // stack up and insert the elements 459 $div.append($table).append($sizechart).append($densitychart); 460 $("#screens-chart").append($div); 461 }); 462 463 464}); 465 466 467 468function changeVersionDate() { 469 var date = $('#date-versions option:selected').val(); 470 471 $(".chart").hide(); 472 $(".chart."+date+"").show(); 473} 474 475 476function changeScreensVersionDate() { 477 var date = $('#date-screens option:selected').val(); 478 479 $(".screens-chart").hide(); 480 $(".screens-chart."+date+"").show(); 481} 482 483</script> 484