一、需求
Build类获取手机制造商,系统定制商,型号,Android 系统版本,CPU 指令集,可以查看是否支持64位等
二、源码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package android.os;
import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Slog;
import com.mediatek.cta.CtaUtils;
import dalvik.system.VMRuntime;
import java.util.Objects;
public class Build {
private static final String TAG = "Build";
// 当一个版本属性不知道时所设定的值。其字符串值为 "unknown" .
public static final String UNKNOWN = "unknown";
// 修订版本列表:Either a changelist number, or a label like "M4-rc20".
public static final String ID = getString("ro.build.id");
// DISPLAY 显示屏参数
public static final String DISPLAY = getString("ro.build.display.id");
// PRODUCT 整个产品的名称:The name of the overall product.
public static final String PRODUCT = getString("ro.product.name");
// 设备参数:The name of the industrial design.
public static final String DEVICE = getString("ro.product.device");
// 主板:The name of the underlying board, like "goldfish".
public static final String BOARD = getString("ro.product.board");
// cpu指令集:The name of the instruction set (CPU type + ABI convention) of native code.
/** @deprecated */
@Deprecated
public static final String CPU_ABI;
// cpu指令集2:The name of the second instruction set (CPU type + ABI convention) of native code.
/** @deprecated */
@Deprecated
public static final String CPU_ABI2;
// MANUFACTURER 硬件制造商:The manufacturer of the product/hardware.
public static final String MANUFACTURER = getString("ro.product.manufacturer");
// 系统定制商:The consumer-visible brand with which the product/hardware will be associated, if any.
// 版本即最终用户可见的名称:The end-user-visible name for the end product.
public static final String BRAND = getString("ro.product.brand");
public static final String MODEL = getString("ro.product.model");
// BOOTLOADER 系统启动程序版本号:The system bootloader version number.
public static final String BOOTLOADER = getString("ro.bootloader");
// 无线电固件版本:The radio firmware version number. 在API14后已过时。使用 getRadioVersion()代替
/** @deprecated */
@Deprecated
public static final String RADIO = getString("gsm.version.baseband");
public static final String HARDWARE = getString("ro.hardware");
public static final boolean IS_EMULATOR = getString("ro.kernel.qemu").equals("1");
// 硬件序列号:A hardware serial number, if available. Alphanumeric only, case-insensitive.
public static final String SERIAL = getString("ro.serialno");
public static final String[] SUPPORTED_ABIS = getStringList("ro.product.cpu.abilist", ",");
public static final String[] SUPPORTED_32_BIT_ABIS = getStringList("ro.product.cpu.abilist32", ",");
public static final String[] SUPPORTED_64_BIT_ABIS = getStringList("ro.product.cpu.abilist64", ",");
public static final String TYPE;
// 描述build的标签,如未签名,debug等等。:Comma-separated tags describing the build, like "unsigned,debug".
public static final String TAGS;
// 唯一识别码:A string that uniquely identifies this build. Do not attempt to parse this value.
public static final String FINGERPRINT;
public static final long TIME;
public static final String USER;
public static final String HOST;
public static final boolean IS_DEBUGGABLE;
public static final boolean PERMISSIONS_REVIEW_REQUIRED;
public Build() {
}
private static String deriveFingerprint() {
String finger = SystemProperties.get("ro.build.fingerprint");
if(TextUtils.isEmpty(finger)) {
finger = getString("ro.product.brand") + '/' + getString("ro.product.name") + '/' + getString("ro.product.device") + ':' + getString("ro.build.version.release") + '/' + getString("ro.build.id") + '/' + getString("ro.build.version.incremental") + ':' + getString("ro.build.type") + '/' + getString("ro.build.tags");
}
return finger;
}
public static void ensureFingerprintProperty() {
if(TextUtils.isEmpty(SystemProperties.get("ro.build.fingerprint"))) {
try {
SystemProperties.set("ro.build.fingerprint", FINGERPRINT);
} catch (IllegalArgumentException var1) {
Slog.e("Build", "Failed to set fingerprint property", var1);
}
}
}
public static boolean isBuildConsistent() {
if("eng".equals(TYPE)) {
return true;
} else {
String system = SystemProperties.get("ro.build.fingerprint");
String vendor = SystemProperties.get("ro.vendor.build.fingerprint");
String bootimage = SystemProperties.get("ro.bootimage.build.fingerprint");
String requiredBootloader = SystemProperties.get("ro.build.expect.bootloader");
String currentBootloader = SystemProperties.get("ro.bootloader");
String requiredRadio = SystemProperties.get("ro.build.expect.baseband");
String currentRadio = SystemProperties.get("gsm.version.baseband");
if(TextUtils.isEmpty(system)) {
Slog.e("Build", "Required ro.build.fingerprint is empty!");
return false;
} else if(!TextUtils.isEmpty(vendor) && !Objects.equals(system, vendor)) {
Slog.e("Build", "Mismatched fingerprints; system reported " + system + " but vendor reported " + vendor);
return false;
} else {
return true;
}
}
}
public static String getRadioVersion() {
return SystemProperties.get("gsm.version.baseband", (String)null);
}
private static String getString(String property) {
return SystemProperties.get(property, "unknown");
}
private static String[] getStringList(String property, String separator) {
String value = SystemProperties.get(property);
return value.isEmpty()?new String[0]:value.split(separator);
}
private static long getLong(String property) {
try {
return Long.parseLong(SystemProperties.get(property));
} catch (NumberFormatException var2) {
return -1L;
}
}
public static boolean isPermissionReviewRequired() {
return PERMISSIONS_REVIEW_REQUIRED || CtaUtils.isCtaSupported();
}
static {
String[] abiList;
if(VMRuntime.getRuntime().is64Bit()) {
abiList = SUPPORTED_64_BIT_ABIS;
} else {
abiList = SUPPORTED_32_BIT_ABIS;
}
CPU_ABI = abiList[0];
if(abiList.length > 1) {
CPU_ABI2 = abiList[1];
} else {
CPU_ABI2 = "";
}
TYPE = getString("ro.build.type");
TAGS = getString("ro.build.tags");
FINGERPRINT = deriveFingerprint();
TIME = getLong("ro.build.date.utc") * 1000L;
USER = getString("ro.build.user");
HOST = getString("ro.build.host");
IS_DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0) == 1;
PERMISSIONS_REVIEW_REQUIRED = SystemProperties.getInt("ro.permission_review_required", 0) == 1;
}
public static class VERSION_CODES {
public static final int CUR_DEVELOPMENT = 10000;
public static final int BASE = 1;
public static final int BASE_1_1 = 2;
public static final int CUPCAKE = 3;
public static final int DONUT = 4;
public static final int ECLAIR = 5;
public static final int ECLAIR_0_1 = 6;
public static final int ECLAIR_MR1 = 7;
public static final int FROYO = 8;
public static final int GINGERBREAD = 9;
public static final int GINGERBREAD_MR1 = 10;
public static final int HONEYCOMB = 11;
public static final int HONEYCOMB_MR1 = 12;
public static final int HONEYCOMB_MR2 = 13;
public static final int ICE_CREAM_SANDWICH = 14;
public static final int ICE_CREAM_SANDWICH_MR1 = 15;
public static final int JELLY_BEAN = 16;
public static final int JELLY_BEAN_MR1 = 17;
public static final int JELLY_BEAN_MR2 = 18;
public static final int KITKAT = 19;
public static final int KITKAT_WATCH = 20;
public static final int L = 21;
public static final int LOLLIPOP = 21;
public static final int LOLLIPOP_MR1 = 22;
public static final int M = 23;
public static final int N = 24;
public VERSION_CODES() {
}
}
public static class VERSION {
public static final String INCREMENTAL = Build.getString("ro.build.version.incremental");
public static final String RELEASE = Build.getString("ro.build.version.release");
public static final String BASE_OS = SystemProperties.get("ro.build.version.base_os", "");
public static final String SECURITY_PATCH = SystemProperties.get("ro.build.version.security_patch", "");
/** @deprecated */
@Deprecated
public static final String SDK = Build.getString("ro.build.version.sdk");
public static final int SDK_INT = SystemProperties.getInt("ro.build.version.sdk", 0);
public static final int PREVIEW_SDK_INT = SystemProperties.getInt("ro.build.version.preview_sdk", 0);
public static final String CODENAME = Build.getString("ro.build.version.codename");
private static final String[] ALL_CODENAMES = Build.getStringList("ro.build.version.all_codenames", ",");
public static final String[] ACTIVE_CODENAMES;
public static final int RESOURCES_SDK_INT;
public VERSION() {
}
static {
ACTIVE_CODENAMES = "REL".equals(ALL_CODENAMES[0])?new String[0]:ALL_CODENAMES;
RESOURCES_SDK_INT = SDK_INT + ACTIVE_CODENAMES.length;
}
}
}
三、运用
package com.fadisu.cpurun.util;
import java.lang.reflect.Field;
import android.os.Build;
import android.util.Log;
public class BuildHelper {
private static final String TAG = BuildHelper.class.getSimpleName();
/**
* Build class所有的字段属性
* Build.BOARD : Z91
* Build.BOOTLOADER : unknown
* Build.BRAND : FaDi
* Build.CPU_ABI : arm64-v8a
* Build.CPU_ABI2 :
* Build.DEVICE : Z91
* Build.DISPLAY : TEST_FaDi_Z91_S100_20180108
* Build.FINGERPRINT : FaDi/Z91/Z91:7.1.1/N6F26Q/1515397384:user/release-keys
* Build.HARDWARE : mt6739
* Build.HOST : 69959bbb90c6
* Build.ID : N6F26Q
* Build.IS_DEBUGGABLE : true
* Build.IS_EMULATOR : false
* Build.MANUFACTURER : FaDi
* Build.MODEL : Z91
* Build.PERMISSIONS_REVIEW_REQUIRED : false
* Build.PRODUCT : Z91
* Build.RADIO : unknown
* Build.SERIAL : 0123456789ABCDEF
* Build.SUPPORTED_32_BIT_ABIS : [Ljava.lang.String;@305cf5e
* Build.SUPPORTED_64_BIT_ABIS : [Ljava.lang.String;@f5c1f3f
* Build.SUPPORTED_ABIS : [Ljava.lang.String;@578b00c
* Build.TAG : Build
* Build.TAGS : release-keys
* Build.TIME : 1515397382000
* Build.TYPE : user
* Build.UNKNOWN : unknown
* Build.USER : FaDi
* Build.VERSION.ACTIVE_CODENAMES : [Ljava.lang.String;@f4ecd55
* Build.VERSION.ALL_CODENAMES : [Ljava.lang.String;@bdb836a
* Build.VERSION.BASE_OS :
* Build.VERSION.CODENAME : REL
* Build.VERSION.INCREMENTAL : 1515397384
* Build.VERSION.PREVIEW_SDK_INT : 0
* Build.VERSION.RELEASE : 7.1.1
* Build.VERSION.RESOURCES_SDK_INT : 25
* Build.VERSION.SDK : 25
* Build.VERSION.SDK_INT : 25
* Build.VERSION.SECURITY_PATCH : 2017-11-05
*/
public static void getAllBuildInformation() {
Field[] fields = Build.class.getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
Log.w(TAG, "Build." + field.getName() + " : " + field.get(null));
} catch (Exception e) {
Log.e(TAG, "an error occured when collect crash info", e);
}
}
Field[] fieldsVersion = Build.VERSION.class.getDeclaredFields();
for (Field field : fieldsVersion) {
try {
field.setAccessible(true);
Log.w(TAG, "Build.VERSION." + field.getName() + " : " + field.get(null));
} catch (Exception e) {
Log.e(TAG, "an error occured when collect crash info", e);
}
}
}
// 手机制造商
public static String getProduct() {
return Build.PRODUCT;
}
// 系统定制商
public static String getBrand() {
return Build.BRAND;
}
// 硬件制造商
public static String getManufacturer() {
return Build.MANUFACTURER;
}
// 硬件名称
public static String getHardWare() {
return Build.HARDWARE;
}
// 型号
public static String getMode() {
return Build.MODEL;
}
// Android 系统版本
public static String getAndroidVersion() {
return Build.VERSION.RELEASE;
}
// CPU 指令集,可以查看是否支持64位
public static String getCpuAbi() {
return Build.CPU_ABI;
}
}