Android 上开放式网络应用程序的更好集成

到目前为止,在移动设备上开发网络应用程序一直比较棘手。

在花费时间开发应用程序后,让用户安装它很困难,尤其是在“安装网络应用程序”的概念定义不明确的情况下。

最流行的方法与在主屏幕上添加快捷方式同义。这在许多方面都存在问题,最重要的是,网络应用程序的管理方式(尤其是在启动、切换和卸载网络应用程序方面)与原生应用程序的管理方式有很大不同。

网络应用程序只“存在”于主屏幕上,而不是应用程序抽屉中。

当它运行时,它在最近的应用程序列表中没有明显标记。

即使你获得了像将你的应用程序顺利安装到用户手机主屏幕这样的用户体验,你经常会发现你的应用程序在降级或过时的网页视图中运行,错过了桌面级浏览器的兼容性或速度优化。

我们开发者想要的,是一个现代的、快速的网络运行时,它可以在我们的设备上保持最新状态。

如果我们的用户能够像使用原生应用程序一样启动和管理他们的网络应用程序,那不是很好吗?

介绍 APK Factory

我们一直在努力让网络应用程序在桌面上真正实现。在桌面上,如果你安装了一个网络应用程序,Firefox 会将该应用程序重新打包成桌面应用程序,这样它就能完美地与你系统的其他部分集成,如 跨平台开放式网络应用程序进展报告 中更详细地概述的那样。

这意味着在 Windows 的开始菜单中,或在 Mac OS X 的启动控制屏幕中。

从 Firefox 29 开始,这将适用于 Android。

这意味着,作为一名网络开发者,你可以在 Android 上依靠一个现代的、最新的网络运行时来运行你的网络应用程序。更棒的是,该网络运行时由一个普通的 Android 应用程序提供,这意味着它将保持现代和最新,你终于可以告别 Android 浏览器了。

一个名为 ShotClock 的网络应用程序。注意屏幕右上角的图标。

用户将体验你的网络应用程序,就像它是一个真正的原生 Android 应用程序一样。

  • 应用程序出现在应用程序抽屉中,最近的应用程序列表中,有它自己的名称和图标。
  • 应用程序可以像原生 Android 应用程序一样安装和卸载。
  • 应用程序可以像原生 Android 应用程序一样更新。

在应用程序抽屉中。

在最近的应用程序列表中:所有这些应用程序都是网络应用程序。

安装时附带某些权限。

最棒的是,我们做这些改变不需要开发者做什么。作为开发者,你可以编写很棒的网络应用程序,而不必担心将网络应用程序交付给用户时需要不同的打包方式。

因此,如果你已经在为 Firefox OS 创建一流的应用程序,那么你已经为 Android 创建了 一流的应用程序。

技术细节

在 Firefox 上,你可以使用 window.navigator.mozApps.install(manifestUrl) 方法调用来安装应用程序。任何网站都可以使用此 API,因此任何网站都可以成为应用程序商店。

manifestUrl 是一个 manifest.json 文档的 URL,它描述了应用程序,而不会实际加载应用程序。

  • 应用程序的名称和描述,翻译成多种语言。
  • 应用程序的图标,各种尺寸,适用于不同的像素密度。
  • 应用程序运行所需的权限。
  • 应用程序想要注册的 WebActivities。
  • 仅针对打包应用程序,这提供了指向包含应用程序代码和资源的 zip 文件的 URL。

在 Firefox for Android 上,我们通过将 URL 发送到 Mozilla 管理的服务来实现此方法,该服务专门为应用程序构建 Android APK。

Factory 创建的 APK 使用 Android 出色的资源框架,以便向用户显示正确的图标和翻译,尊重用户的区域设置或手机屏幕。

网络应用程序权限被渲染为 Android 权限,因此用户将拥有完全原生的安装应用程序体验。

对于打包应用程序,APK 还包含打包 zip 文件的副本,因此下载应用程序后无需额外网络连接。

对于托管应用程序,应用程序第一次启动时,会下载其应用程序缓存中列出的资源,以便后续启动可以尽可能快地进行,无需网络连接。

如果你想检测应用程序是在网络应用程序中运行还是在网页中运行,检查 getSelf() 方法调用将有所帮助。

