使用 Weinre 远程调试 Firefox OS

注意:自从这篇文章发表以来,Mozilla 开发者工具团队发布了 App Manager,这是一种更有效地远程调试 Firefox OS 应用的方法。要了解更多信息,请阅读 MDN 上的使用 App Manager

如果您想为Gaia做出贡献,或者一直在为 Firefox OS 编写 Web 应用,那么您在使用B2G 桌面版或在设备上测试时遇到的痛点之一可能是缺乏开发者工具来检查和调试您的 HTML、CSS 和 JavaScript。

目前我们有两个跟踪错误,请继续投票以提高它们的优先级,以跟踪开发原生远程检查器样式编辑器的工作,但我有几个非常令人兴奋的消息。您今天就可以访问远程调试器。

您可能会问,这是如何做到的?简单来说,一个词:Weinre。Weinre 是 Apache 基金会的一个项目,代表 WEb INspector REmote,顾名思义,它是一个与 Firebug 或 Webinspector 类似的工具,但能够远程运行和调试网页。因此,如果您使用过 Firefox 开发者工具或 Chrome 开发者工具等工具,那么使用 Weinre 将轻而易举。但话不多说,让我们开始使用它吧。

设置 Weinre

由于 Weinre 运行在 Node.js 之上,因此您首先需要安装 Node.js。Node.js 现在附带了 NPM(Node 包管理器),我们将使用它来安装 Weinre。在终端中运行以下命令:

npm -g install weinre

注意:-g 标志用于将 Weinre 安装为全局 Node.js 模块以实现命令行功能,但在 Linux 和 Mac 上,这意味着您很可能需要在上述命令前加上 sudo

安装过程完成后,我们就可以使用 Weinre 进行调试了。但首先,让我们确保 Weinre 确实已成功安装。在您的终端中,运行以下命令:

$ weinre --boundHost 127.0.0.1 --httpPort 9090
2013-01-28T10:42:40.498Z weinre: starting server at http://127.0.0.1:9090

如果您看到类似于上面最后一行的内容,则表示您的安装成功,并且 Weinre 服务器已启动并正在运行。有了它,启动一个浏览器(注意:Weinre 的 UI 是专门为基于 Webkit 的浏览器构建的,因此,虽然它可能在其他浏览器中也能工作,但我建议您使用 Chrome)并将其指向http://127.0.0.1:9090

上面是 Weinre 服务器的登录页面,您可以访问文档、其他一些小工具以及 Weinre 客户端,这是我们真正想要访问的页面,因此,请继续点击调试客户端链接。

从上面您可以看到我们有一个已连接的客户端,这是 Web 检查器的当前实例,我们服务器的一些通用属性,但没有目标。让我们设置我们的目标。

注意:如果 winery 的 UI 看起来很熟悉,那是因为 Winery 使用与 Chrome 和 Safari 中的 Web 检查器相同的 UI 代码。

设置 Weinre 目标

在 Weinre 中,目标是您要调试的网页或应用,为了使目标能够连接,我们需要在应用的相关文件中添加一行代码。对于这篇文章,让我们检查日历应用。继续打开 gaia -> 应用 -> 日历 -> index.html 并滚动到最底部。在结束的 body 标记之前,插入以下行:

但是,在我们启动 B2G 桌面版并尝试之前,还有一个步骤。Gaia 使用内容安全策略,并且作为其中的一部分,脚本仅允许加载,如果来自与应用相同的来源。因此,如果我们要尝试加载日历,则上面的脚本将被阻止,因为它没有从指定的来源加载。

为了克服这个问题,我们需要暂时禁用 CSP。为此,打开 gaia -> 构建 -> preferences.js 并添加以下行,大约在第 24 行:

prefs.push(["security.csp.enable", false]);

使用 Weinre 和 B2G 桌面版进行调试

现在我们准备测试 Weinre 了。如果您尚未位于 Gaia 根目录中,请现在更改到该目录并执行:

DEBUG=1 make

配置文件构建完成后,启动 B2G 桌面版。

/Applications/B2G.app/Contents/MacOS/b2g-bin -profile /Users/username/mozilla/projects/gaia/profile

B2G 启动后,解锁屏幕,向右滑动两屏,然后点击日历图标以启动日历应用。应用启动后,您将在 Weinre 的客户端仪表板上看到一个新项目出现。

如您所见,日历已成功连接,现在被列为我们的目标之一。继续点击“元素”选项卡。

