rk3399 Android9.0 ota升级失败

2023-11-13

rk3399 Android9.0 ota升级失败

问题:在rk3399 Android9.0 项目中需要 ota 功能,user版本编译完ota升级包后,在同版本整包升级时遇到如下问题:

在这里插入图片描述

抓到的logcat内容如下:

1044  2343 D RKUpdateService: doesImageMatchProduct(): start verify package , imagePath = /mnt/media_rw/9704-7E5A/update.zip
250   326 D AudioHardwareTiny: do_out_standby,out = 0xee550000,device = 0x2
250   326 D alsa_route: route_set_controls() set route 24
250   326 D AudioHardwareTiny: close device
261   261 E hwc_rk  : hwc_get_handle_layername:cann't get value from gralloc
261   261 E hwc_rk  : hwc_get_handle_layername:cann't get value from gralloc
261   306 E HWC2On1Adapter: Validate was called more than once!
261   306 E hwc_rk  : hwc_get_handle_layername:cann't get value from gralloc
261   306 E hwc_rk  : hwc_get_handle_layername:cann't get value from gralloc
261   306 E HWC2On1Adapter: Validate was called more than once!
454   467 E memtrack: Couldn't load memtrack module
454   467 W android.os.Debug: failed to get memory consumption info: -1
454   467 E memtrack: Couldn't load memtrack module
454   467 W android.os.Debug: failed to get memory consumption info: -1
454   467 E memtrack: Couldn't load memtrack module
454   467 W android.os.Debug: failed to get memory consumption info: -1
454  1306 D DhcpClient: Broadcasting DHCPDISCOVER
1044  2343 W VintfObject: VintfObject.verify() returns 1: Runtime info and framework compatibility matrix are incompatible: For config CONFIG_DEVMEM, value = y but required n
1044  2343 D RKUpdateService: doesImageMatchProduct(): verifaPackage faild!
1044  2343 D RKUpdateService: java.security.SignatureException: package compatibility verification failed
269   291 D SurfaceFlinger: duplicate layer name: changing android.rockchip.update.service/android.rockchip.update.service.UpdateAndRebootActivity to android.rockchip.update.service/android.rockchip.update.service.UpdateAndRebootActivity#1
261   306 E hwc_rk  : hwc_get_handle_layername:cann't get value from gralloc

问题分析:

1.通过logcat可以看到

RKUpdateService: doesImageMatchProduct(): verifaPackage faild! 

​ 排查思路:

​ ①先看下是否由于签名问题引起的?

​ ②RKUpdateService.apk有更改过,将apk回退到原来的状态是否可以?

​ ③找到RKUpdateService.apk的源码,看下 doesImageMatchProduct() 这个信息报错时,apk对固件包进行了那些信息的比较操作,关注下这些信息是否有更改?

2.通过logcat 可以看到

W VintfObject: VintfObject.verify() returns 1: Runtime info and framework compatibility matrix are incompatible: For config CONFIG_DEVMEM, value = y but required n

​ 排查思路:

​ 1.通过上边log可以看到 CONFIG_DEVMEM 宏的值是y,但是要求应该是n,将kernel/.config中的宏关闭看下?

思路验证:

1.1是否由签名问题引起:

1.经验证 vendor/rockchip/common/apps/RKUpdateService/Android.mk中的 LOCAL_CERTIFICATE = platform ,说明 RKUpdateService.apk使用的是系统签名,就算系统签名更换过也没有关系,在编译的时候,RKUpdateService.apk依旧会使用系统签名重新签一次,以保证签名正确。
排查完后确定不是签名的问题。
注意:在rk3288 7.1 项目中有试过,如果 RKUpdateService.apk 的签名有问题的话,那么在插入U盘后,根本就不会弹出ota升级的窗口。

1.2怀疑 RKUpdateService.apk 更改过导致升级失败:

将 vendor/rockchip/common/apps/RKUpdateService/RKUpdateService.apk 修改回退,重新编译,然后ota升级,发现依旧不行,说明与 RKUpdateService.apk 的更改没有影响。

1.3根据 RKUpdateService.apk 源码确定问题点:

发现 RKUpdateService: doesImageMatchProduct(): verifaPackage faild! 这个报错发生在如下内容中:

		public boolean doesOtaPackageMatchProduct(String imagePath) {
	      	LOG("doesImageMatchProduct(): start verify package , imagePath = " + imagePath);
			
			try{
				RKRecoverySystem.verifyPackage(new File(imagePath), null, null);
			}catch(GeneralSecurityException e){
				LOG("doesImageMatchProduct(): verifaPackage faild!\n" + e.toString());
				return false;	
			}catch(Exception e) {
				LOG("doesImageMatchProduct(): verifaPackage faild!\n" + e.toString());
				return false;
	        }
	        return true;
	    }
由于对java程序不是很了解,只是在网上搜到了 RKRecoverySystem.verifyPackage 这一步只是校验升级包是否合法,不知道具体是校验那些信息,请教了上层同事,给到的反馈是:RKRecoverySystem.verifyPackage 这个是校验升级包签名的。

