recovery调试方法

原创 2013年12月04日 14:23:31

有客户反馈不知道如何调试recovery,在这里介绍下recovery的调试方法。

1. 如何在recovery模式使用adb

在recovery模式下,init程序加载的rc文件是bootable/recovery/etc/init.rc。

service adbd /sbin/adbd recovery
    disabled

# Always start adbd on userdebug and eng builds
on property:ro.debuggable=1
    write /sys/class/android_usb/android0/enable 1
    start adbd
这里可以看到如果是在userdebug或者eng编译模式,adbd服务是启动的。执行adb shell时提示不存在system/bin/sh,因为这个时候recovery/root/system为空,并没有sh程序可执行。

虽然adb shell不能执行,但adb的其他很多命令都是能够使用的。

adb devices

adb push/pull


2. 如何增加log

在recovery的代码中能看到有两种方式添加的打印信息:printf和UI->Print。

printf输出到stdout好理解,UI->Print调用screen_ui的print函数,将信息显示在屏幕上。

void ScreenRecoveryUI::Print(const char *fmt, ...)
{
    char buf[256];
    va_list ap;
    va_start(ap, fmt);
    vsnprintf(buf, 256, fmt, ap);
    va_end(ap);

    fputs(buf, stdout);
除了显示在屏幕上,也将信息输出到了stdout标准输出。


3. 标准输出信息在哪

int
main(int argc, char **argv) {
    
    // If these fail, there's not really anywhere to complain...
    freopen(TEMPORARY_LOG_FILE, "a", stdout); setbuf(stdout, NULL);
    freopen(TEMPORARY_LOG_FILE, "a", stderr); setbuf(stderr, NULL);
static const char *LAST_LOG_FILE = "/cache/recovery/last_log";
static const char *LAST_INSTALL_FILE = "/cache/recovery/last_install";
static const char *TEMPORARY_LOG_FILE = "/tmp/recovery.log";
recovery.cpp的main函数中,最开始就将stdout的输出信息保存在了/tmp/recovery.log文件中。也就是说我们需要查看的log信息都在这里。

再看看recovery结束时做了什么

static void
finish_recovery(const char *send_intent) {
    // Copy logs to cache so the system can find out what happened.
    copy_log_file(TEMPORARY_LOG_FILE, LOG_FILE, true);
    copy_log_file(TEMPORARY_LOG_FILE, LAST_LOG_FILE, false);
    copy_log_file(TEMPORARY_INSTALL_FILE, LAST_INSTALL_FILE, false);
    chmod(LOG_FILE, 0600);
    chown(LOG_FILE, 1000, 1000);   // system user
    chmod(LAST_LOG_FILE, 0640);
    chmod(LAST_INSTALL_FILE, 0644);
将"/tmp/recovery.log"拷贝到了"/cache/recovery/last_log"。

4. 如何查看log

1)如果能使用adb,在recovery模式下就能使用adb pull出log信息

adb pull /tmp/recovery.log .\

2)即使adb服务不能使用,前一次recovery的log也会保存到cache/recovery目录下,在reboot正常进入系统后pull 出来查看。

adb pull /cache/recovery/last_log .\

cache/recovery/last_install保存的是最后一次更新的OTA包。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

recovery 模式下如何使用adb进行调试和抓取recovery LOG

在recovery中的init.rc中加入如下代码 export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xb...

Android Recovery 工作流程

Android Recovery: 功能简介 Android支持Recovery模式。在某些操作之后,系统会自动重启并进入到Recovery模式,用户按组合键开机(HOME+POWER),也可进入R...

mtk recovery源码分析及调试过程

recovery源码分析,当时主要是做客制化的recovery,基本修改了整一套的recovery的框架逻辑...

mtk Android如何调试recovery模块

通用的调试程序的步骤: 找到调试模块在系统代码中的路径; 知道代码在哪里之后就是编译代码了,即如何编译调试模块; 编译出目标文件后就要将目标文件放到机器中运行,即如何刷到机器中; 目标文件刷到机器中后...

Android recovery.img 支持adb shell

android recovery 模式下出于安全的考虑,一般禁止adb  和adb shell 登陆。如果需要在recovery  模式下debug ,会带来很大的不方便。 首先配置recovery...

recovery 流程学习总结(一)

Recovery 模式最主要的两个功能是恢复出厂设置和升级系统版本。本Recovery相关的分析内容主要为两部分:FACTORY RESET+OTA INSTALL  Recovery模式的主界...

recovery 流程学习总结(二)

1引言  1.1目的  对学习的Android Recovery模式及OTA升级过程进行总结,为加深理解和防止以后遗忘,所以写这篇文档进行一个总结和梳理,以便日后查阅回顾。文档主要包括两部分,第一部分...

recovery中快速导出log到文件(freopen)

recovery.cpp中log输出用recovery 实现. 大概样子如下: #include #include #include static const char *TEMPOR...

recovery log直接输出到串口

recovery log直接输出到串口     我们在调试recovery升级的时候,我们经常需要查看recovery的log,google的原始逻辑中,recovery的log并非直接输出到串口,我...

Recovery启动流程(3)--recovery.cpp分析

这篇文章主要通过分析高通recovery目录下的recovery.cpp源码,对recovery启动流程有一个宏观的了解。MTK和高通的recovery几乎一样,只是使用自己家的mt_xxx文件。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:recovery调试方法
举报原因:
原因补充:

(最多只允许输入30个字)