1 page.title=Dashboards 2 @jd:body 3 4 <style> 5 div.chart, 6 div.screens-chart { 7 display:none; 8 } 9 tr .total { 10 background-color:transparent; 11 border:0; 12 color:#666; 13 } 14 tr 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 25 href="{@docRoot}distribute/googleplay/about/distribution.html#stats">detailed statistics</a> 26 about your users' devices. Those stats may help you prioritize the device profiles for which 27 you optimize your app.</p> 28 </div> 29 30 <p>This page provides information about the relative number of devices that share a certain 31 characteristic, such as Android version or screen size. This information may 32 help you prioritize efforts for <a 33 href="{@docRoot}training/basics/supporting-devices/index.html">supporting different devices</a> 34 by 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 37 with Android 2.2 and higher. Each snapshot of data represents all the devices that visited the 38 Google 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 43 2.2 do not appear in this data because those devices do not support the new Google Play Store 44 app. Only the new app is able to measure the number of devices that actively visit Google Play Store 45 and 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 52 the Android platform.</p> 53 54 <p>For information about how to target your application to devices based on 55 platform version, read <a 56 href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting Different 57 Platform 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 October 2, 2013. 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 69 Store app, which supports Android 2.2 and above, devices running older versions are not included. 70 However, 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 82 screen configuration, defined by a combination of screen size and density. To simplify the way that 83 you design your user interfaces for different screen configurations, Android divides the range of 84 actual 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 87 application, read <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple 88 Screens</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 October 2, 2013 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 108 version of OpenGL ES. Note that support for one particular version of OpenGL ES also implies 109 support for any lower version (for example, support for version 2.0 also implies support for 110 1.1).</p> 111 112 113 <img alt="" style="float:right" 114 src="//chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b,6fad0c&chl=GL%201.1%20only|GL%202.0%20%26%201.1&chd=t%3A0.2,99.8&chf=bg,s,00000000" /> 115 116 <p>To declare which version of OpenGL ES your application requires, you should use the {@code 117 android:glEsVersion} attribute of the <a 118 href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> 119 element. You can also use the <a 120 href="{@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 122 uses.</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.2%</td> 133 </tr> 134 <tr> 135 <td>2.0 & 1.1</th> 136 <td>99.8%</td> 137 </tr> 138 </table> 139 140 141 142 <p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013</em></p> 143 144 145 146 147 148 149 150 151 152 153 154 155 156 <script> 157 var VERSION_DATA = 158 [ 159 { 160 "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A2.2%2C28.5%2C0.1%2C20.6%2C48.6&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean", 161 "data": [ 162 { 163 "api": 8, 164 "name": "Froyo", 165 "perc": "2.2" 166 }, 167 { 168 "api": 10, 169 "name": "Gingerbread", 170 "perc": "28.5" 171 }, 172 { 173 "api": 13, 174 "name": "Honeycomb", 175 "perc": "0.1" 176 }, 177 { 178 "api": 15, 179 "name": "Ice Cream Sandwich", 180 "perc": "20.6" 181 }, 182 { 183 "api": 16, 184 "name": "Jelly Bean", 185 "perc": "36.5" 186 }, 187 { 188 "api": 17, 189 "name": "Jelly Bean", 190 "perc": "10.6" 191 }, 192 { 193 "api": 18, 194 "name": "Jelly Bean", 195 "perc": "1.5" 196 } 197 ] 198 } 199 ]; 200 201 202 203 204 205 var SCREEN_DATA = 206 [ 207 { 208 "data": { 209 "Large": { 210 "hdpi": "0.5", 211 "ldpi": "0.6", 212 "mdpi": "3.5", 213 "tvdpi": "1.2", 214 "xhdpi": "0.6" 215 }, 216 "Normal": { 217 "hdpi": "33.5", 218 "ldpi": "0.1", 219 "mdpi": "15.3", 220 "xhdpi": "22.8", 221 "xxhdpi": "7.7" 222 }, 223 "Small": { 224 "ldpi": "9.4" 225 }, 226 "Xlarge": { 227 "hdpi": "0.3", 228 "mdpi": "4.4", 229 "xhdpi": "0.1" 230 } 231 }, 232 "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A10.1%2C23.3%2C1.2%2C34.3%2C23.5%2C7.7&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi", 233 "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A4.8%2C6.4%2C79.5%2C9.4&chl=Xlarge%7CLarge%7CNormal%7CSmall" 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 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 $(document).ready(function(){ 322 // for each set of data (each month) 323 $.each(VERSION_DATA, function(i, set) { 324 325 // set up wrapper divs 326 var $div = $('<div class="chart"' 327 + ((i == 0) ? ' style="display:block"' : '') 328 + ' >'); 329 var $divtable = $('<div class="col-5" style="margin-left:0">'); 330 var $divchart = $('<div class="col-8" style="margin-right:0">'); 331 332 // set up a new table 333 var $table = $("<table>"); 334 var $trh = $("<tr><th>Version</th>" 335 + "<th>Codename</th>" 336 + "<th>API</th>" 337 + "<th>Distribution</th></tr>"); 338 $table.append($trh); 339 340 // loop each data set (each api level represented in stats) 341 $.each(set.data, function(i, data) { 342 // check if we need to rowspan the codename 343 var rowspan = 1; 344 // must not be first row 345 if (i > 0) { 346 // if this row's codename is the same as previous row codename 347 if (data.name == set.data[i-1].name) { 348 rowspan = 0; 349 // otherwise, as long as this is not the last row 350 } else if (i < (set.data.length - 1)) { 351 // increment rowspan for each subsequent row w/ same codename 352 while (data.name == set.data[i+rowspan].name) { 353 rowspan++; 354 // unless we've reached the last row 355 if ((i + rowspan) >= set.data.length) break; 356 } 357 } 358 } 359 360 // create table row and get corresponding version info from VERSION_NAMES 361 var $tr = $("<tr>"); 362 $tr.append("<td>" + VERSION_NAMES[data.api].link + "</td>"); 363 if (rowspan > 0) { 364 $tr.append("<td rowspan='" + rowspan + "'>" + VERSION_NAMES[data.api].codename + "</td>"); 365 } 366 $tr.append("<td>" + data.api + "</td>"); 367 $tr.append("<td>" + data.perc + "%</td>"); 368 $table.append($tr); 369 }); 370 371 // create chart image 372 var $chart = $('<img style="margin-left:30px" alt="" src="' + set.chart + '" />'); 373 374 // stack up and insert the elements 375 $divtable.append($table); 376 $divchart.append($chart); 377 $div.append($divtable).append($divchart); 378 $("#version-chart").append($div); 379 }); 380 381 382 383 var SCREEN_SIZES = ["Small","Normal","Large","Xlarge"]; 384 var SCREEN_DENSITIES = ["ldpi","mdpi","tvdpi","hdpi","xhdpi","xxhdpi"]; 385 386 387 // for each set of screens data (each month) 388 $.each(SCREEN_DATA, function(i, set) { 389 390 // set up wrapper divs 391 var $div = $('<div class="screens-chart"' 392 + ((i == 0) ? ' style="display:block"' : '') 393 + ' >'); 394 395 // set up a new table 396 var $table = $("<table>"); 397 var $trh = $("<tr><th></th></tr>"); 398 $.each(SCREEN_DENSITIES, function(i, density) { 399 $trh.append("<th scope='col'>" + density + "</th>"); 400 }); 401 $trh.append("<th scope='col' class='total'>Total</th>"); 402 $table.append($trh); 403 404 // array to hold totals for each density 405 var densityTotals = new Array(SCREEN_DENSITIES.length); 406 $.each(densityTotals, function(i, total) { 407 densityTotals[i] = 0; // make them all zero to start 408 }); 409 410 // loop through each screen size 411 $.each(SCREEN_SIZES, function(i, size) { 412 // if there are any devices of this size 413 if (typeof set.data[size] != "undefined") { 414 // create table row and insert data 415 var $tr = $("<tr>"); 416 $tr.append("<th scope='row'>" + size + "</th>"); 417 // variable to sum all densities for this size 418 var total = 0; 419 // loop through each density 420 $.each(SCREEN_DENSITIES, function(i, density) { 421 var num = typeof set.data[size][density] != "undefined" ? set.data[size][density] : 0; 422 $tr.append("<td>" + (num != 0 ? num + "%" : "") + "</td>"); 423 total += parseFloat(num); 424 densityTotals[i] += parseFloat(num); 425 }) 426 $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>"); 427 $table.append($tr); 428 } 429 }); 430 431 // create row of totals for each density 432 var $tr = $("<tr><th class='total'>Total</th></tr>"); 433 $.each(densityTotals, function(i, total) { 434 $tr.append("<td class='total'>" + total.toFixed(1) + "%</td>"); 435 }); 436 $table.append($tr); 437 438 // create charts 439 var $sizechart = $('<img style="float:left;width:380px" alt="" src="' 440 + set.layoutchart + '" />'); 441 var $densitychart = $('<img style="float:left;width:380px" alt="" src="' 442 + set.densitychart + '" />'); 443 444 // stack up and insert the elements 445 $div.append($table).append($sizechart).append($densitychart); 446 $("#screens-chart").append($div); 447 }); 448 449 450 }); 451 452 453 454 function changeVersionDate() { 455 var date = $('#date-versions option:selected').val(); 456 457 $(".chart").hide(); 458 $(".chart."+date+"").show(); 459 } 460 461 462 function changeScreensVersionDate() { 463 var date = $('#date-screens option:selected').val(); 464 465 $(".screens-chart").hide(); 466 $(".screens-chart."+date+"").show(); 467 } 468 469 </script> 470