但是根据1.1点已经可以确定不是签名的问题引起的,所以此条信息无效。

2.1 kernel中宏的确定

通过log看到 kernel/.config 文件中的 CONFIG_DEVMEM=y,但是应该要求应该是 CONFIG_DEVMEM=n。
将如上宏进行修改,重新编译后,使用ota升级,发现有如下报错:

07-25 08:20:39.427 1292 2302 W VintfObject: VintfObject.verify() returns 1: Runtime info and framework compatibility matrix are incompatible: AVB version 1.1 does not match framework matrix 0.0
07-25 08:20:39.427 1292 2302 D RKUpdateService: doesImageMatchProduct(): verifaPackage faild!
如上问题没有遇到过不清楚如何处理,最终在 rk的readme 中搜索到与现在情况一样的报错内容,进行如下修改后 ota升级方可成功:
方法一:
	将 device/rockchip/下的 BOARD_AVB_ENABLE 的 flase 更改为 true
	device/rockchip/rk3399/BoardConfig.mk:37:BOARD_AVB_ENABLE := true
	
方法二:
	关闭 arch/arm64/boot/dts/rockchip/rk3399-tvi3337a-avb.dts 中 avb

详细参考下面内容。

总结:

rk3399 Android9.0 user版本ota无法升级问题的处理方法如下:

方法一:(只有需要过gms的时候才会选择这个方案)

kernel/
    diff --git a/.config b/.config
    index 15bbe7994706..2758cf6e2272 100644
    --- a/.config
    +++ b/.config
    @@ -1920,7 +1920,7 @@ CONFIG_UNIX98_PTYS=y
     # CONFIG_NOZOMI is not set
     # CONFIG_N_GSM is not set
     # CONFIG_TRACE_SINK is not set
    -CONFIG_DEVMEM=y
    +# CONFIG_DEVMEM is not set
     # CONFIG_DEVKMEM is not set


device/rockchip/rk3399/
    diff --git a/BoardConfig.mk b/BoardConfig.mk
    index 8e60bef..f478b14 100755
    --- a/BoardConfig.mk
    +++ b/BoardConfig.mk
    @@ -34,7 +34,7 @@ TARGET_2ND_CPU_VARIANT := cortex-a15
     TARGET_PREBUILT_KERNEL := kernel/arch/arm64/boot/Image
     PRODUCT_PACKAGE_OVERLAYS += device/rockchip/rk3399/overlay

    -BOARD_AVB_ENABLE := false
    +BOARD_AVB_ENABLE := true			#AVB 为false的时候,过不了gms

     # Disable emulator for "make dist" until there is a 64-bit qemu kernel
     BUILD_EMULATOR := false


方法二:(一般采用这个方法实现)

kernel/
    diff --git a/.config b/.config
    index 15bbe7994706..2758cf6e2272 100644
    --- a/.config
    +++ b/.config
    @@ -1920,7 +1920,7 @@ CONFIG_UNIX98_PTYS=y
     # CONFIG_NOZOMI is not set
     # CONFIG_N_GSM is not set
     # CONFIG_TRACE_SINK is not set
    -CONFIG_DEVMEM=y
    +# CONFIG_DEVMEM is not set
     # CONFIG_DEVKMEM is not set
     

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-tvi3337a-avb.dts b/arch/arm64/boot/dts/rockchip/rk3399-tvi3337a-avb.dts
index c32cd07082b0..68f9056e35d2 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-tvi3337a-avb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-tvi3337a-avb.dts
@@ -19,10 +19,6 @@
        compatible = "android,firmware";
        boot_devices = "fe330000.sdhci";
 
-       vbmeta {
-               compatible = "android,vbmeta";
-               parts = "vbmeta,boot,system,vendor,dtbo";
-       };
 
        fstab {
                compatible = "android,fstab";
@@ -31,7 +27,7 @@
                        dev = "/dev/block/by-name/vendor";
                        type = "ext4";
                        mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
-                       fsmgr_flags = "wait,avb";
+                       fsmgr_flags = "wait";
                };
        };
 };

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rk3399 Android9.0 ota升级失败 的相关文章