此处列出了我们应用的 HTML(左侧)和 CSS(右侧)!您可以继续像往常一样编辑 HTML 或 CSS,并查看更改实时反映。请注意,即使 CSS 看起来是灰色的并且已禁用,它也可以完全编辑。您可以使用空的 element.style 块或修改现有规则向当前元素添加全新的样式。您还会注意到您可以访问计算出的样式以及当前元素的指标。

使用控制台

我们感兴趣的下一个选项卡是控制台选项卡。在这里,您可以编写代码并运行任何您想要的 JavaScript 直接针对当前应用或执行应用公开的代码。为了了解其工作原理,让我们与拨号器的呼叫日志部分进行交互。

第一步是将我们的脚本导入从日历移动到拨号器。从日历中获取代码,然后打开 gaia -> 应用 – > 通信 -> 拨号器 -> index.html 并粘贴代码。接下来使用“make”重新构建您的配置文件,最后重新启动 B2G 桌面版。

重新启动后,点击主屏幕左下角的拨号器图标。加载完成后,通过打开http://127.0.0.1:9090/client/#anonymous并确认目标现在如下所示,确认通信通道已对 Weinre 打开。

127.0.0.1 [channel: t-7 id: anonymous] - app://communications.gaiamobile.org/dialer/index.html#keyboard-view

拨号器打开后,点击左下角的呼叫日志图标。目前呼叫日志已填充了一些虚拟数据,但让我们创建自己的数据。点击 Weinre 中的控制台选项卡,键入以下内容并按 Enter。

RecentsDBManager.deleteAll();

如果您现在查看桌面上的视图,似乎什么也没发生,但请稍等,还有更多。键入以下内容并按 Enter。

Recents.refresh();

啊哈!如您所见,我们的呼叫日志为空。下一步是添加一个条目。为此,我们将创建一个虚拟呼叫条目对象,然后将其传递给 RecentsDBManager 的 add 函数以将其存储起来。

// Dummy entry
var recentCall = {
    type: 'incoming-refused',
    number: '555-6677',
    date: new Date()
};
RecentsDBManager.add(recentCall);
Recents.refresh();

如您现在所见,我们刚刚创建的条目已添加到存储中(确切地说是IndexedDB),并且在呼叫日志视图中可见。您可能已经注意到,控制台附带的另一个很棒的功能是自动完成,这将进一步加快开发速度。

此功能组合已打开新的可能性,并且将使在 Firefox OS 上工作或为该操作系统编写应用变得更容易,从而减少在构建配置文件、拆卸和重新启动 B2G 之间花费的时间。所有这些都使得开发者更加快乐。

但是,等等,设备上的调试呢?这将与上述方法完全相同,只有一个细微的差别,即 IP。当您想在设备上进行调试时,您首先需要知道主机计算机的 IP 地址。然后,您需要使用此 IP 作为 buondHost 启动 Weinre,并在将脚本包含到目标文档中时也将其用作 IP。

在 Mac 和 Linux 上,您可以使用 ifconfig 获取此地址,在 Windows 上则使用 ipconfig。获取新的 IP 后,只需停止当前的 Weinre 实例,然后执行以下操作:

weinre --boundHost 192.168.1.1 --httpPort 9090

然后在您的目标文档中添加:

使用以下命令将您的 Gaia 配置文件制作并推送到设备:

make install-gaia

启动您的目标应用,您就可以开始使用了!

结论

虽然此解决方案并不完美,您需要记住在将任何内容提交到源代码控制之前撤消您的更改,每次都必须手动添加脚本并不是理想的,而且还有一些功能无法 100% 工作,例如,将鼠标悬停在 HTML 源代码上时突出显示 DOM 元素以及使用断点等调试 JavaScript,但这确实在很大程度上改善了开发人员的生活,无论他们是在直接处理 Gaia 还是在为 Firefox OS 编写激动人心的新应用。

但是,在手动管理脚本注入、禁用 CSP 和确保在推送到源代码控制之前清理内容方面,已经出现了一些曙光。Jan Jongboom 已针对 Gaia 存储库提交了一个拉取请求,该请求看起来非常有希望,并将缓解很多问题,因此,请继续为他提供帮助,让我们将其合并到 Gaia 中。祝您开发愉快!

重要说明:如果没有 Kevin Grandon 想起使用 Weinre 并发送了启动该项目的电子邮件,以上所有事情都不会发生。感谢 Kevin!

关于 Robert Nyman [荣誉编辑]

技术布道师和 Mozilla Hacks 编辑。进行关于 HTML5、JavaScript 和开放网络的演讲和博客。Robert 坚信 HTML5 和开放网络,并且自 1999 年以来一直从事 Web 前端开发工作——在瑞典和纽约市。他还经常在http://robertnyman.com上发表博客文章,并且喜欢旅行和结识新朋友。

