我发现 Build.VERSION.RELEASE 和 Build.VERSION.CODENAME 的行为完全不同,这取决于它是 Android 操作系统的完整生产版本还是开发者预览版。我们采用了以下机制。如果要考虑多个场景,则不能只依赖一个值。
这是我发现运行 Nougat 生产版本的 Galaxy S7 和运行 O DP1 的 Nexus 5X 的情况。
银河 S7 牛轧糖
Build.VERSION.BASE_OS:
Build.VERSION.CODENAME:REL
Build.VERSION.INCREMENTAL:G930FXXU1DQB3
Build.VERSION.PREVIEW_SDK_INT:0
Build.VERSION.RELEASE:7.0
Build.VERSION.SDK_INT:24
Build.VERSION.SECURITY_PATCH:2017-01-01
Nexus 5X O
Build.VERSION.BASE_OS:
Build.VERSION.CODENAME:O
Build.VERSION.INCREMENTAL:3793265
Build.VERSION.PREVIEW_SDK_INT:1
Build.VERSION.RELEASE:O
Build.VERSION.SDK_INT:25
Build.VERSION.SECURITY_PATCH:2017-03-05
// release builds of Android (i.e. not developer previews) have a CODENAME value of "REL"
// check this. if it's REL then you can rely on value of SDK_INT (SDK_INT is inaccurate for DPs
// since it has the same value as the previous version of Android)
// if it's not REL, check its value. it will have a letter denoting the Android version (N for Nougat, O for... er... O and so on)
boolean laterThanNougat = false;
if(Build.VERSION.CODENAME.equals("REL")) {
Log.i(TAG, "This is a release build");
// since this is a release build, we can rely on value of SDK_INT
if (android.os.Build.VERSION.SDK_INT > 25) {
Log.i(TAG, "This is later than Nougat");
laterThanNougat = true;
} else {
Log.i(TAG, "This is Nougat or before");
}
} else {
Log.i(TAG, "This is NOT a release build");
// since this is not a release build, we can't rely on value of SDK_INT. must check codename again
if(Build.VERSION.CODENAME.compareTo("N") > 0) {
Log.i(TAG, "This is later than Nougat");
laterThanNougat = true;
} else {
Log.i(TAG, "This is Nougat or before");
}
}