随机推荐

  • QT 手动触发一个槽函数

    QT 手动触发一个槽函数 1 使用emit关键字即可 创建一个信号 2 然后在需要的地方使用 就可以了 3 要注意的是 4 自定义界面控件的信号与槽函数 在对ui界面的控件添加槽函数的时候 直接右键添加即可 在构造函数内也不会看到conne
  • phpcms thumb缩略图调用图片失真的解决方法

    thumb 函数用于缩放图片 问题起源于调用方式缺少参数 当原图大小与缩略图比例不一致会出现图片失真错位的问题 其表现形式为 string thumb string imgurl int width 100 int height 100 i
  • Redis系列2-单节点安装

    一 下载压缩包 链接 https pan baidu com s 1IvXq xxZI3YckPHxXFwH9w 提取码 hghj 二 打开master主节点 先拍快照 1 配置阿里云yum源 下载配置文件 wget O etc yum r
  • 【C++入门到精通】C++入门 —— 类和对象(了解类和对象)

    目录 一 类和对象的历史由来 二 面向过程和面向对象的初步认识 三 类 1 引子 2 类的定义 3 类的访问限定符及封装 访问限定符 访问限定符解释说明 struct 与 class 的区别 1 默认访问级别 2 继承权限 默认的继承方式
  • wildfly 配置 pinpoint

    wildfly版本10 pinpoint版本1 8 4 set JAVA OPTS JAVA OPTS Djboss modules system pkgs org jboss logmanager com navercorp pinpoi
  • debian和archlinux下使用fcitx5-rime中州韵输入法之双拼及美化

    1 安装fcitx5和fcitx5 rime 中州韵输入法 apt install fcitx5 fcitx5 rime 2 启用fcitx5 debian用im config im config archlinux用 nano xprof
  • 使用反射技术实现的导入Excel文件到数据库的公共方法

    还是干脆 利索直接上代码最实惠 1 定义接口类IImportService public interface IImportService
  • R语言—随机抽样

    文章目录 专题 随机抽样 简单随机抽样 sample函数 srswor函数 srswr函数 分层抽样 专题 随机抽样 简单随机抽样 从总体中抽取样本的方法很多 最常用的方法是简单随机抽样 简单随机抽样 从容量为N的总体中 任意抽取n个单位作
  • consul学习与常用命令和使用教程

    目录 consul是什么 常用命令 API 实例1 新建服务API 注册服务 查询服务 consul是什么 Consul是分布式的 高可用的 可横向扩展的用于实现分布式系统的服务发现与配置 consul就是提供服务发现的工具 做服务发现的框
  • pyqt5按钮点击时传递参数(通过lambda表达式)

    pyqt5中按钮点击事件的响应 常见的是下面的方式 self btn clicked connet self click method 现在想在按钮click的时候能够传递参数 可以借助lambda表达式 self btn clicked
  • 数字IC手撕代码---百题斩

    前言 本篇导览目录 用来索引笔者写的其他手撕代码文章 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手
  • 线性代数的本质(六)——线性空间

    文章目录 线性空间 线性空间 子空间 坐标与同构 线性变换与矩阵 基变换与坐标变换 线性空间 线性空间 Grant 普适的代价是抽象 仔细分析就会发现 关于向量空间的一切概念及有关定理都不依赖于向量的具体表现形式 有序数组 也不依赖于向量加
  • 17、SysTick—系统定时器

    17 SysTick 系统定时器 文章目录 17 SysTick 系统定时器 1 SysTick简介 2 SysTick寄存器介绍 3 SysTick 定时实验 3 1 硬件设计 3 2 软件设计 本章参考资料 Cortex M3 内核编程
  • 【硬件电子】基础知识点学习记录

    眼图 USB信号质量判断通过下面哪个参数来判断 A 眼图 B 电压 C 信噪比 D 失真度 解析 眼图测试主要是用来检测高速串行传输的信号质量 本题选A 眼图 是由于示波器的余辉作用 将扫描所得的每一个码元波形重叠在一起 从而形成眼图 眼图
  • numa节点间CPU利用率不均衡 - wakeup affinity

    最近遇到服务器numa节点间cpu利用率不均衡 清除sched domain的flags中的AFFINE WAKEUPS标志位是一个优化方法 但是如果直接将AFFINE WAKEUPS关闭 将无法充分利用L2 L3 cache缓存命中带来的
  • JMeter软件的安装(超详细教程)

    JMeter软件的安装 超详细教程 1 jdk的安装 1 1jdk的环境变量配置 2 JMeter的安装 1 1JMeter的环境变量配置 3 JMeter的运行 第一个问题 为什么下载JMeter要先下载jdk 因为JMeter是Apac
  • 数据库还原-bak文件

    数据库还原 我知道有俩种方式 一种方式是直接在数据库上操作 一种是在数据库里用代码还原 第一种方法 1 数据库上右击 选择还原文件和文件组 2 选择目标数据库 选择bak文件 确定即可还原数据库 一般情况下这样就可以还原数据库了 但有时会报
  • nginx报错:./configure: error: C compiler cc is not found, gcc 是已经安装了的

    源码安装nginx报错 找不到gcc 但是实际上gcc是存在的 如下 configure checking for OS Linux 3 10 0 957 el7 x86 64 x86 64 checking for C compiler
  • GJB1188A校验C语言算法

    GJB1188A校验和算法 先将2个字节数据拼接为一个字 16字节 然后循环右移 之后模2算法合成 按位异或 就是 运算符 最后再反向移位 循环右移 消息队列中第一个字不移位 第二个右移1位 第三个右移2位 按位异或 相同为0 不同为1 消
  • rk3399 Android9.0 ota升级失败

    rk3399 Android9 0 ota升级失败 问题 在rk3399 Android9 0 项目中需要 ota 功能 user版本编译完ota升级包后 在同版本整包升级时遇到如下问题 抓到的logcat内容如下 1044 2343 D