在基于ARM的设计上调试Android平台

描述

如果不触及 Android 软件堆栈的内部,就无法在新设备上启动 Android。虽然 Java 应用层在很大程度上保持不变,但必须在 Java 原生层、硬件适配层以及底层 Linux 内核及其驱动程序中完成工作。此外,特定于设备的服务和应用程序需要与 Android 的其余部分一起集成和测试。

在软件堆栈中的所有这些层之间垂直集成设备功能是一个相当大的挑战。在单层中隔离和调试一个软件模块可能很困难;更重要的是,任何调试框架都不支持跨所有层调试多个交互模块,因此需要耐心和许多 printf 跟踪消息。

为了解决这个问题,CoWare 开发了适用于 Android 的 Virtual ARM 开发板,它提供了一个 Android 感知的调试和分析框架,支持确定性和连续的自上而下的调试方法。Android 意识首先通过检测和跟踪 ARM Linux 操作系统上下文(如中断处理程序、内核线程、驱动程序和用户空间进程)的能力而引人注目。立即观察进程调度的能力可以洞察整个系统行为。

例如,图 1 显示了设备从深度睡眠挂起模式恢复后系统死锁的在线上下文跟踪。当设备唤醒但未对任何按键或触摸屏做出反应时,系统陷入软件中断 (swi) 处理程序和 Android 的输入设备读取器进程 (InputDeviceRead) 之间的死锁。通过这种分析,很明显没有其他重要进程(例如窗口管理器)用于处理按键操作。

图 1:在线上下文跟踪显示设备从深度睡眠挂起模式唤醒后出现系统死锁。

嵌入式

支持自上而下的调试流程,每个过程都可以在功能上进一步研究到指令级。甚至可以跟踪内存访问,从而可以有效地分析软件堆栈中各层的行为。

图 2 说明了 Android 输入设备读取器进程与内核软件中断之间的函数级交互。识别实际执行的代码有助于隔离大型第三方软件代码库中需要开发人员注意的位置,并演示软件如何跨各个层进行交互。在图 2 中,观察 Android 中间件函数 read_notify 如何触发内核软件中断 swi。

图 2:调试 Android 用户空间和 Linux 内核之间的差距展示了软件堆栈中跨层的行为。

嵌入式

分析解决方案集成了 Android 和 Linux 中存在的日志记录和跟踪功能。无需对软件的任何部分进行检测或更改,Android 记录器和内核调试消息就会与之前引入的跟踪一起被捕获和可视化。这样,开发人员可以继续使用那些具有附加值的工具,即所有日志和跟踪都同步,并且可以轻松地与流程和软件功能相关联,如图 3 所示。

图 3:开发人员可以可视化 Android 记录器和内核调试消息以及之前引入的跟踪。

嵌入式

请注意,Android 日志并没有与重要的内核调试消息分开,查看这些消息不再需要工作的用户空间应用程序(例如 dmesg 或 logcat)。当系统损坏并且查看器应用程序或调试桥不再运行时,通常需要访问跟踪。一个示例是引导的早期阶段或与深度睡眠模式之间的转换。该分析解决方案通过虚拟平台提供的非侵入式控制和检查功能直接从嵌入式软件中捕获跟踪。

虚拟 ARM 开发板和工具通过强大的系统级分析工具补充了现有的 Android 开发环境。该板可与使用 Android 调试桥的 Google Eclipse SDK 等工具配合使用。RealView Debugger (RVD)、Lauterbach 或 Data Display Debugger (DDD) 等最先进的调试器可以使用板作为目标而不是硬件来执行嵌入式软件调试(参见图 4)。

这种高水平的可见性以及非侵入式检查和可控性使调试 Android 成为一项更加简化和可预测的任务。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分