问题背景:

因项目开发及测试需要,设备升级频率比较高,升级出现失败的情况肯定是有的,原因用多方面,如:故意使用非法的升级包,升级版本不匹配等等。

出现升级失败问题后,对于手机用户来说可以选择重启手机即可,而我们使用设备及环境不允许人为对其经常操作,所以如果升级失败,界面就停留在recovery界面,设备就无法正常工作。

解决方案:

设备需要实现一种自动恢复机制,自动重启设备,恢复到正常界面。

进入recovery升级界面,延迟20s后进行设备重启进入正常界面。

具体步骤:

android设备升级失败,往往会进入一个躺倒着的机器人界面:

进而进入到升级异常的界面,如下图:

对于我们项目的设备,该界面是无法进行选项操作的,一般到此界面,下发都有一些升级失败的提示,我们可以根据提示,在android源码里面找到该界面的显示绘制的地方。或者在利用界面关键词"Reboot system now"在android源码中搜索,这里我直接在androidxref上搜索,如下:

这样初步定位到该界面显示的代码在:bootable/recovery/下。

进一步分析源码,很容易得到界面选择的源码(http://androidxref.com/7.0.0_r1/xref/bootable/recovery/recovery.cpp#1046):

10251026// Return REBOOT, SHUTDOWN, or REBOOT_BOOTLOADER. Returning NO_ACTION1027// means to take the default, which is to reboot or shutdown depending1028// on if the --shutdown_after flag was passed to recovery.1029static Device::BuiltinAction1030prompt_and_wait(Device* device, int status) {1031 for (;;) {1032 finish_recovery(NULL);1033 switch (status) {1034 case INSTALL_SUCCESS:1035 case INSTALL_NONE:1036 ui->SetBackground(RecoveryUI::NO_COMMAND);1037 break;10381039 case INSTALL_ERROR:1040 case INSTALL_CORRUPT:1041 ui->SetBackground(RecoveryUI::ERROR);1042 break;1043 }1044 ui->SetProgressType(RecoveryUI::EMPTY);10451046 int chosen_item = get_menu_selection(nullptr, device->GetMenuItems(), 0, 0, device);10471048 // device-specific code may take some action here. It may1049 // return one of the core actions handled in the switch1050 // statement below.1051 Device::BuiltinAction chosen_action = device->InvokeMenuItem(chosen_item);10521053 bool should_wipe_cache = false;1054 switch (chosen_action) {1055 case Device::NO_ACTION:1056 break;10571058 case Device::REBOOT:1059 case Device::SHUTDOWN:1060 case Device::REBOOT_BOOTLOADER:1061 return chosen_action;10621063 case Device::WIPE_DATA:

也可以看到源码(http://androidxref.com/7.0.0_r1/xref/bootable/recovery/recovery.cpp#155)

153 * 6. finish_recovery() erases BCB154 * -- after this, rebooting will (try to) restart the main system --155 * 7. ** if install failed **156 * 7a. prompt_and_wait() shows an error icon and waits for the user157 * 7b; the user reboots (pulling the battery, etc) into the main system

头文件注释说明,如果安装失败,recovery.cpp中prompt_and_wait会显示失败错误信息并等待人为操作。

而我们要做的就是将1046行get_menu_selection人为选择改成自动选择重启。

首先看下get_menu_selection的实现:

658static int659get_menu_selection(const char* const * headers, const char* const * items,660 int menu_only, int initial_selection, Device* device) {661 // throw away keys pressed previously, so user doesn't662 // accidentally trigger menu items.663 ui->FlushKeys();664665 ui->StartMenu(headers, items, initial_selection);666 int selected = initial_selection;667 int chosen_item = -1;668669 while (chosen_item < 0) {670 int key = ui->WaitKey();671 int visible = ui->IsTextVisible();672673 if (key == -1) { // ui_wait_key() timed out674 if (ui->WasTextEverVisible()) {675 continue;676 } else {677 LOGI("timed out waiting for key input; rebooting.");678 ui->EndMenu();679 return 0; // XXX fixme680 }681 }682683 int action = device->HandleMenuKey(key, visible);684685 if (action < 0) {686 switch (action) {687 case Device::kHighlightUp:688 selected = ui->SelectMenu(--selected);689 break;690 case Device::kHighlightDown:691 selected = ui->SelectMenu(++selected);692 break;693 case Device::kInvokeItem:694 chosen_item = selected;695 break;696 case Device::kNoAction:697 break;698 }699 } else if (!menu_only) {700 chosen_item = action;701 }702 }703704 ui->EndMenu();705 return chosen_item;706}

可以看到:选项超时返回的key值是-1

(if (key == -1) { // ui_wait_key() timed out).

我们可以继续跟踪代码(ui->WaitKey()),可以得知,在此界面等待用户选择的超时时间是120s,源码(http://androidxref.com/7.0.0_r1/xref/bootable/recovery/ui.cpp#41)。

#define UI_WAIT_KEY_TIMEOUT_SEC 120

故根据这个代码思路,我这边的修改方案:

1.将选择界面超时时间修改为20s.即:

#define UI_WAIT_KEY_TIMEOUT_SEC 20

2.将get_menu_selection代码中等待选项超时后,默认选择项改为0,代码如下:

可以看到代码677行,日志打印的意思:等待输入超时,重启,也是return 是0。可见,原生android在有菜单选项时android默认的continue等待用户继续输入,无菜单选项时默认返回的也是重启。

我们这里因为菜单可见,所以走到675行的continue,进而继续等待用户输入,所以我们这里修改方案改成等待用户选择超时的时候直接return 0给默认选择了重启从而达到目的。

android 如何构建半屏显示的界面_如何实现android设备进入recovery界面后自动重启...相关推荐

  1. MTK android 9.0半屏显示 单手模式

    公司想做一个半屏功能,就是下拉屏幕显示一半:刚开始在网上找了很久,都没有相关的经验可以借鉴:最后只能靠自己去源码里面寻找方法了: 不多说,直接上代码: 1)先上触发调用的方法 try { System ...

  2. Android进recovery模式后自动重启

    背景 Platform: RK3399 OS: Android7.1.2 Kernel: v4.4.103 产品偶发会进recovery模式,比如升级失败等,进recovery模式后,需要根据提示人为 ...

  3. 模仿UC浏览半屏显示push消息过来的网页

    背景 不少浏览器在显示push消息时,采用半屏显示,顶部会露出一截,同时页面支持上下滑动,下滑还可以关闭页面. 下面是UC浏览器的效果: 我实现的效果 实现方案 方案一:继承FrameLayout,覆 ...

  4. android Q HIDL(小屏显示)

    android Q HIDL(小屏显示) 手机设备上添加了一个小的lcd屏,需求是可以显示文字与图片.且可以在每个应用里面使用,过CTS,那么可供选择的实现方式也就没几种了. (a)过cts的话最好是 ...

  5. android华为手机全屏显示

    解决android华为提示全屏显示 最近发现很多应用在第一次安装之后,都会提示一个 [ 全屏显示] .一看,好像也没啥,但是对开发应用的开发者来说.感觉被打了一巴掌一样.自己好好编码完成的应用.出来个 ...

  6. 华为笔记本开发android,EMUI 11曝光!华为魔改 Android 11:息屏显示、智慧分屏焕然一新...

    EMUI 11曝光!华为魔改 Android 11:息屏显示.智慧分屏焕然一新 2020-08-29 10:25:30 1点赞 0收藏 0评论 8月28日消息,据国内知名数码博主透露,华为对即将发布的 ...

  7. 解决android华为提示全屏显示

    原文https://blog.csdn.net/xu_coding/article/details/82889782 解决android华为提示全屏显示 最近发现很多应用在第一次安装之后,都会提示一个 ...

  8. android11息屏显示,EMUI 11曝光!华为魔改 Android 11:息屏显示、智慧分屏焕然一新...

    8月28日消息,据国内知名数码博主透露,华为对即将发布的全新 EMUI 11 操作系统进行大量魔改,其中包括息屏显示 AOD 设计.应用智慧分屏.系统全面翻译等功能服务,都有非常大的变化,在实用性上也 ...

  9. Android studio中全屏显示

    android中设置全屏显示的方法## 标题 在MainActivity中添加如下代码 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FUL ...

最新文章

  1. __attribute__ ((packed))
  2. 运行python需要网吗-浏览器运行python脚本吗
  3. 去掉前后空格_mysql批量去掉某个字段字符中的空格
  4. 前端学习(1488):jsonp回顾
  5. LeetCode 545. 二叉树的边界(前序+后序)*
  6. python视频人脸识别教程_Python学习笔记之视频人脸检测识别实例教程
  7. 图神经网络(一)--综述
  8. Core 提交返回500 问题 记录 来自网上文章
  9. 【身份证识别】基于matlab BP神经网络身份证号码识别【含Matlab源码 1344期】
  10. php值班系统,php简单的值日值班处理方法
  11. pcb成型板aoi检测_PCB设备:一款新的自动光学检测(AOI)系统
  12. 题解:100元买100只鸡,公鸡4元一只,母鸡3元一只,小鸡1元3只,问公鸡,母鸡,小鸡各买了多少只?
  13. jojo第七部dio怎么复活_JOJO杂谈:DIO复活的那些年到底在干什么?
  14. Cocos2d-x面试题
  15. Selenium中的EC模块
  16. linux系统无法识别固态硬盘_重装Linux操作系统为什么识别不了硬盘
  17. Canvas笔画向量交互动画效果,随着鼠标描绘轨迹
  18. mysql navicat怎么打开文件_navicat怎么打开sql
  19. 苹果id提示购买无法完成怎么办?
  20. 【面试流水账】一年半经验前端年底求职路

热门文章

  1. 去985高校当老师需要什么条件?
  2. php源码目录在哪,PHP源代码目录结构简介(原创)
  3. 恋与制作人元旦服务器,恋与制作人元旦节有哪些活动_恋与制作人元旦节活动大全_玩游戏网...
  4. 服务器装好系统只有命令行没有桌面,Windows server 2012 R2开机只有cmd 没有桌面
  5. 小米携手联芯 是为了下多大一盘棋?
  6. 【CTF】PGP邮件加密教程
  7. hadoop创建java项目的步骤_为 Apache Hadoop 创建 Java MapReduce - Azure HDInsight | Microsoft Docs...
  8. 计算机调剂到mba,如何调剂到理想的MBA院校?
  9. 腾讯TDW:大型Hadoop集群应用
  10. TiDB学习笔记【初阶】