1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os; 18 19 import com.android.internal.telephony.TelephonyProperties; 20 21 /** 22 * Information about the current build, extracted from system properties. 23 */ 24 public class Build { 25 /** Value used for when a build property is unknown. */ 26 public static final String UNKNOWN = "unknown"; 27 28 /** Either a changelist number, or a label like "M4-rc20". */ 29 public static final String ID = getString("ro.build.id"); 30 31 /** A build ID string meant for displaying to the user */ 32 public static final String DISPLAY = getString("ro.build.display.id"); 33 34 /** The name of the overall product. */ 35 public static final String PRODUCT = getString("ro.product.name"); 36 37 /** The name of the industrial design. */ 38 public static final String DEVICE = getString("ro.product.device"); 39 40 /** The name of the underlying board, like "goldfish". */ 41 public static final String BOARD = getString("ro.product.board"); 42 43 /** The name of the instruction set (CPU type + ABI convention) of native code. */ 44 public static final String CPU_ABI = getString("ro.product.cpu.abi"); 45 46 /** The name of the second instruction set (CPU type + ABI convention) of native code. */ 47 public static final String CPU_ABI2 = getString("ro.product.cpu.abi2"); 48 49 /** The manufacturer of the product/hardware. */ 50 public static final String MANUFACTURER = getString("ro.product.manufacturer"); 51 52 /** The brand (e.g., carrier) the software is customized for, if any. */ 53 public static final String BRAND = getString("ro.product.brand"); 54 55 /** The end-user-visible name for the end product. */ 56 public static final String MODEL = getString("ro.product.model"); 57 58 /** The system bootloader version number. */ 59 public static final String BOOTLOADER = getString("ro.bootloader"); 60 61 /** 62 * The radio firmware version number. 63 * 64 * @deprecated The radio firmware version is frequently not 65 * available when this class is initialized, leading to a blank or 66 * "unknown" value for this string. Use 67 * {@link #getRadioVersion} instead. 68 */ 69 @Deprecated 70 public static final String RADIO = getString(TelephonyProperties.PROPERTY_BASEBAND_VERSION); 71 72 /** The name of the hardware (from the kernel command line or /proc). */ 73 public static final String HARDWARE = getString("ro.hardware"); 74 75 /** A hardware serial number, if available. Alphanumeric only, case-insensitive. */ 76 public static final String SERIAL = getString("ro.serialno"); 77 78 /** Various version strings. */ 79 public static class VERSION { 80 /** 81 * The internal value used by the underlying source control to 82 * represent this build. E.g., a perforce changelist number 83 * or a git hash. 84 */ 85 public static final String INCREMENTAL = getString("ro.build.version.incremental"); 86 87 /** 88 * The user-visible version string. E.g., "1.0" or "3.4b5". 89 */ 90 public static final String RELEASE = getString("ro.build.version.release"); 91 92 /** 93 * The user-visible SDK version of the framework in its raw String 94 * representation; use {@link #SDK_INT} instead. 95 * 96 * @deprecated Use {@link #SDK_INT} to easily get this as an integer. 97 */ 98 @Deprecated 99 public static final String SDK = getString("ro.build.version.sdk"); 100 101 /** 102 * The user-visible SDK version of the framework; its possible 103 * values are defined in {@link Build.VERSION_CODES}. 104 */ 105 public static final int SDK_INT = SystemProperties.getInt( 106 "ro.build.version.sdk", 0); 107 108 /** 109 * The current development codename, or the string "REL" if this is 110 * a release build. 111 */ 112 public static final String CODENAME = getString("ro.build.version.codename"); 113 114 /** 115 * The SDK version to use when accessing resources. 116 * Use the current SDK version code. If we are a development build, 117 * also allow the previous SDK version + 1. 118 * @hide 119 */ 120 public static final int RESOURCES_SDK_INT = SDK_INT 121 + ("REL".equals(CODENAME) ? 0 : 1); 122 } 123 124 /** 125 * Enumeration of the currently known SDK version codes. These are the 126 * values that can be found in {@link VERSION#SDK}. Version numbers 127 * increment monotonically with each official platform release. 128 */ 129 public static class VERSION_CODES { 130 /** 131 * Magic version number for a current development build, which has 132 * not yet turned into an official release. 133 */ 134 public static final int CUR_DEVELOPMENT = 10000; 135 136 /** 137 * October 2008: The original, first, version of Android. Yay! 138 */ 139 public static final int BASE = 1; 140 141 /** 142 * February 2009: First Android update, officially called 1.1. 143 */ 144 public static final int BASE_1_1 = 2; 145 146 /** 147 * May 2009: Android 1.5. 148 */ 149 public static final int CUPCAKE = 3; 150 151 /** 152 * September 2009: Android 1.6. 153 * 154 * <p>Applications targeting this or a later release will get these 155 * new changes in behavior:</p> 156 * <ul> 157 * <li> They must explicitly request the 158 * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} permission to be 159 * able to modify the contents of the SD card. (Apps targeting 160 * earlier versions will always request the permission.) 161 * <li> They must explicitly request the 162 * {@link android.Manifest.permission#READ_PHONE_STATE} permission to be 163 * able to be able to retrieve phone state info. (Apps targeting 164 * earlier versions will always request the permission.) 165 * <li> They are assumed to support different screen densities and 166 * sizes. (Apps targeting earlier versions are assumed to only support 167 * medium density normal size screens unless otherwise indicated). 168 * They can still explicitly specify screen support either way with the 169 * supports-screens manifest tag. 170 * </ul> 171 */ 172 public static final int DONUT = 4; 173 174 /** 175 * November 2009: Android 2.0 176 * 177 * <p>Applications targeting this or a later release will get these 178 * new changes in behavior:</p> 179 * <ul> 180 * <li> The {@link android.app.Service#onStartCommand 181 * Service.onStartCommand} function will return the new 182 * {@link android.app.Service#START_STICKY} behavior instead of the 183 * old compatibility {@link android.app.Service#START_STICKY_COMPATIBILITY}. 184 * <li> The {@link android.app.Activity} class will now execute back 185 * key presses on the key up instead of key down, to be able to detect 186 * canceled presses from virtual keys. 187 * <li> The {@link android.widget.TabWidget} class will use a new color scheme 188 * for tabs. In the new scheme, the foreground tab has a medium gray background 189 * the background tabs have a dark gray background. 190 * </ul> 191 */ 192 public static final int ECLAIR = 5; 193 194 /** 195 * December 2009: Android 2.0.1 196 */ 197 public static final int ECLAIR_0_1 = 6; 198 199 /** 200 * January 2010: Android 2.1 201 */ 202 public static final int ECLAIR_MR1 = 7; 203 204 /** 205 * June 2010: Android 2.2 206 */ 207 public static final int FROYO = 8; 208 209 /** 210 * November 2010: Android 2.3 211 */ 212 public static final int GINGERBREAD = 9; 213 214 /** 215 * February 2011: Android 2.3.3. 216 */ 217 public static final int GINGERBREAD_MR1 = 10; 218 219 /** 220 * February 2011: Android 3.0. 221 * 222 * <p>Applications targeting this or a later release will get these 223 * new changes in behavior:</p> 224 * <ul> 225 * <li> The default theme for applications is now dark holographic: 226 * {@link android.R.style#Theme_Holo}. 227 * <li> The activity lifecycle has changed slightly as per 228 * {@link android.app.Activity}. 229 * <li> When an application requires a permission to access one of 230 * its components (activity, receiver, service, provider), this 231 * permission is no longer enforced when the application wants to 232 * access its own component. This means it can require a permission 233 * on a component that it does not itself hold and still access that 234 * component. 235 * </ul> 236 */ 237 public static final int HONEYCOMB = 11; 238 239 /** 240 * May 2011: Android 3.1. 241 */ 242 public static final int HONEYCOMB_MR1 = 12; 243 244 /** 245 * June 2011: Android 3.2. 246 * 247 * <p>Update to Honeycomb MR1 to support 7 inch tablets, improve 248 * screen compatibility mode, etc.</p> 249 * 250 * <p>As of this version, applications that don't say whether they 251 * support XLARGE screens will be assumed to do so only if they target 252 * {@link #HONEYCOMB} or later; it had been {@link #GINGERBREAD} or 253 * later. Applications that don't support a screen size at least as 254 * large as the current screen will provide the user with a UI to 255 * switch them in to screen size compatibility mode.</p> 256 * 257 * <p>This version introduces new screen size resource qualifiers 258 * based on the screen size in dp: see 259 * {@link android.content.res.Configuration#screenWidthDp}, 260 * {@link android.content.res.Configuration#screenHeightDp}, and 261 * {@link android.content.res.Configuration#smallestScreenWidthDp}. 262 * Supplying these in <supports-screens> as per 263 * {@link android.content.pm.ApplicationInfo#requiresSmallestWidthDp}, 264 * {@link android.content.pm.ApplicationInfo#compatibleWidthLimitDp}, and 265 * {@link android.content.pm.ApplicationInfo#largestWidthLimitDp} is 266 * preferred over the older screen size buckets and for older devices 267 * the appropriate buckets will be inferred from them.</p> 268 * 269 * <p>New {@link android.content.pm.PackageManager#FEATURE_SCREEN_PORTRAIT} 270 * and {@link android.content.pm.PackageManager#FEATURE_SCREEN_LANDSCAPE} 271 * features are introduced in this release. Applications that target 272 * previous platform versions are assumed to require both portrait and 273 * landscape support in the device; when targeting Honeycomb MR1 or 274 * greater the application is responsible for specifying any specific 275 * orientation it requires.</p> 276 */ 277 public static final int HONEYCOMB_MR2 = 13; 278 279 /** 280 * Android 4.0. 281 * 282 * <p>Applications targeting this or a later release will get these 283 * new changes in behavior:</p> 284 * <ul> 285 * <li> For devices without a dedicated menu key, the software compatibility 286 * menu key will not be shown even on phones. By targeting Ice Cream Sandwich 287 * or later, your UI must always have its own menu UI affordance if needed, 288 * on both tablets and phones. The ActionBar will take care of this for you. 289 * <li> 2d drawing hardware acceleration is now turned on by default. 290 * You can use 291 * {@link android.R.attr#hardwareAccelerated android:hardwareAccelerated} 292 * to turn it off if needed, although this is strongly discouraged since 293 * it will result in poor performance on larger screen devices. 294 * <li> The default theme for applications is now the "device default" theme: 295 * {@link android.R.style#Theme_DeviceDefault}. This may be the 296 * holo dark theme or a different dark theme defined by the specific device. 297 * The {@link android.R.style#Theme_Holo} family must not be modified 298 * for a device to be considered compatible. Applications that explicitly 299 * request a theme from the Holo family will be guaranteed that these themes 300 * will not change character within the same platform version. Applications 301 * that wish to blend in with the device should use a theme from the 302 * {@link android.R.style#Theme_DeviceDefault} family. 303 * <li> Managed cursors can now throw an exception if you directly close 304 * the cursor yourself without stopping the management of it; previously failures 305 * would be silently ignored. 306 * <li> The fadingEdge attribute on views will be ignored (fading edges is no 307 * longer a standard part of the UI). A new requiresFadingEdge attribute allows 308 * applications to still force fading edges on for special cases. 309 * </ul> 310 */ 311 public static final int ICE_CREAM_SANDWICH = 14; 312 } 313 314 /** The type of build, like "user" or "eng". */ 315 public static final String TYPE = getString("ro.build.type"); 316 317 /** Comma-separated tags describing the build, like "unsigned,debug". */ 318 public static final String TAGS = getString("ro.build.tags"); 319 320 /** A string that uniquely identifies this build. Do not attempt to parse this value. */ 321 public static final String FINGERPRINT = getString("ro.build.fingerprint"); 322 323 // The following properties only make sense for internal engineering builds. 324 public static final long TIME = getLong("ro.build.date.utc") * 1000; 325 public static final String USER = getString("ro.build.user"); 326 public static final String HOST = getString("ro.build.host"); 327 328 /** 329 * Returns the version string for the radio firmware. May return 330 * null (if, for instance, the radio is not currently on). 331 */ getRadioVersion()332 public static String getRadioVersion() { 333 return SystemProperties.get(TelephonyProperties.PROPERTY_BASEBAND_VERSION, null); 334 } 335 getString(String property)336 private static String getString(String property) { 337 return SystemProperties.get(property, UNKNOWN); 338 } 339 getLong(String property)340 private static long getLong(String property) { 341 try { 342 return Long.parseLong(SystemProperties.get(property)); 343 } catch (NumberFormatException e) { 344 return -1; 345 } 346 } 347 } 348