在安卓OTA升级文件的制作中提到updater-script的功能。这里详细介绍脚本是如何生成的。
updater-script是我们升级时所具体使用到的脚本文件,它主要用以控制升级流程的主要逻辑。具体位置位于更新包中/META-INFO/com/google/android/目录下,在我们制作升级包的时候产生。
前面有个介绍。/build/tools/releasetools/目录下的模块edify_generator作为一个抽象的脚本生成器,用来生成edify脚本。这里的edify脚本指的就是updater-script-升级安装脚本,它是一个文本文件。而edify是用于从.zip文件中安装CyanogenMod和其它软件的简单脚本语言。edify脚本不一定是用于更新固件。它可以用来替换/添加/删除特定的文件,甚至格式分区。通常情况下,edify脚本运行于用户在恢复模式中选择“刷写zip”时。
script = edify_generator.EdifyGenerator(3, OPTIONS.info_dict)
那么updater-script中如何自动一步一步生成每一个脚本指令或者脚本语句呢,这里我们简单举几个例子给大家作为一个参考:
对比固件和ota升级包的版本,ota版本低则不升级
上面的AssertOlderBuild是自己定义的一个方法,主要功能是比较ota升级包的ro.custom.build.version 和系统的ro.custom.build.version版本好,ota版本高则升级,否则提示不能升级
//从OPTIONS.info_dict中获取当前ota的ro.custom.build.version,ro.custom.build.version为build.prop在前期已经解析到OPTIONS.info_dict中
custom_version=GetBuildProp("ro.custom.build.version", OPTIONS.info_dict)
script.AssertUpVersion(custom_version) //调用edify_generator.py中定义的AssertUpVersion
def AssertUpVersion(self, updateVersion):
"""Assert that the build on the device is older
than the given ro.custom.build.version."""
cmd = (
'(greater_than_cur_ver("%s", getprop("ro.custom.build.version"))) || '
'abort("Can\'t install this package \\"%s\\" over upper version '
'build (" + getprop("ro.custom.build.version") + ").");'
) % (updateVersion,updateVersion) #后面为传入的参数
self.script.append(cmd)
greater_than_cur_ver为在recovery中注册的命令
//bootable\recovery\edify\expr.c
Value* GreaterThanCurrentVersion(const char *name,State *state ,int argc, Expr* argv[]){
char* currentVersion=NULL;
char* updateVersion=NULL;
int len =0,i=0;
if(argc!=2){
free(state->errmsg);
state->errmsg = strdup("GreaterThanCurrentVersion expects 2 arguments");
return NULL;
}
/*
verson strings is such as :StreamBox_V2.25
StreamBox_V2.26 is greater than StreamBox_V2.25 .
currentVersion and updateVersion must have the same format
*/
currentVersion=argv[1];
updateVersion=argv[0];
printf("currentVersion=%s updateVersion =%s \n", currentVersion,updateVersion);
len = strlen(currentVersion) ;
for(i=0 ; i<len ; i++){
if(currentVersion[i]<updateVersion[i]){
//break;
printf( "len=%d updateVersion is greater than currentVersion\n", len);
return StringValue(strdup("ok"));
}
}
printf("exit GreaterThanCurrentVersion");
return NULL;
}
void RegisterBuiltins() {
RegisterFunction("ifelse", IfElseFn);
RegisterFunction("abort", AbortFn);
RegisterFunction("assert", AssertFn);
RegisterFunction("concat", ConcatFn);
RegisterFunction("is_substring", SubstringFn);
RegisterFunction("stdout", StdoutFn);
RegisterFunction("sleep", SleepFn);
RegisterFunction("less_than_int", LessThanIntFn);
RegisterFunction("greater_than_int", GreaterThanIntFn);
RegisterFunction("greater_than_cur_ver",GreaterThanCurrentVersion);//注册命令!
}
最终会在脚本中生成如下语句:StreamBox_V2.26为当前ota包的版本