ota问题汇总

前言

本文包含了在使用 ota升级时常见的一些报错,包含 编译时报错,升级时报错以及升级后不能开机的报错。

1 make otapackage 编译报错

1.第一种报错

cp: cannot stat 'kernel/resource.img':No such file or directory

这个一般是 kernel 编译不会生成 resource.img 的项目导致,需要在 /device/rockchip/common/BoardConfig.mk 里屏蔽下面的内容:

#TARGET_PREBUILT_RESOURCE ?= kernel/resource.img

2.第二种报错

Package target file: out/target/product/rk3188/obj/PACKAGING/target_files_internediates/rk3188-target_files-eng.czd.zip
building image from target_file RECOVERT...
Traceback(most recent call last):
File "./build/tools/releasetools/make_recovery_patch", line 68, in <module>
main(sys.argc[1:])
File "./build/tools/releasetools/make_recovery_patch", line 39, in main
input_dir,"RECOVERY"
File "/home/czd/rk3188_android5.1/build/tools/releasetools/common.py",line 419, in GetBootableImage
info_dict)
File "/home/czd/rk3188_android5.1/build/tools/releasetools/common.py",line 376,in BuildBootableImage
p4 = Run(sign_cmd)
File "/home/czd/rk3188_android5.1/build/tools/releasetools/common.py",line 86,in Run
return subprocess.Pspen(args,kwargs)
File "/usr/lib/python2.7/subprocess.py",lin 710, in init
errread,errwrite)
File "/usr/lib/python2.7/subprocess.py",lin 1327,in _execute_child
raise child_exception
OSError:[Errno 2]No such file or directory
make:*[out/target/product/rk3188/obj/PACKAGING/target_files_intermediates/rk3188-target_files-eng.czd.zip] Error 1
	1. make failed to build some target(09:50(mm:ss))####

这个问题一般在项目第一次make otapackage时才可能出现。

先到 build/tools/drmsigntool/目录下 mm -B 一下,再执行 make otapackage

3.第三种报错

ERROR:signapk.jar failed:return code 1

这个是 java 版本出错。Android4.4 用java 1.6 ; android 5.1 用java 1.7 ;android5.1以上用 java 1.8

4.第四种报错

loaded device-specific extensions from /tmp/targetfiles-bn70qt/META/releasetools.py
Traceback(most recent call last);
File "./build/tools/releasetools/ota_from_target_file",line 1577,in <module>
main(sys.argv[1:])
File "./build/tools/releasetools/ota_from_target_file",line 1534,in main
WriteFullOTAPackage(input_zip,output_zip)
File "./build/tools/releasetools/ota_from_target_file",line 493,in WriteFullOTAPackage
info_dict=OPTIONS.info_dict)
FILE "/service3/hotack/rk3288_5.1_backup_build/tools/releasetools/common.py",line 880,in init self.module = imp.load_module("device_specific", info)
File "/tmp/targetfiles-bn70qt/META/releasetools.py",line 138
try:
^
IndentationError:unindent does not match any outer indentation level
make:**[out/target/product/rk3288_box/rk3288_box-ota-eng.hotack.zip]Error 1

上述报错是因为 device/rockchip/common/releasetools.py中的 138 行的 try 没有对齐,再这个的 try 前加个空格。

即:

device/rockchip/common
--- a/releasetools.py
+++ b/releasetools.py
@@ -135,7 +135,7 @@ def IncrementaOTA_InstallEnd(info):
	else:
		print "trust unchanged; skipping"
-  try:
+	try:
		loader_uboot_target = info.target_zip.read("uboot.img")
		
	except KeyError:
		loader_uboot_target = None

注意:如果之前有make otapackage 过,则需要先删掉 out/target/product/rkxxx/obj/PACKAGING/ 目录再编译。

2 升级报错

(1) 报错找不到升级文件。类似 “/mnt/internal_sd/update.zip is not exited!”

​ 对于 android 4.4 的代码,请假查 bootable/recovery 下

--- a/recovery.cpp
+++ b/recovery.cpp
@@ -2305,6 +2305,10 @@int do_update_rkimage(char *pFile)
	ui->SetProgressType(RecoveryUI::DETERMINATE);
		if (!bSDMounted)
			ensure_sd_mounted();