更多 Robert Nyman [荣誉编辑] 的文章……


16 条评论

  1. aL3xa

    使用 WebKit 原生开发者工具调试 FirefoxOS?!简直是异端!

    2013年1月31日 上午 08:45

    1. Schalk Neethling

      嘿 aL3xa,你可能说得对;),但在开发者工具团队完成其原生工具的工作之前,这比什么都没有要好得多。因此,目前,这将在日常工作中使开发人员的生活更轻松。

      2013年1月31日 上午 08:55

      1. aL3xa

        当然,我完全同意你的观点,而且我往往会忘记在这样的消息中加上笑脸。=)
        坦白说,我每天都在使用 Chrome(用于开发)。
        它的开发者工具比 Firebug 更快,功能更多(事件断点、源映射),是原生的,等等。我真的很希望那些从事开发者工具开发的人能够加快开发速度,或者 Firebug 能够变得更快。我认为前者更有可能。=)

        2013年1月31日 上午 09:42

        1. Robert Nyman [编辑]

          关于这个话题:如果你测试了Firefox Nightly中的开发者工具并告诉我们你的想法,那将很有趣!

          2013年1月31日 上午 10:08

          1. aL3xa

            Robert,我运行 Nightly 已经有一段时间了,我已经看到了开发者工具,以及 Paul Roget 的 JS Term(不知道为什么它没有默认提供),但我真的对缺少一些我认为必须具备的功能感到沮丧,比如自动完成。它在 Web 控制台和 JS Term 中都可用,但在代码片段中不可用,并且 CSS 没有提供自动完成,这令人沮丧。无法设置 DOM 断点,等等。如果 Firebug 不是那么慢,它绝对是更好的解决方案……=/

            2013年1月31日 下午 01:07

          2. aL3xa

            好的,让我们总结一下,我真正错过的功能是

            – 自动完成(JS + CSS)
            – 源映射/(去)混淆器——是的,我知道开发者控制台中有 jsb,但它不一样
            – 事件/DOM 断点
            – 网络面板中用户/视觉友好的输出——更像 Firebug,带有预览等内容
            – 使 JSTerm 成为原生功能,它真的很棒!

            2013年1月31日 下午 03:15

          3. Robert Nyman [编辑]

            感谢您的反馈!

            2013年2月1日 上午 04:15

        2. Schalk Neethling

          正如 Rob 所说,Firefox 中的原生开发者工具已经取得了长足的进步,绝对值得您花时间,并且一旦它们变成远程的,它将变得非常棒。

          2013年1月31日 上午 10:13

          1. aL3xa

            我真的很期待!=)

            2013年1月31日 下午 01:08

  2. Holger Hussmann

    很棒的事情,非常感谢 Jan Jongboom @janjongboom,他提出了这个很棒的想法,并弄清楚了细节。

    另请参阅:http://www.youtube.com/watch?v=UiZSEkdAKAA

    2013年1月31日 下午 12:24

  3. Jeff Griffiths

    事情是这样的,你可以使用Firefox自带的调试器来调试B2G桌面版,我在Mozcamp Asia和上周末温哥华的App Hack Day上演示过。正如你提到的,目前你无法远程检查或编辑css,但这很快就会实现,并且比使用Weinre需要跳过的步骤少。

    2013年1月31日 21:10

    1. Schalk Neethling

      嗨,Jeff,

      我当然期待着原生工具的到来,但是目前,在FirefoxOS的开发工具链中,Weinre填补了一个空白。

      你是否有关于使用B2G桌面版原生调试器的幻灯片或博客文章可以链接到这里?

      2013年2月1日 00:44

  4. Fawad Hassan

    感谢分享这个技巧!
    我认为最好先编写不使用Firefox OS API的代码,并使用Firefox原生开发者工具或Firebug进行彻底测试,然后再使用API并通过远程调试器进行测试 :)

    2013年2月1日 02:16

    1. Robert Nyman [编辑]

      当然,这是一种方法。但很多时候,你希望在它将要运行的环境中进行测试。
      此外,为了在你的桌面上测试API等,我建议使用Firefox OS模拟器

      2013年2月1日 04:18

      1. Fawad Hassan

        是的,你说得对,我一直在为此使用Firefox OS模拟器 :)

        2013年2月1日 05:03

        1. Robert Nyman [编辑]

          太棒了!:-)

          2013年2月1日 06:38

本文评论已关闭。