出现“您的设备内部出现了问题。请联系您的设备制造商了解详情”错误后,kernel的配置问题查找
您的设备内部出现了问题。请联系您的设备制造商了解详情。
1. 文件:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java中判断Build.isBuildConsistent的值进行检查
15411 public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {……
5601 if (!Build.isBuildConsistent()) {15602 Slog.e(TAG, "Build fingerprint is not consistent, warning user");
15603 mUiHandler.obtainMessage(SHOW_FINGERPRINT_ERROR_UI_MSG).sendToTarget();
15604 }……
- isBuildConsistent函数在frameworks/base/core/java/android/os/Build.java中其中IS_TREBLE_ENABLED是进行兼容性判断的关键判断,这个值来自于属性ro.treble.enabled。继续查看发现 int result = VintfObject.verifyWithoutAvb();为判断设备兼容性的关键函数。
962 /**963 * True if Treble is enabled and required for this device.964 *965 * @hide966 */967 public static final boolean IS_TREBLE_ENABLED =968 SystemProperties.getBoolean("ro.treble.enabled", false);969 970 /**971 * Verifies the current flash of the device is consistent with what972 * was expected at build time.973 *974 * Treble devices will verify the Vendor Interface (VINTF). A device975 * launched without Treble:976 *977 * 1) Checks that device fingerprint is defined and that it matches across978 * various partitions.979 * 2) Verifies radio and bootloader partitions are those expected in the build.980 * 981 * @hide 982 */ 983 public static boolean isBuildConsistent() {984 // Don't care on eng builds. Incremental build may trigger false negative.985 if (IS_ENG) return true;986 987 if (IS_TREBLE_ENABLED) {988 // If we can run this code, the device should already pass AVB.989 // So, we don't need to check AVB here.990 int result = VintfObject.verifyWithoutAvb();991 992 if (result != 0) {993 Slog.e(TAG, "Vendor interface is incompatible, error="994 + String.valueOf(result));995 } 996 997 return result == 0;998 }
VintfObject.verifyWithoutAvb()---->frameworks/base/core/java/android/os/VintfObject.java--->public static native int verifyWithoutAvb();--->core/jni/android_os_VintfObject.cpp --->{"verifyWithoutAvb", "()I", (void*)android_os_VintfObject_verifyWithoutAvb}, ---->static jint android_os_VintfObject_verifyWithoutAvb(JNIEnv* env, jclass) { ---->static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::DisabledChecks checks) {--->int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error, checks);
VintfObject::CheckCompatibility函数成为了关键函数,继续排查发现在system/libvintf/VintfObject.cpp中,system/libvintf/VintfObject.cpp--->return details::checkCompatibility(xmls, false /* mount */, *details::gPartitionMounter, error,disabledChecks); --->int32_t checkCompatibility(const std::vector<std::string>& xmls, bool mount,
此时checkCompatibility函数成为了我们的突破口,函数中的判断发现logcat中的关键打印:
"Runtime info and framework compatibility matrix are incompatible: "
在logcat中发现:
W VintfObject: VintfObject.verify() returns 1: Runtime info and framework compatibility matrix are incompatible: For config CONFIG_NFS_FS, value = y but required nE Build : Vendor interface is incompatible, error=1E ActivityManager: Build fingerprint is not consistent, warning user
此时找到了关键问题点,就是CONFIG_NFS_FS的不应该为Y应该为N,但是这个是怎么查找到的呢?if (!updated.runtimeInfo->checkCompatibility(*updated.fwk.matrix, error, disabledChecks)) {---->RuntimeInfo.cpp ----->bool RuntimeInfo::checkCompatibility(const CompatibilityMatrix& mat, std::string* error,现在发现,突然没了头绪,想到了之前error信息:“For config CONFIG_NFS_FS, value = y but required n”这个判断肯定是RuntimeInfo::checkCompatibility函数中返回,所以搜了下发现继续进行下去:if (!matchKernelConfigs(matrixKernel.conditions(), error)) { --->bool RuntimeInfo::matchKernelConfigs(const std::vector<KernelConfig>& matrixConfigs,在RuntimeInfo::matchKernelConfigs函数中找到了关键的错误信息打印,并找到对应的判断:if (!matrixConfig.second.matchValue(kernelValue)) {
到这发现是对kernel的信息进行比对,但是信息从哪里来呢?比对的信息又从哪里来呢?陷入了僵局
进行长时间博客谷歌查找再google的介绍里面找到了关键的兼容性介绍,链接如下:
https://source.android.google.cn/devices/architecture/vintf/match-rules#avb-version
其中内核匹配不就是我们想要的信息:
选择适当的 部分后,对于值不为 n 的每个 项,我们预计对应条目会存在于
/proc/config.gz 中;对于值为 n 的每个 项,我们预计对应条目不会存在于 /proc/config.gz
中。我们预计 的内容与等号后面的文本(包括引号)完全匹配,直到换行符或 #,开头和结尾的空格被截断。
这个config不就是我们想要的信息;
在介绍的开始有一个信息的链接:
https://source.android.google.cn/devices/architecture/vintf/objects#runtime-collectible-information
这个链接里面介绍了相关的清单,和信息来源,此时还是懵逼,不过有个信息很重要:
<!-- Comments, Legal notices, etc. here --><manifest version="1.0" type="device" target-level="1"><!-- hals ommited --><kernel version="4.4.176"><config><key>CONFIG_ANDROID</key><value>y</value></config><config><key>CONFIG_ARM64</key><value>y</value></config><!-- other configs ommited --></kernel></manifest>
但是此时我并没有发现他的重要性,不过让我知道了有这个列表,可是这个列表在哪呢?查找了源码还是一无所获
在system/libvintf目录中搜索了下“kernel version”发现不一般了:
test/vintf_object_tests.cpp文件中1222 //1223 // Set of framework matrices of different FCM version with <kernel>.1224 //1225 1226 #define FAKE_KERNEL(__version__, __key__) \1227 " <kernel version=\"" __version__ "\">\n" \1228 " <config>\n" \1229 " <key>CONFIG_" __key__ "</key>\n" \1230 " <value type=\"tristate\">y</value>\n" \1231 " </config>\n" \1232 " </kernel>\n"当我看到FAKE_KERNEL定义的时候瞬间通透了,原来他是生成出来的,继续往下看1234 const static std::vector<std::string> systemMatrixKernelXmls = {1235 // 1.xml1236 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\">\n"1237 FAKE_KERNEL("1.0.0", "A1")1238 FAKE_KERNEL("2.0.0", "B1")1239 "</compatibility-matrix>\n",1240 // 2.xml1241 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"2\">\n"1242 FAKE_KERNEL("2.0.0", "B2")1243 FAKE_KERNEL("3.0.0", "C2")1244 FAKE_KERNEL("4.0.0", "D2")1245 "</compatibility-matrix>\n",1246 // 3.xml1247 "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"3\">\n"1248 FAKE_KERNEL("4.0.0", "D3")1249 FAKE_KERNEL("5.0.0", "E3")1250 "</compatibility-matrix>\n",1251 };
通过这个发现了xml的关键节点,妥了,去编译出来的文件中去查之前的错误CONFIG_NFS_FS
system/etc/vintf/compatibility_matrix.3.xml:972: <key>CONFIG_NFS_FS</key>system/etc/vintf/compatibility_matrix.3.xml:1758: <key>CONFIG_NFS_FS</key>system/etc/vintf/compatibility_matrix.3.xml:2552: <key>CONFIG_NFS_FS</key>system/etc/vintf/compatibility_matrix.2.xml:796: <key>CONFIG_NFS_FS</key>system/etc/vintf/compatibility_matrix.2.xml:1434: <key>CONFIG_NFS_FS</key>system/etc/vintf/compatibility_matrix.2.xml:2108: <key>CONFIG_NFS_FS</key>system/compatibility_matrix.xml:976: <key>CONFIG_NFS_FS</key>system/compatibility_matrix.xml:1762: <key>CONFIG_NFS_FS</key>system/compatibility_matrix.xml:2556: <key>CONFIG_NFS_FS</key>
这一瞬间,感觉自己受到了极大的侮辱,原来如此;一切都通透了,一一匹配,对应然后查找
所有的配置中:
<config><key>CONFIG_NFS_FS</key><value type="tristate">n</value></config>
报错了,这下方便了,查找文件生成就好了:
继续查找其中与kernel version匹配的配置,compatibility_matrix.2.xml最为符合查找生成的位置:
hardware/interfaces/compatibility_matrices/Android.mk:
49 include $(CLEAR_VARS)50 include $(LOCAL_PATH)/clear_vars.mk51 LOCAL_MODULE := framework_compatibility_matrix.2.xml52 LOCAL_MODULE_STEM := compatibility_matrix.2.xml53 LOCAL_SRC_FILES := $(LOCAL_MODULE_STEM)54 LOCAL_KERNEL_CONFIG_DATA_PATHS := \55 3.18.0:$(my_kernel_config_data)/o-mr1/android-3.18 \56 4.4.0:$(my_kernel_config_data)/o-mr1/android-4.4 \57 4.9.0:$(my_kernel_config_data)/o-mr1/android-4.9 \58 59 include $(BUILD_FRAMEWORK_COMPATIBILITY_MATRIX)
匹配找到对应的目录,然后进行修改就完事了
感谢博客:https://blog.csdn.net/yekongzhongdexing/article/details/103961461
提供很重要的思路
出现“您的设备内部出现了问题。请联系您的设备制造商了解详情”错误后,kernel的配置问题查找相关推荐
- NVME CLI -- nvme 命令查看NVME设备内部状态
文章目录 NVME 和 AHCI 性能比较 NVME-CLI nvme工具使用 1. 安装 2. 命令综述 3. 基本命令演示 4. NVME 固件设备升级 近期在做一些rocksdb on 新硬件的 ...
- mme设备内部错误_防爆电气设备安装的三大误区 你中招了没?
防爆电气设备被广泛安装使用于煤炭.石油.化工.医药.纺织.机械制造等行业中可能出现.聚集爆炸性气体.蒸气.可燃性粉尘或纤维等危险物质的爆炸危险场所.根据调查显示,60%-80%的爆炸和火灾事故是由电气 ...
- 安科瑞ACX电瓶车智能充电桩,支付方式可选择刷卡、扫码、免费充电使用,设备内部可引出10路出线至专用插座
1.概述 电瓶车智能充电桩是新一代电动自行车智能充电设备,具有交流输出电源远程通断控制.充电安全控制.电度计量.按时计费功能于一体的交流供电装置,该装置能通过电动自行车的车配充电器为电动自行车充电.支 ...
- Linux环境问题_adb shell无法进入设备内部
某设备A连接PC后,使用adb shell 未进入设备A内部(linux内核),具体常见情况及对应解决方法如下: 一.输入adb shell提示如下:error:device not found 解决 ...
- 电力设备内部绝缘油泄漏检测图像数据集(300多张数据,VOC标签)
下载地址:电力设备内部绝缘油泄漏检测图像数据集(300多张数据,VOC标签)
- 安科瑞WHD智能温度控制器,用于中高压开关柜、端子箱、环网柜、箱变等设备内部温度和湿度的调节控制
● 概述 温湿度控制器产品主要用于中高压开关柜.端子箱.环网柜.箱变等设备内部温度和湿度的调节控制.可有效防止因低温.高温造成的设备故障以及受潮或结露引起的爬电.闪络事故的发生. 智能型温湿度控制器以 ...
- linux设备usb节点和硬件接口,所谓设备驱动即驱使硬件设备行动,带你深入理解linux的设备驱动......
原标题:所谓设备驱动即驱使硬件设备行动,带你深入理解linux的设备驱动... 设备驱动最通俗的解释就是"驱使硬件设备行动".操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏 ...
- 2021年施工员-设备方向-岗位技能(施工员)考试试卷及施工员-设备方向-岗位技能(施工员)证考试
题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:金属非金属矿山排水考试资料考前必练!安全生产模拟考试一点通每个月更新金属非金属矿山排水在线考试题目及答案!多做几遍,其实通过金属非 ...
- 学习笔记——《LINUX设备驱动程序(第三版)》Linux设备模型:内核添加、删除设备、驱动程序
文章目录 1. 前言 2. 准备工作 2.1. 概念 2.2. 具体总线.设备.驱动结构体说明 2.3. 注册总线 3. 添加设备 3.1. STEP1 --发现设备并创建设备结构 struct XX ...
最新文章
- 不允许使用抽象类类型的对象怎么办_Java基础——面试官:你来说说抽象类和接口的区别...
- SQL 备份还原单个表
- 基于UDP的组播网络程序
- pfsense下的流量管理(转)
- 支付宝前端推出《Web前端开发入门手册》
- 腾讯正式下线PC版QQ秀 网友:我的时代落幕了
- mpvue配置底部菜单栏图标路径报错
- L3-003. 社交集群-PAT团体程序设计天梯赛GPLT(并查集)
- 差分进化算法和遗传算法 区别 谁更好
- I.MX6 CAAM
- 均值定理四个公式_中考数学几何题,就考这140多条公式定理!
- 传智播客黑马程序员之JAVA基础深入浅出精华版
- 互联网日报 | 张朝阳宣布2020年搜狐已盈利;永辉超市达成千店目标;腾讯云原生注册用户规模超100万...
- 统计学 参数估计 之 总体均值的估计
- 三星手机tf卡数据恢复怎么做
- 古城钟楼微博地支报时程序铛,100行代码实现
- ArcGIS中.shp矢量文件和.lyr图层文件的区别
- 数据分析师-SQL笔试题-做透这道题就够了
- 8888帅气图片网络红人打造第一期
- java代码实现短信接受验证码