+		if(ensure_path_mounted(pFile) == -1){
+			printf("the path %s is unmounted...\n",pFile);
+			return INSTALL_ERROR;
+		}
		if (access(pFile,F_OK)!=0)
		{
			ui->Print("%s is not existed!\n",pFile)

注意,有些版本中写的是“if(ensure_path_mounted(pFile) == 0”,请注意修改。

(2) 报错类似:

librkupdate_INFO:CRKUsbComm–>is emmc.

librkupdate_ERROR:CRKUsbComm–>open /dev/rknand_sys_storgage failed,err=2

这种情况是使用 emmc 的机器,drmboot…ko 文件没有加载,或这个文件太旧。

这 时 先 检 查 device\rockchip\rksdk\recovery\etc\init.bootmode.emmc.rc 中 有 没 有“insmod /drmboot.ko”这句代码,若没有,则在 on fs 下一行增加,同时修改或删除 out 下的同名文件。

若开机 logo 中有“drmboot: module license ‘unspecified’ taints kernel”,证明 drmboot.ko 有加载,但加载失败。基本是 drmboot.ko 文件太旧的原因,需更新 dirmboot.ko。

(3) 报错 “script aborted: Can’t install this package (一个时间点) over newer build (另一个时间点),如:

“script aborted: Can't install this package (Sat May 14 11:08:21 CST 2016) over newer build (Sat May 14 11:35:15 CST 2016)”

这 个 是 因 为 要 升 级 的 升 级 包 没 有 机 器 中 原 本 的 固 件 日 期 新 , 把out/target/product/rkxxx/system/build.prop 删掉后重新编译生成 update.zip

(4) 报错,类似:

Local model: RKAAA

Update model: RKBBB

这个是因为升级的固件 modle 与机器中固件的 modle 不一致,一般出现在升级 update.img 时(常见于 sd 升级卡升级。如果是把 modle 不相同的 update.img 放到机器中,开机状态下不会提示升级)。所以,在打包 update.img 时使用的 parameter 中的 MACHINE_MODEL 与机器中固件的机器型号 ro.product.model 必须要一致。

(5) 报错“Can’t find misc”

这种情况,只在 rk3188 上 ota 升级时出现过,是因为使用的 flash 驱动比较老。升级界面看,进度条已经跑完。

可在 bootable/recovery 下,按如下修改

--- a/mtdutils/mtdutils.c
+++ b/mtdutils/mtdutils.c
@@ -133,15 +133,16 @@ mtd_scan_partitions()
	char mtdname[64];
	mtdname[0] = '\0';
	mtdnum = -1;
-
+/*
#ifndef USE_OLD_NAND_DRIVER
	matches = sscanf(bufp, "rknand%d: %x %x \"%63[^\"]",&mtdnum, &mtdsize, &mtderasesize, mtdname);
	printf("matches %d, mtdnum %d, mtdsize %X, mtderasesize %X, mtdname %s\n",matches, mtdnum, mtdsize, mtderasesize, mtdname);
-#else
+#else*/
	matches = sscanf(bufp, "mtd%d: %x %x \"%63[^\"]",&mtdnum, &mtdsize, &mtderasesize, mtdname);
-#endif
+	printf("matches %d, mtdnum %d, mtdsize %X, mtderasesize %X, mtdname %s\n",
matches, mtdnum, mtdsize, mtderasesize, mtdname);
+//#endif

(6) 差异包升级

先检查 build 目录下,下面的代码有没有更新:

--- a/tools/releasetools/make_recovery_patch
+++ b/tools/releasetools/make_recovery_patch
@@ -15,6 +15,7 @@
# limitations under the License.

import sys
+import shutil

if sys.hexversion < 0x02070000:
	print >> sys.stderr, "Python 2.7 or newer is required."
@@ -47,7 +48,23 @@ def main(argv):
		f.write(data)
	common.MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img)
+
+def copy_patch_sh(argv):
+	# description: copy recovery-from-boot.p and install-recovery.sh
+	out_dir_path = argv[1]
+	pre_path_list = out_dir_path.split("obj")
+	pre_path = pre_path_list[0]

+	patch_src = os.path.join(out_dir_path,"SYSTEM/recovery-from-boot.p")
+	patch_dst = os.path.join(pre_path,"system/recovery-from-boot.p")

+	sh_src = os.path.join(out_dir_path,"SYSTEM/bin/install-recovery.sh")
+	sh_dst = os.path.join(pre_path,"system/bin/install-recovery.sh")

+	shutil.copyfile(patch_src,patch_dst)
+	shutil.copyfile(sh_src,sh_dst)

if __name__ == '__main__':
main(sys.argv[1:])
+ copy_patch_sh(sys.argv[1:])
+

如果上面的代码更新过,且完整包可以正常升级,那一般是因为机器中烧写的固件与生成差异包使用的 old 包不匹配。

比如;在 make 后手动对 out 目录进行了删除、修改等操作;或者 kernel 修改后,android 没有 make,导致 boot.img 中的 kernel 与机器中的 kernel 不一致;或者生成固件时没有带 ota 参数(./mkimage.sh ota);或者 update.img 有签名,但没有把签名 key 放到 build\target\product\security 中;或者 update.img 没有签名,但却放了签名 key 到 build\target\product\security 中。

如果确定签名 key 没有放错,可按下面的步骤操作一遍

​ 1)、make && make otapackage && ./mkimage.sh ota

​ 2)、out/target/product/rkXX/obj/PACKAGING/target_files_intermediates 目录下的 rkxx-target_files-eng.xx.zip 改名为 old.zip

​ 3)、修改代码后,再 make && make otapackage

​ 4)、将第 1 步中生成的 img 是用工具烧入机器。再生成第 2 步与第 3 步之间的差异包放到机器中升级。

3 升级后开不了机

​ 升级后,机器起不来,一直进 recovery 模式。

​ Uboot 中的 Log 提示

boot/recovery image sha mismatch!
Unable to boot:boot
try to start recovery

这个是 uboot 代码中加了一个 check 固件的代码后出现的。Build 目录下可按下面修改:

--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -318,6 +318,11 @@ def BuildBootableImage(sourcedir, fs_config_file, info_dict=None):
	assert p1.returncode == 0, "mkbootfs of %s ramdisk failed" % (targetname,)
	assert p2.returncode == 0, "minigzip of %s ramdisk failed" % (targetname,)
+	cmd = ["truncate", "-s", "%4", ramdisk_img.name]
+	p3 = Run(cmd)
+	p3.communicate()
+	assert p3.returncode == 0, "truncate ramdisk failed"
+ 
	# use MKBOOTIMG from environ, or "mkbootimg" if empty or not set
	mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg"

除此之类基本是 update.zip 本身就有问题。可以执行如下命令

​ make && make otapackage && ./mkimage.sh ota

将生成的 img 烧到机器中看能不能正常开机,若能,再将此步生成的完整包升级。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进阶牛牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值