if (window.navigator.mozApps) {
  // We're on a platform that supports the apps API.
  window.navigator.mozApps.getSelf().onsuccess = function() {
    if (this.result) {
      // We're running in an installed web app.
    } else {
      // We're running in an webpage.
      // Perhaps we should offer an install button.
    }
  };
}

保持应用程序最新

对于托管应用程序,你可以像往常一样更新你的应用程序:只需更改你服务器上的应用程序,你的用户下次运行应用程序时就会获得这些更改。你可以随意更改,你的用户每次启动应用程序并连接到你的服务器时都会获得最新版本的应用程序。

对于需要更改应用程序清单的任何内容,你的用户会收到更新的 APK 发送给他们,以更新他们现有的安装。

例如,如果你想更改应用程序的图标,甚至名称,更改应用程序的清单会导致 APK Factory 服务重新生成应用程序的 APK,并通知你的用户有新的版本可供安装。

对于打包应用程序,相同的机制适用:更改应用程序的包 zip 文件,然后更新应用程序清单文件中的版本号,APK Factory 会获取这些更改并通知你的用户有更新的应用程序可用。你的用户会收到通知,告知他们有新的 APK 可供安装。就这么简单。

就是这些吗?

这是一个令人兴奋的项目。它几乎没有网络开发者参与,也没有额外的 API 供开发者使用:但是,它应该代表着 Android 上网络应用程序可用性的进步。

现在我们已经采取了为网络应用程序生成 APK 的措施,这为我们提供了一个平台,可以进一步模糊网络应用程序和应用程序之间的界线。亲自体验并帮助我们改进功能:从 Google Play 商店获取 Firefox Beta,从 Firefox Marketplace 安装应用程序,并告诉我们你的想法!

关于 James Hugman

James 是一位软件工程师,自 2009 年以来一直在从事移动操作系统的工作,并且一生都在与小型低功耗计算机打交道。在 Mozilla,他从事 Web Runtime 团队的工作,大部分时间都花在说服两个调皮的孩子“Gecko”和“Android”友好相处。

更多 James Hugman 的文章……

关于 Robert Nyman [名誉编辑]

Mozilla Hacks 的技术布道者和编辑。发表有关 HTML5、JavaScript 和开放式网络的演讲和博客。Robert 是 HTML5 和开放式网络的坚定支持者,自 1999 年以来一直在从事网络前端开发工作,在瑞典和纽约市。他还定期在 http://robertnyman.com 上发布博客,喜欢旅行和结识新朋友。

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


