前言
本文包含了在使用 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 烧到机器中看能不能正常开机,若能,再将此步生成的完整包升级。