Android8.0 恢复出厂设置后弹出设备内部错误

当前问题:恢复出厂设置重启后,弹出对话框提示:Android System There's an internal problem with your device. Contact your manufacturer for details.

这是因为Google在Android 5.1中添加了一个检查,该检查将/system/build.prop与/vendor/build.prop进行比较,如果它们不匹配,则会显示错误。 为了解决这个问题,你需要在/vendor/build.prop中使用一些值来将它与/system/build.prop文件进行匹配。

经过搜集资料,主要是由于/vendor/build.prop中的ro.vendor.build.fingerprint和/system/build.prop文件中的ro.build.fingerprint属性值不同导致的。

将vendor下的值改成system下的值即可。

/vendor/build.prop:ro.vendor.build.fingerprint=Android/acuteangle/acuteangle:8.1.0/OPM1.171019.011/sgf05301658:userdebug/test-keys

/system/build.prop:ro.build.fingerprint=Android/acuteangle/acuteangle:8.1.0/OPM1.171019.011/sgf05301658:userdebug/test-keys

修改方法如下:

build/make/core/Makefile

$(INSTALLED_VENDOR_BUILD_PROP_TARGET): $(VENDOR_BUILDINFO_SH) $(intermediate_system_build_prop)
	@echo Target vendor buildinfo: $@
	@mkdir -p $(dir $@)
	$(hide) echo > $@
	$(hide) grep 'ro.product.first_api_level' $(intermediate_system_build_prop) >> $@ || true
	$(hide) echo ro.vendor.build.date=`$(DATE_FROM_FILE)`>>$@
	$(hide) echo ro.vendor.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@

	#$(hide) echo ro.vendor.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@
        $(hide) echo ro.vendor.build.fingerprint="$(BUILD_FINGERPRINT)">>$@
        
从以下源码中也可以看出问题所在。

framework/base/core/java/android/os/Build.java

   /**
     * Verifies the current flash of the device is consistent with what
     * was expected at build time.
     *
     * Treble devices will verify the Vendor Interface (VINTF). A device
     * launched without Treble:
     *
     * 1) Checks that device fingerprint is defined and that it matches across
     *    various partitions.
     * 2) Verifies radio and bootloader partitions are those expected in the build.
     *
     * @hide
     */
    public static boolean isBuildConsistent() {
        // Don't care on eng builds.  Incremental build may trigger false negative.
        if (IS_ENG) return true;

        if (IS_TREBLE_ENABLED) {
            int result = VintfObject.verify(new String[0]);

            if (result != 0) {
                Slog.e(TAG, "Vendor interface is incompatible, error="
                        + String.valueOf(result));
            }

            return result == 0;
        }

        final String system = SystemProperties.get("ro.build.fingerprint");
        final String vendor = SystemProperties.get("ro.vendor.build.fingerprint");
        final String bootimage = SystemProperties.get("ro.bootimage.build.fingerprint");
        final String requiredBootloader = SystemProperties.get("ro.build.expect.bootloader");
        final String currentBootloader = SystemProperties.get("ro.bootloader");
        final String requiredRadio = SystemProperties.get("ro.build.expect.baseband");
        final String currentRadio = SystemProperties.get("gsm.version.baseband");

        if (TextUtils.isEmpty(system)) {
            Slog.e(TAG, "Required ro.build.fingerprint is empty!");
            return false;
        }

        if (!TextUtils.isEmpty(vendor)) {
            if (!Objects.equals(system, vendor)) {
                Slog.e(TAG, "Mismatched fingerprints; system reported " + system
                        + " but vendor reported " + vendor);
                return false;
            }
        }

        /* TODO: Figure out issue with checks failing
        if (!TextUtils.isEmpty(bootimage)) {
            if (!Objects.equals(system, bootimage)) {
                Slog.e(TAG, "Mismatched fingerprints; system reported " + system
                        + " but bootimage reported " + bootimage);
                return false;
            }
        }

        if (!TextUtils.isEmpty(requiredBootloader)) {
            if (!Objects.equals(currentBootloader, requiredBootloader)) {
                Slog.e(TAG, "Mismatched bootloader version: build requires " + requiredBootloader
                        + " but runtime reports " + currentBootloader);
                return false;
            }
        }

        if (!TextUtils.isEmpty(requiredRadio)) {
            if (!Objects.equals(currentRadio, requiredRadio)) {
                Slog.e(TAG, "Mismatched radio version: build requires " + requiredRadio
                        + " but runtime reports " + currentRadio);
                return false;
            }
        }
        */

        return true;
    }

猜你喜欢

转载自blog.csdn.net/weixin_41987588/article/details/80577835