Go語言對Android原生應用開發的支援情況

發表於2014-07-08

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

相關文章