最近客户反馈,编译32位的android系统,在recovery中执行恢复出厂设置的时候失败了,失败的打印提升信息如下。
Formatting /data...
[ 2.191404] E:get_file_size: invalid size -1289764864 for /dev/block/data
[ 2.207430] Data wipe failed.
根据打印提示,意识是说获取data分区的size是无效的。我们来看看这个函数get_file_size bootable/recovery/roots.cpp
static ssize_t get_file_size(int fd, uint64_t reserve_len) {
struct stat buf;
int ret = fstat(fd, &buf);
if (ret) return 0; ssize_t computed_size;
if (S_ISREG(buf.st_mode)) {
computed_size = buf.st_size - reserve_len;
} else if (S_ISBLK(buf.st_mode)) {
computed_size = get_block_device_size(fd) - reserve_len;
} else {
computed_size = 0;
} return computed_size;
}
这个ssize_t是跟系统的位数相关的,当时32位的系统时,ssize_t的大小为U32, 那么此时能够表示的最大的长度为2^32-1=4294967295=4095.99M=4G 也就是说,当时32位的系统时,ssize_t能够保存的最大值为4G,当data分区的大小超过4G的时候, ssize_t就无法正常保存的获取的data分区的大小,那么也就会出错了。
 
而实际项目上面给data分区的大小为11G+, 那么自然就会出错了,我们把使用ssize_t的地方换成uint64_t即可 patch如下:
diff --git a/roots.cpp b/roots.cpp
index 25d9d7e..5197ccb 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -182,12 +182,12 @@ static int exec_cmd(const char* path, char* const argv[]) {
return WEXITSTATUS(status);
} -static ssize_t get_file_size(int fd, uint64_t reserve_len) {
+static uint64_t get_file_size(int fd, uint64_t reserve_len) {
struct stat buf;
int ret = fstat(fd, &buf);
if (ret) return 0; - ssize_t computed_size;
+ uint64_t computed_size;
if (S_ISREG(buf.st_mode)) {
computed_size = buf.st_size - reserve_len;
} else if (S_ISBLK(buf.st_mode)) {
@@ -234,7 +234,7 @@ int format_volume(const char* volume, const char* directory) {
close(fd);
} - ssize_t length = 0;
+ uint64_t length = 0;
if (v->length != 0) {
length = v->length;
} else if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0) {

到此,问题解决。

recovery 恢复出厂设置失败Data wipe failed的更多相关文章

  1. recovery 强制执行恢复出厂设置(Rescue Party)

    有时候我们在系统正常运行的时候,突然跑到recovery里面了,并且停在了如下界面:   Can't load Android system. Your data may be corrupt. If ...

  2. Android恢复出厂设置流程分析【Android源码解析十】

    最近看恢复出厂的一个问题,以前也查过这方面的流程,所以这里整理一些AP+framework层的流程: 在setting-->备份与重置--->恢复出厂设置--->重置手机---> ...

  3. OpenWRT 恢复出厂设置命令

    如果通过无线或者有线口无法连接到router,可以用恢复某些设置重新设置路由器. 1. 开机,等着一个工作灯亮的时候立即按下rest键2秒,然后就开始拼命闪烁,很好现在进入failsafe模式了. 2 ...

  4. U8800 手机恢复出厂设置出现轻触Android开始页面 处理办法

    U8800 恢复出厂设置出现轻触Android开始页面处理办法 问题现象 Huawei 手机U8800刷机后,点击恢复出厂默认设置后,出现了一个一直停留在“欢迎使用Android 轻触 Android ...

  5. [置顶] 不刷机让越狱后的iphone恢复出厂设置

    iphone越狱后,设置里的清除所有内容和设置选项是不生效的,选上之后菊花转个不停,只能强制退出,还有白苹果的危险. 若想恢复出厂设置有两个办法: 一.刷机 最直接的办法,我觉得itunes配合ito ...

  6. 苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置

    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置,首先要做好如下的准备: 第一:数据的备份:第二:保证正常的wifi连接:第三:有线的鼠标键盘连接: 具体恢复操作步骤: 步骤一:电脑 ...

  7. HTC 328T 如何恢复出厂设置

    设置-存储-恢复出厂设置(在存储的最下面,往下拉)

  8. HILLSTONE sg6000 g5150 怎么恢复出厂设置

    hillstone恢复出厂设置的方法(忘记密码的情况) 口令丢失情况下的处理 如果口令丢失,用户无法登录安全路由器进行配置,请在安全路由器刚启动时按住 CLR 按键大约 5 秒,使设备恢复到出厂配置. ...

  9. H3C交换机恢复出厂设置

    reset saved-configuration reboot 恢复出厂设置后查看当前配置: ..............................

随机推荐

  1. python 中numpy中函数hstack用法和作用

    定义: Stack arrays in sequence horizontally (column wise). Take a sequence of arrays and stack them ho ...

  2. Ubuntu 18.0.4安装docker

    第一步:如果之前安装过docker,执行下面命令删除 apt-get remove docker docker-engine docker.io 删除后执行sudo apt-get update更新软 ...

  3. Java Web——过滤器

    <Java Web开发技术应用——过滤器> 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进 ...

  4. FF笔试题

    一.单选题 1.下列关于继承的描述错误的是(  ) A.  在Java中允许定义一个父类的引用,指向子类对象 B.  在Java中继承是通过extends关键字来描述的,而且只允许继承自一个直接父类 ...

  5. 插入排序——Insertion Sort

    基本思想: 在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 过程: 平均时间复杂度:O(n2) jav ...

  6. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十二):链路追踪(Sleuth、Zipkin)

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个 ...

  7. Hystrix隔离策略

    Hystrix的资源隔离策略分为两种:线程池和信号量.说到资源隔离,我们就要明白为什么需要资源隔离. 在一个分布式系统中,服务之间都是相互调用的,如下图所示:例如,我们容器(Tomcat)配置的线程个 ...

  8. 深度学习论文翻译解析(二):An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition

    论文标题:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application ...

  9. 一文看懂https如何保证数据传输的安全性的【转载、收藏】

    一文看懂https如何保证数据传输的安全性的   一文看懂https如何保证数据传输的安全性的 大家都知道,在客户端与服务器数据传输的过程中,http协议的传输是不安全的,也就是一般情况下http是明 ...

  10. That Nice Euler Circuit(LA3263+几何)

    That Nice Euler Circuit Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu D ...