Google 工程师和独立开发人员提出了几份不同的提案,旨在让 Go 语言支持开发原生的 Android 应用。这项工作无法让 Go 语言编写的应用使用 Android NDK 的全部接口,但有可能使用其中的一个子集。
David Crawshaw 是 Google 的工程师,他写了一份提案,旨在让Go 语言部分支持编写Android 应用。根据他的说法,“用Go 语言来实现整个Android 平台非常困难。Android 平台是用Java 写的,并拥有庞大的API 层。”
但是,Crawshaw 说,一部分Android 应用——比如游戏——使用了精简得多的C 语言API 编写代码,这些API 由Android NDK 提供。这样,使用Go 语言来开发和NDK 一样的功能,提供对Android 的支持是有可能实现的。
Crawshaw 建议在 Go 1.4 的开发周期中,Go 语言的代码库引入一个叫 GOOS=android 的选项,这个选项可以提供以下功能:
- 为 Android NDK 中导出的 OpenGL、OpenSL 和 OpenMAX 接口,提供 Go 语言的绑定(binding)。
- 从 Java 语言到 Go 语言的绑定生成器(binding generator)。如果我们有一个 Go 语言编写的软件包,那么这个生成器可以帮助 Java 代码调用它,所以游戏菜单界面就可以直接使用标准的 SDK 来编写了。
- 集成到 Android Studio 的编译系统中。
不止 Crawshaw 一个人提出了把 Go 语言和 Android 结合起来的想法。 Elias Naur 建议扩展 Go 语言的工具链来支持创建动态库。这样我们就可以在 Android 应用中使用 Go 语言编写的库,它们被 Android 应用加载和运行,并打包在 apk 中发行。要把这个想法变为现实,有一个重要的前提条件:加入对交叉编译的支持,而 Go 1.3 已经实现了它。交叉编译是必需的,因为 NDK 本身并不能在 Android 上运行,只有使用 NDK 编译和(或)链接的可执行程序和动态库才能在 Android 设备上运行。
上面这个提案基于已有的开源项目 goandroid ,作者就是 Elias Naur。Goandroid 修改了 Go 语言的工具链和运行时库,使之能编写动态库,在原生的 Android 应用中运行,而 Google 官方并不支持这个功能。
最后,还有一个叫 Mandala 的项目,它是一个更全面的框架,它的目标是使 Go 语言能编写 Android 原生应用。Mandala 利用了 Goandroid 的工具链,它的作者 Andrea Fazzi 说,感谢 Goandroid,“你可以在桌面环境中开发、测试和运行你的应用,然后再把它部署到 Android 设备上。它鼓励大家以 Go 语言独特的方式来编写 Android 应用:使用通道(channels)来实现通讯,而不是回调函数(callbacks)”
在功能方面,Mandala 项目跟 Crawshaw 的提案很接近,它的目标也主要是为游戏提供解决方案:“我们不应该把 Mandala 框架看作是一个上层的游戏引擎,而是应该在它基础之上构建游戏引擎,或者把已有的游戏引擎移植到它上面。” Fazzi 提醒道,Google 并不支持用 Go 语言来开发原生的 Android 应用,但他也表达了他的期望“当前这些工作可以起到某种激励作用,促使 Go 语言开发团队从官方层面支持 Android。”
参考原文链接: The State of Go Language for Android Native Development
感谢侯伯薇对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论