谷歌本身对Android内部相关镜像文件头有字节的规定限制。
近期发现在项目文件rlk_projects\cxlite_z3713_a1_zmvf#####\ProjectConfig.mk中:
CUSTOM_BUILD_VERNO = CY-CxAir-z3713-L 工具校验的一个编译版本名,L没有显示出来,导致使用工具加载代码时校验匹配出错。
最后发现该长度在文件bootimg.h被定义为最长16字节,而且在文件build\core\Makefile中要求,只能为15个字节,如下代码:
build\core\Makefile:
# Pick a reasonable string to use toidentify files.
ifneq "" "$(filtereng.%,$(BUILD_NUMBER))"
#BUILD_NUMBER has a timestamp in it, which means that
#it will change every time. Pick a stablevalue.
FILE_NAME_TAG := eng.$(USER)
else
FILE_NAME_TAG := $(BUILD_NUMBER)
Endif
ifeq """$(CUSTOM_BUILD_VERNO)"
CUSTOM_BUILD_VERNO := $(BUILD_NUMBER)
CUSTOM_BUILD_VERNO := $(subst eng.$(USER).,,$(CUSTOM_BUILD_VERNO))
endif
CUSTOM_BUILD_VERNO_HDR := $(shell echo$(firstword $(CUSTOM_BUILD_VERNO)) | cut -b 1-15) //这里不写成1-16,我想有\0的关系
关于详细说明:
1、只显示文件中1-10位置的字符(省略10,到末尾):
cut -c 1-10 <file>
2、只显示文件中1-10位置的字节:
cut -b 1-10 <file>
英文环境中和-c选项一样,但国际语言环境中有区别(如中文,字节和字符含义不同)。
3、显示第1-3字段
cut -f 1-2 <file>
缺省以TAB为字段分隔符,可以用-d指定分隔符。
在文件vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\include\platform\bootimg.h中 [好像在kernel中也有相关的定义]
#define BOOT_MAGIC "ANDROID!"
#define BOOT_MAGIC_SIZE 8 //镜像头的限制,一定是8个以内
#define BOOT_NAME_SIZE 16 //软件编译的名字一定要小于16,注意\0
#define BOOT_ARGS_SIZE 512 //命令行参数一定小于512字节
struct boot_img_hdr
{
unsigned charmagic[BOOT_MAGIC_SIZE];
unsignedkernel_size; /* size in bytes */
unsignedkernel_addr; /* physical load addr */
unsigned ramdisk_size;/* size in bytes */
unsigned ramdisk_addr;/* physical load addr */
unsignedsecond_size; /* size in bytes */
unsignedsecond_addr; /* physical load addr */
unsignedtags_addr; /* physical addr for kerneltags */
unsignedpage_size; /* flash page size weassume */
unsigned unused; /* future expansion: should be 0 */
unsigned os_version;
unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */
unsigned charcmdline[BOOT_ARGS_SIZE];
unsigned id[8]; /*timestamp / checksum / sha1 / etc */
};
/*
** +-----------------+
** | boot header | 1 page
** +-----------------+
** | kernel | n pages
** +-----------------+
** | ramdisk | m pages
** +-----------------+
** | second stage | o pages
** +-----------------+
**
** n = (kernel_size + page_size - 1) / page_size
** m = (ramdisk_size +page_size - 1) / page_size
** o = (second_size +page_size - 1) / page_size
**
** 0. all entities arepage_size aligned in flash
** 1. kernel and ramdisk arerequired (size != 0)
** 2. second is optional(second_size == 0 -> no second)
** 3. load each element(kernel, ramdisk, second) at
** the specified physicaladdress (kernel_addr, etc)
** 4. prepare tags attag_addr. kernel_args[] is
** appended to the kernel commandline in thetags.
** 5. r0 = 0, r1 =MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0:jump to second_addr
** else: jump to kernel_addr
*/