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。”