分享Android recovery updater-script进度条函数的使用经验

来源:互联网 发布:网络犯罪的主要类型有 编辑:程序博客网 时间:2024/06/13 17:44

特别说明:
1.zyphio原创文章,转载请注明作者和出处;
2.因为加入TWRP Recovery进行测试,得出一些新的观点,特此更新,2014年1月19日;
3.以下文章中的“M”的赋值,在CWM Recovery中M=1.33,在TWRP Recovery中M=1.0。


发现从网上下载的众多Android手机卡刷包在刷机时,进度条的显示很混乱。有的刷机时没有进度条,有的显示超出屏幕,即使有显示,也大多与实际工作进度不符,而这个问题涉及到Android recovery zip刷机包中的updater-script里的两个函数——show_progress和set_progress。本人搜索了一下国内的资料,发现对这两个函数的解释都源自一份“Edify语法简介”的翻译,参数说明的表达也很模糊。为此,我搜索了一下国外的资料,本人水平有限,源码看不太明白,但发现国外也已经有人提出来Edify中这两个函数的设计并不算很完善。后来在xda-developers论坛中看到有人通过实验去探索这两个函数的正确用法,虽然结果也不算太完美,但他的测试方法给我很大启发。为此我测试了近30种写法,总算得出这两个函数的效果相对好的使用方法(当然,受不同Recovery的影响,不排除有些情况我没测试到,功能理解上可能也不算全面,难免有错漏,还望各位指正)。



一、函数详解


函数语法: 
show_progress(frac, sec)
用途:
显示其下一行代码至下一个show_progress之间的所有命令代码执行进度。
参数详解: 
frac 进度条增减值,取值在0至M间,多条show_progress的情况下,这个值累积起来不要大于M(除非用set_prograss执行进度退回),否则显示的进度条会超出进度条边框甚至超出屏幕,最好累积等于M就刚好进度全满,此值不可以是负数;
Sec  至下一个show_progress之间的所有命令代码执行所耗时间的预测值,以秒为单位,也相当于进度条增减值frac动态走动所用时间,如果这个预测值小于代码实际执行所用时间,则进度条停止,等待代码执行完成;如果大于,则进度条会跳跃前进。


函数语法: 
set_prograss(frac)
用途:
set_prograss(frac)命令执行时,进度条指示的进度。
参数详解: 
frac 进度值,取值最小0.0,取值最大M。


二、区别对比


show_progress可用于分段动态显示进度,每一段进度条走动是动态增减,即从一点匀速走动到另一点;
set_progress可用于分段静态显示进度,每一段进度条走动是跳动的,可从一点直接跳动到另一点。


三、使用提示


1.经过多次测试后发现,TWRP Recovery对show_progress函数的支持可能存在问题,每一次有动态进度效果,但也显示不正确,如果不重启,则随后刷入的刷机包中若含有show_progress函数,则都无效,进度条直接显示全满(到来像是TWRP Recovery的bug)。所以在TWRP Recovery,推荐只使用set_progress函数,才不会出现第二次刷入时进度条显示全满的问题。
2.适用于CMW Recovery的刷机包,要纯粹表示刷机进度的话,推荐优先或仅使用show_progress函数,能有很好的动态进度效果。
3.为了重新定位进度值,或表示卸载,或者是多重进度等,例如,为了让进度从100%往回走到0%,或100%后再从0%再走一次等特殊、复杂需要,好像只能使用set_prograss函数。
4.这二个函数混用小心些,容易进度没显示或进度错乱,甚至脚本出错。


四、实际例子


本例子适用CMW Recveory,其中show_progress的预测值小于代码的实际执行时间,若“大于”则会有进度跃进的效果。


ui_print(" ");ui_print("PROGRESS BAR USAGE");ui_print("Powered by zyphio");ui_print("2013-12-17");ui_print("");show_progress(0.1, 1);ui_print("  Please Wait ...");sleep(2);show_progress(0.6, 8);ui_print("  Updating system ...");sleep(10);show_progress(0.3, 4);ui_print("  Updating data ...");sleep(6);show_progress(0.1, 2);ui_print("  Updating cust ...");sleep(4);show_progress(0.1, 2);ui_print("  Updating boot ...");sleep(4);show_progress(0.13, 1);ui_print("  Please Wait ...");sleep(2);ui_print("");ui_print("  Completed!");





0 0