51 条评论

  1. Scott Arciszewski

    好的,那么……如果托管/提供 mozApp 的 webserver 被黑客入侵,并用恶意代码替换了错误的替换,这种设计似乎没有包含任何防止恶意软件的方法。它缺乏服务器的信任灵活性。

    有没有计划允许使用 TOFU 公钥策略进行代码签名,以便任何未签名的 mozApp “更新”将不被信任?

    2014 年 3 月 20 日 下午 11:05

    1. Kumar McMillan

      我参与了 APK 签名服务的开发;安全是我们最优先考虑的事情。有许多层级可以防止攻击者签署恶意软件。在第一个版本中,密钥库由 Mozilla 生成并保护,但在未来的版本中,开发者可以使用他们自己的密钥库。

      2014 年 3 月 21 日 上午 01:35

    2. Kumar McMillan

      更直接地回答,如果攻击者入侵了 *提供* 清单 URL 的网站,他们也可以入侵应用程序,以便他们可以整天提供恶意软件。这种攻击对任何托管网络应用程序都是可能的,而不仅仅是 apks。如果你指的是攻击者可以替换一个新的清单 URL,那么原始应用程序不会受到影响,因为 URL 不同。当安装了签名的 apk 时,它只能用相同密钥签署的新的 apk 来更新。

      2014 年 3 月 21 日 上午 01:41

    3. Myk Melez

      除了 Kumar 说的内容之外,请注意,有两种类型的开放式网络应用程序(即“mozApps”):托管式和打包式。

      托管式应用程序,就像网站一样,可以随时更新其代码,Mozilla 不会审核这些更新。但托管式应用程序无法获得提升的权限,因此其安全特性类似于网站(无论是好是坏)。

      另一方面,打包式应用程序可以获得提升的权限,例如访问设备 API。但其代码只能通过一个流程进行更新,该流程需要 Mozilla 审核。

      有关安全和隐私模型的更多信息,请参阅此文档:https://wiki.mozilla.org/Apps/Security

      为了回答关于使用 TOFU 公钥策略进行代码签名的具体问题:目前我们还没有任何计划。

      2014 年 3 月 21 日 上午 10:11

  2. Caspy7

    首先,我要说,这太棒了(而且很漂亮)。

    我只想澄清一下:运行时的核心(gecko、spidermonkey 等)仍然存储在 WebRT 应用程序中,并没有复制到生成的应用程序中,对吗?否则,我想每个应用程序的大小都会非常庞大,对运行时本身的更新也会很麻烦。

    另外,我们将来如何处理 WebRT 安装?如果有人想在市场上安装应用程序,我们是否只需将他们链接到 Play 商店中的 Firefox 即可?我的意思是,如果我发送链接给朋友,让他们“看看这个应用程序”,我希望他们能够尽可能顺利地安装它。(比如,是否可以创建从另一个浏览器中调用 Fx:URL 的链接?)

    应用程序可以侧载吗?(如果实现中禁止这样做,并且我错过了,请道歉)

    再次强调,这对于它的潜力来说非常令人兴奋。

    2014 年 3 月 21 日 上午 04:37

    1. Myk Melez

      是的,运行时位于 Firefox for Android 中,而不是在每个单独的应用程序中,因此网络应用程序 APK 仅包含应用程序的代码(以及实现 APK“包装器”库的一些代码),并且设备只需要单个 Gecko、SpiderMonkey 等副本即可。

      至于在没有 Firefox 的情况下安装,Firefox 市场使用与 FxOS 和桌面操作系统相同的 mozApps API 来触发安装,这在不支持该 API 的其他浏览器中将不起作用。

      但是,如果您共享从市场获取的 APK,并且您的朋友在没有 Firefox 的设备上安装并启动它,那么它将引导您的朋友从 Google Play 商店下载 Firefox。我们还需要做一些工作来改善这种体验,我们正在 https://bugzilla.mozilla.org/show_bug.cgi?id=965282 中追踪它。

      关于侧载,是的,应用程序可以侧载!我们正在开发一个基于 Node 的 CLI,用于构建开发者可用于测试和调试的侧载式 APK。有关更多信息,请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=962879

      2014 年 3 月 21 日 上午 10:44

  3. Fabricio C Zuardi

    那么,在没有将网络应用程序发布到 Firefox 市场的情况下,是否还有其他方法来生成 .apk 文件(比如您描述的那种,如果安装了 Fennec,它将使用 Fennec 作为 WebRT,如果 Fennec 不存在,它将打开 Google Play 来安装它)?

    也许可以使用命令行工具?https://github.com/mozilla/apk-factory-library 是那个工具吗?

    2014 年 3 月 21 日 下午 14:07

    1. Kumar McMillan

      更简单的方法是,当从 Firefox for Android 运行时,只需从您的网页中调用 navigator.mozApps.install(manifestUrl) 来安装应用程序。在后台,将生成 APK。如果 APK 已经存在,则从缓存中获取。

      2014 年 3 月 21 日 下午 14:15

  4. Fabricio C Zuardi

    是的,Kumar,但我想到的是“从 Firefox for Android 运行”不可行的情况,因为用户还没有安装 Firefox。

    从 Myk 的评论来看,Firefox 市场生成的 .apk 可以启动一个流程,如果需要,它将首先安装 Firefox,而我想要生成的是这种 .apk,以便能够在我的电脑上生成它并分发给人们。

    2014 年 3 月 21 日 下午 14:29

    1. Kumar McMillan

      哦,对了,使用您链接到的库很快就会实现。

      2014 年 3 月 21 日 下午 14:32

    2. Myk Melez

      Bug 962879 是关于为 APK Factory 实现命令行接口,但它不会在本地生成 APK;相反,它会从 Mozilla 的 APK Factory 服务器检索 APK。它生成的 APK 通常不可重新分发,因为它们被标记为“调试”APK,并且旨在供开发人员测试/调试其应用程序。

      听起来您想要一个在自己的计算机上生成 APK 的工具。APK Factory Service 的代码位于 apk-factory-service 存储库中(并使用 apk-factory-library 作为它生成的 APK 的“模板”),以前有一个“命令行模式”用于执行此操作,虽然我不确定它是否仍然有效,而且我们目前并没有专注于该用例。

      但是,您可以查询 Mozilla 的 APK Factory 服务器,以获取对它公开可访问的任何网络应用程序的 APK。只需对位于 https://controller.apk.firefox.com/application.apk 的服务器发出 HTTPS GET 请求,并将 manifestUrl 查询参数设置为网络应用程序清单的 URL(或者在打包式应用程序的情况下为迷你清单)。例如,以下命令使用 wget 检索我的 Mykzilla 测试应用程序的 APK

      wget https://controller.apk.firefox.com/application.apk?manifestUrl=http%3A%2F%2Fmykzilla.org%2Fapp%2Fmanifest.webapp -O mykzilla.apk

      2014 年 3 月 24 日 下午 13:24

      1. Anthony Cameron

        感谢 Myk 的精彩评论!

        我想现在是否可以将市场作为 APK 生成器——尝试将 APK 上传到 Google Play 时,它会提示“您上传的 APK 使用证书签名,该证书的有效期太短。您需要使用有效期更长的证书为您的 APK 签名”。

        它抱怨的另一个问题是 zipalign,但我能够很快解决。

        2014 年 3 月 25 日 下午 19:07

        1. Kumar McMillan

          嗯,看来 10 年太短了。感谢您的报告!我在这里 https://bugzilla.mozilla.org/show_bug.cgi?id=988617 捕获了它。应该很容易修复。

          2014 年 3 月 26 日 下午 16:17

        2. Myk Melez

          我不知道是否可行,但目前这不是优先事项,因此不能保证它会起作用(或者,如果它起作用,则不能保证它会继续起作用)。

          尽管如此,我们的证书不应该“太快”过期,Austin King 提交了 bug 988450 来调查它们可能过期的原因。

          我也想了解更多关于您遇到的 zipalign 问题的信息。也许我们应该在生成 APK 时采取不同的方式!

          2014 年 3 月 26 日 下午 16:20

  5. Nathan

    如何在 Linux 上卸载应用程序?about:apps 应该会显示已安装应用程序的列表吧?我在 Fedora 20 上运行最新的 Nightly 版本。

    2014 年 3 月 22 日 上午 07:42

    1. Myk Melez

      在 Linux 上卸载很复杂。我们还没有在任何桌面操作系统(Windows、Mac、Linux)上实现 about:apps,但在所有三个操作系统上都实现了卸载,在 Linux 上,我们通过“桌面操作”在 bug 780528 中实现了它,这是一个 freedesktop.org 标准。

      不幸的是,并非所有 Linux 发行版都实现了该标准。因此,我们在 bug 896679 中寻找在 Linux 上卸载应用程序的其他方法。

      请注意,该错误的评论 4 中提到 GNOME 3.10 将支持桌面操作。这篇文章 中提到 Fedora 20 附带 GNOME 3.10。因此,也许您可以使用桌面操作来卸载应用程序?

      如果是这样,那么您应该在用户界面中代表应用程序的图标的上下文菜单中看到“卸载应用程序”项。选择该项目应该会卸载应用程序。

      (对于这里的一般性描述,我感到抱歉;我对 Fedora 不够熟悉,不知道该图标的确切位置以及如何调用上下文菜单。)

      2014 年 3 月 24 日 下午 13:37

  6. Controlling User

    用户对自动升级有哪些控制权?网络上充斥着强制升级导致用户出现问题的故事。当然,用户应该可以防止自动升级,如果他们选择的话。

    2014 年 3 月 22 日 下午 13:54

    1. Myk Melez

      是的,在我们的实现中没有强制自动升级。Fennec 每天都会检查更新,并在更新可用时通知用户。但 Fennec 只有在用户点击通知时才会下载更新。如果用户将其关闭(或忽略),Fennec 不会执行任何操作。

      (我们确实计划通过在用户使用 Wi-Fi 时自动下载更新来简化流程。但我们仍然不会强制用户更新其应用程序,因为我们将要求他们在应用更新之前确认更新。)

      2014 年 3 月 24 日 下午 13:39

  7. Raymond Camden

    等等,我们什么时候可以在 Firefox 的*桌面*版本上安装应用程序?我没有看到。

    2014 年 3 月 23 日 上午 06:37

    1. Kumar McMillan

      桌面应用程序已经可以使用一段时间了:https://hacks.mozilla.ac.cn/2012/05/desktop-apps-with-html5-and-the-mozilla-web-runtime/ 您可能仍然需要使用 Nightly 版本;我不记得它是否在公开版本中处于首选状态。

      2014 年 3 月 23 日 上午 07:58

      1. Raymond Camden

        感谢 Kumar——我现在可以看到它在 28 版本中起作用了。问题是,有没有办法访问桌面应用程序的控制台?我可以在模拟器中访问它,也可以在 FF 本身中访问它,但不能通过桌面访问它。我*只*在桌面版本中遇到了错误。

        2014 年 3 月 23 日 上午 08:12

        1. Myk Melez

          有一种方法!要访问控制台(和其他远程开发工具),请从命令行使用 -debug 标志启动应用程序,可以选择指定端口(默认:6000)。例如,在我的 Mac 上,我通过以下方式启动我的 Mykzilla 测试应用程序:

          > /Applications/Mykzilla.app/Contents/MacOS/webapprt -debug 6000

          然后,在 Firefox 中,转到开发者工具 > 连接… 并连接到您指定的端口上的“localhost”主机。在 Firefox 中按下连接按钮后,确保您返回应用程序并确认连接。然后返回 Firefox 并选择一个“选项卡”(即应用程序中的打开窗口)或“主进程”来调试 Web Runtime 的 Chrome 代码。

          然后,Firefox 的远程开发者工具的副本应该在一个新窗口中打开,并且应该连接到您选择的“选项卡”。

          (我们知道这很复杂且难以发现,我们希望随着时间的推移进行改进。)

          2014 年 3 月 24 日 下午 1:51

          1. Raymond Camden

            您在哪里看到“连接”作为选项?我在我的开发者工具中没有看到。

            2014 年 3 月 24 日 下午 2:15

          2. Raymond Camden

            当然,在我发布后,我看到了。我在看底部面板,而不是顶部菜单。

            2014 年 3 月 24 日 下午 2:16

          3. Raymond Camden

            这有效,但我仍然不知道为什么我的应用程序没有显示我在服务器上所做的最新更改。但我在这里添加了很多评论,我是否应该发布到 Google 论坛 mozilla.dev.webapps 更合适?

            2014 年 3 月 24 日 下午 2:19

        2. Myk Melez

          您可以在此处发布,但可能在该论坛中讨论和解决您的问题会更有成效,因为该论坛中有更多人可以做出贡献,并且该论坛更适合进行长时间的对话!

          2014 年 3 月 24 日 下午 4:33

          1. Caspy7

            其他人订阅了这些评论,因此请在其他地方进行更长的讨论。

            2014 年 3 月 24 日 下午 5:26

  8. 詹姆斯

    是否可以将这些 apk 放入 Play 商店?
    如果是这样,用户可以在 Play 商店中找到该应用程序,然后在第一次运行时,应用程序将安装 Firefox。

    这可能比让用户先安装 Firefox,然后加载 Firefox 市场,然后找到并安装应用程序更容易。

    此外,用户可能会在 Play 商店中自行发现应用程序,但如果尚未安装 Android 版 Firefox,则不会自行发现。

    最后,一个有趣的选择可能是允许 Firefox 市场中的应用程序镜像到 Play 商店中。一旦您添加到市场中,或更新描述或应用程序,该应用程序就会进入 Play 商店。这可能是一个有趣的想法,可以让人们更多地使用 html 应用程序!!

    2014 年 3 月 23 日 上午 6:57

    1. 詹姆斯·休曼

      当然没有理由开发人员不能将 APK 上传到 APK 应用商店(例如 Google Play 商店)。

      在没有兼容的运行时的情况下,APK 应该提供去查找并安装 Android 版 Firefox。

      目前,我们没有计划让 APK 工厂自动将 APK 上传到任何应用商店。

      2014 年 3 月 23 日 上午 7:32

    2. Kumar McMillan

      需要注意的一点是,当您将 Mozilla 生成的 APK 上传到 Play 商店时,您只能使用 Mozilla 生成的 APK 来更新它(因为 Mozilla 将持有密钥库)。

      2014 年 3 月 23 日 上午 8:00

      1. 詹姆斯

        哦,太酷了,听起来非常有用!
        是否有办法生成 APK,但使用您自己的密钥签名?
        也许可以下载用于进行 APK 打包的工具,并在您的本地机器上运行它们?

        2014 年 3 月 23 日 上午 8:21

        1. Kumar McMillan

          是的,但我们仍在规划该功能的工作方式。我认为可以使用库工具 https://github.com/mozilla/apk-factory-library(需要改进)来实现。

          2014 年 3 月 23 日 上午 8:23

          1. 詹姆斯

            哦,哇,这看起来太棒了!

            对于 Android html 5 开发,这可能比 PhoneGap 更具吸引力(因为拥有一个一致且更新的 Web 视图),这也是将 Firefox(以及更更新的浏览器)放到用户设备上的绝佳方式!另外,将使用打包的应用程序 API 并扩展 Firefox 市场中的应用程序!

            我会注意工具何时变得完全稳定!

            2014 年 3 月 23 日 上午 9:24

  9. Anthony Cameron

    非常棒,我一直希望从第一天开始就能实现这个功能,当时我第一次听说可以在 Firefox Beta 上安装 Mozapps!

    对于与其他 API 的集成,例如通知,这些 API 是否仍在开发中以提供本地的 Android 体验?我没有看到任何通知生成,但也许我在清单中没有正确声明它,或者使用了错误的 API 版本。

    2014 年 3 月 23 日 下午 12:56

    1. 韦斯·约翰斯顿

      Web 通知规范在 Fennec 中得到支持(甚至在 Fennec 4 中也支持一个版本,但最新的规范在 22 中得到支持),适用于所有 Web 应用程序。它没有被广泛使用,因此如果您发现错误,请提交它们!Android 提供了一些“丰富”的通知功能,这些功能并没有真正得到规范的支持。如果我们想支持它们,我们必须考虑扩展规范,但考虑到当前规范的缓慢采用,它还没有成为优先事项。

      B2G 开创的许多其他 Web API 也已经得到支持。其他 API 可能只需要更改首选项才能启用,并且我们通常愿意在 Web 应用程序中更改这些首选项。我们的打包应用程序支持包含相同的安全功能,因此我们可以根据应用程序的权限级别锁定 API。

      仍然有一些 API 需要实现。例如,我现在有一个实习生正在为我们进行初始 WebActivity 支持工作。这将允许从网页发送意图,并从原生应用程序获得响应。该阶段的第二阶段将是连接 Web 应用程序以接收和响应意图。

      2014 年 3 月 25 日 上午 8:54

      1. Anthony Cameron

        因此,如果我想从 APK 中使用通知,它需要是一个打包的应用程序,而不是一个托管应用程序,并且它应该可以正常工作?我已经验证了我的通知在 FXOS 模拟器中显示,所以我认为我正在使用正确的 API。

        2014 年 3 月 25 日 上午 9:54

        1. Myk Melez

          嗯,不,我认为您的应用程序不需要打包才能使用通知 API,因为它可用于 Web 内容,并且根据 安全模型,所有可用于 Web 内容的 API 都应该可用于托管应用程序。但可能是阻止其正常工作的一个错误。您可以尝试在 Fennec 选项卡中加载您的应用程序,看看 API 是否在那里工作。如果您无法使其正常工作,请 报告问题,我们将对其进行调查!

          2014 年 3 月 25 日 下午 5:30

  10. d00d

    用户是否需要启用“未知来源”设置才能安装 APK?

    2014 年 3 月 24 日 上午 8:03

    1. Myk Melez

      是的,Mozilla 的 APK 工厂是 Android 中的“未知来源”,因此用户必须启用“未知来源”才能从该工厂安装 APK。

      在 Android 4 设备上,Android 本身会引导用户完成启用“未知来源”的过程,这是用户第一次尝试从工厂安装 APK 时。在较旧的设备上,我们正在 错误 986085 中努力帮助用户完成此过程。

      2014 年 3 月 24 日 下午 2:09

      1. 马蒂斯·加顿

        首先,我只想祝贺所有参与该项目的人,这是一个工程上的杰作,对于所有参与使无缝集成的移动 Web 应用程序成为现实的开发人员来说,这是一个令人兴奋的项目。

        也就是说,我认为这个问题是关于在 Android 上实际使用 Mozilla 打包的 Web 应用程序的唯一瓶颈,因为大多数“基本”用户(除了我们开发人员和高级用户之外)不会想要启用此选项(在此处插入一些明显的统计数据)。

        我理解这里有一个游戏,Google 不希望启用在 Play 商店之外轻松安装应用程序,而 Mozilla 非常有兴趣绕过 Play 商店来推广其在 Android 平台上的市场(就像 Google 在 Windows 上使用 ChromePackagedApps 一样,在某种程度上)。

        也就是说,抛开战略问题,作为一名开发人员,我非常希望能够利用您解决方案的最佳功能(一个最新的 Web 运行时),同时保持将应用程序发布到 Play 商店而无需任何其他约束的能力。

        为此,我显然可以发布我生成的 Mozilla APK(如前所述),但这要求用户在运行应用程序之前安装 Fennec,对我这个开发人员来说这是一个相当明显的步骤(而且我很高兴,因为我喜欢 Moz),但这是一个关键步骤,可能会阻止大多数基本用户使用该应用程序(一个典型的反应可能是:“我不想在我的新闪亮的 S5 上有任何垃圾邮件,兄弟!)。

        在这方面,您是否计划提供某种形式的运行时所需砖块的打包(Gecko、ionMonkey…),从任何不必要的部分中删除,以将包减轻到最少,就像 Xamarin Mono 运行时在 Android 上一样,这样我们就可以使用 FF 运行时部署 Web 应用程序,而无需安装 FF?

        或者您更愿意走 Google 的道路,并押注浏览器将是进入另一个平台的特洛伊木马(类似于 ChromePackagedApps)?在这方面,您目前对 iOS 部署有什么计划?

        对于评论/问题太长表示歉意。

        2014 年 3 月 25 日 上午 10:23

        1. Myk Melez

          您好,马蒂斯,

          这里有几个问题!让我们看看我是否可以全部解决。

          1. 关于打包包含嵌入式运行时的应用程序,APK Factory 项目没有进行这方面的开发,但一些其他 Mozilla 开发者一直在开发一个名为 GeckoView 的项目,它似乎可以用于实现这一目标。我对该项目了解不多,无法很好地描述它,因此建议您搜索网络以了解更多信息!

          2. 关于“以 Google 的方式进行”,我在这里只代表我自己,而不是“Mozilla”组织或社区,因为我对整体策略了解不多……

          但我认为 Android 运行时和 APK Factory 的目的是通过让 Open Web Apps 在用户使用的更多平台上可用,来为用户带来益处,同时通过增加应用程序的发布机会,为开发者带来益处。

          的确,它也可能有利于 Firefox 超越 Chrome/原生 Android 浏览器,因为这些应用程序的用户也会安装 Firefox。我认为这是一件好事,因为 Firefox for Android 太棒了,我鼓励所有 Android 用户尝试它!

          但你也可以说它有利于 Android 超越 FxOS,因为用户可以在没有 FxOS 的情况下访问这些应用程序。

          而且 Google 可以决定实现一个兼容的 Open Web Apps 运行时,在这种情况下,用户不需要使用 Firefox 就可以运行这些应用程序。这里没有专有技术,只有开源代码和一些正在(或应该)标准化的 API。

          因此,这不是关于 Firefox 本身,而是关于通过赋予开发者在他们选择的平台上开发和发布 Web 应用程序的自由,来实现 Mozilla 的使命。

          3. 关于 iOS,我不知道有任何计划实现 iOS 运行时。但是,我们有一个用于 Mac OS 的运行时,以及用于 Windows 和 Linux 的运行时。还有 FxOS!

          2014 年 3 月 25 日 下午 5:25

  11. Brian LePore

    终于移植到 Android 了,真是太好了!

    话虽如此,图标的 mainfest.json 路径是否发生了变化?我试图弄清楚为什么我的应用程序的图标显示的是通用的 Firefox 市场图标(那个火箭图标叫什么?)而不是我的应用程序的图标。Android 是否有图标大小的启发式算法?现在,我在应用程序中定义了 16、48 和 128 像素的图标,当我将应用程序保存到 Windows 7 中时,一切正常。

    我喜欢制作 Web 应用程序,也喜欢将网站书签添加到主屏幕,并将网站作为应用程序放到商店里……但是,我们能否在某个时候就一组通用的图标大小达成一致?我记得需要在应用程序中包含 11 种不同的图标大小(其中 6 种是 iOS 的各种版本)。这感觉有点多了。=/

    2014 年 3 月 24 日 上午 10:27

    1. Anthony Cameron

      再试一次 linter

      我使用 16、32、48、60、64、90、120、128 并看到我的图标显示正常

      2014 年 3 月 24 日 上午 10:38

    2. Myk Melez

      我们最近发现图标方面存在一些问题。错误 982814错误 984028 已修复,但修复程序尚未推送到生产环境(据悉明天会推送)。然后是 错误 960703,该错误尚未修复。

      2014 年 3 月 24 日 下午 2:56

  12. Anthony Cameron

    有没有什么好方法可以更改新 APK 的浏览器提供程序?我选择了 Aurora,在 Aurora 更新之后,我认为我看到了错误。重新安装后没有提示我选择浏览器运行时

    2014 年 3 月 25 日 上午 10:06

    1. 韦斯·约翰斯顿

      您可能需要清除 Android 的默认应用程序设置。例如:打开 Android 设置 -> 应用程序 -> Aurora -> 清除默认设置

      2014 年 3 月 25 日 下午 12:33

  13. Enrique

    酷,我在 Android/Windows/Linux 上测试了,运行完美。但在我的特定用例中,我无法直接使用它。我正在开发一个多媒体 Web 应用程序,为了让它在 Android 上运行,我需要手动设置以下值
    browser.cache.disk.enable : false
    media.stagefright.omxcodec.flags: 16
    stagefright.force-enabled: true

    特别地,如果 Stagefright 配置不当,视频将无法正常工作。我认为,如果能够以某种方式/在某个地方允许覆盖默认配置值,从而改变 Mozilla 引擎的标准行为(我认为这并不容易,因为会产生“副作用”),那将是理想的。目前,我找到的唯一解决方案是创建自定义扩展。

    2014 年 4 月 9 日 上午 4:48

    1. Kumar McMillan

      这不是最佳解决方案,但在 Android 应用程序中嵌入 GeckoView 可能会解决您的问题 https://wiki.mozilla.org/Mobile/GeckoView 但是,该组件尚未投入生产。

      2014 年 4 月 9 日 上午 8:06

    2. Myk Melez

      嗨,Enrique,

      我四处询问了一下,大家对为什么您需要同时设置 stagefright.force-enabled 和 media.stagefright.omxcodec.flags 感到困惑,因为一个强制软件解码,而另一个强制硬件解码。他们也不明白为什么要禁用磁盘缓存。

      无论如何,听起来 Stagefright 在某些平台上因错误而被禁用,因此,如果您要针对这些平台上的设备,不幸的是您无法简单地创建一个应用程序来实现您想要的功能。我还没有关于这些错误的更多信息,但如果有的话,我会通知您!

      2014 年 4 月 14 日 下午 3:32

  14. Enrique

    @Kumar 看来 GeckoView 正是我一直在寻找的东西。我以前不知道它。感谢您提供链接!

    @Myk. 禁用磁盘缓存是因为我的应用程序会从本地网络(WiFi)服务器下载大量图片和音乐。(目前,我还在测试视频片段下载,例如 HLS -http://rreverser.github.io/mpegts/- 和 DASH -http://dashif.org/reference/players/javascript/0.2.2/index.html-)。由于已经有本地服务器充当缓存,而且手机和平板电脑通常具有(基于经验的个人观点)不可靠的闪存存储,因此我更愿意不使用它。此外,当可用空间低于 20-30% 时,闪存存储往往会变得非常慢且“阻塞”。我认为除了首选项/元数据之外,将其用于任何其他用途都不是一个好主意。

    关于 media.stagefright.*,这是一个“对我有效”的调整。根据我所阅读的内容 -https://hacks.mozilla.ac.cn/2012/11/h264-video-in-firefox-for-android/- media.stagefright.froce-enabled 强制使用 Stagefright “管道”进行视频处理,而 media.stagefright.omxcodec.flags=16 通知 Stagefright 强制硬件解码,而不是回退到软件解码(无论如何,软件解码在低端 ARM 设备上将无法正常工作)。

    2014 年 4 月 15 日 上午 0:24

    1. Myk Melez

      Enrique: 我不是这些首选项方面的专家,但您的描述听起来与其他人告诉我的不同。但是,这不是讨论这个主题的好地方。我建议您在 mobile-firefox-dev 论坛上发布有关您问题的帖子。

      2014 年 4 月 18 日 上午 8:15

本文的评论已关闭。