Groovy現在可運行在Android系統上了!
在最近的GR8Conf Europe 2014期間,SpringSource/Pivotal的Groovy高級軟件工程師 Cédric Champeau已經在Andriod上完成一次Groovy代碼的現場pull請求的合并。
Groovy開發人員為了在Android上運行Groovy已經等待好幾年了。因為各種困難,它的實現被推遲了,這包括Andriod Dalvik虛擬機的不同字節碼和Groovy代碼的動態特性等。官方對Android的支持可能在Groovy2.4版本。InfoQ采訪了 Champeau,了解了更多的這方面的內容以及未來Groovy在Andriod系統中的發展。
Question:讓Groovy在Android上工作,最困難的部分是什么?
實際上有多個問題,它們結合在一起使得這個工作變得有些困難。***個問題是Groovy是一個在運行時生成類的動態語言。問題是那些類是使用標準 的JVM格式生成的,而Android使用了自己的類格式(Dalvik VM)。Dalvik VM并不意味著運行時創建類,這樣就變得很困難,因為每個使用標準JVM字節碼的文件都需要通過'dex'工具加載處理。甚至你能夠在設備上做到這些,運 行時加載類仍然是痛苦的。例如,在jar文件中寫一個類,然后加載這個jar。***,我們決定這不是Groovy運行在Android上的主要關注點,我 們應該更關注用Groovy寫一個完整的應用,不涉及運行時創建類。這意味著有一些限制,但是這對許多用戶來說是不可見的。***,如果你在Android 上靜態編譯Groovy時,使用了@compileStatic,性能以及內存消耗相當于或者同Android原生應用相同。
第二個問題實際上是和系統構建相關。新的Andriod構建系統使用了Gradle和一個自定義的插件,"android",它繞過了正常 的"java"和"groovy"插件提供類似于應用程序變種的功能。這需要一些工作來弄清楚我們如果插入它來添加對Groovy的支持。令人欣慰的是自 從公布以后,Groovy的Gradle插件和Android已經發布,使得事情變得更容易了。***但并非最不重要的一點,我通過編寫對Groovy的支 持了解了Android。這是一件好事情,因為我可以看到在哪些地方使用Groovy會讓你受益,但是實際上這花費我更多的時間比適配Groovy本身!
Question:將來會考慮將這項工作擴展到iOS或者至少是Windows Phone來作為一中跨平臺解決方案嗎?
我肯定非常希望能在iOS上面看到Groovy的身影,但是我沒有硬件設備去測試;)即使最近發布的Swift語言看起來與Groovy非常接近并且遠遠 比Object-C吸引人,人們仍然可以把它作為Groovy的一種替代。但是,我們還要考慮這樣一個問題:Swift是由供應商封鎖的閉源軟件。相比之 下,Groovy則是完全開源的,如果你能在iOS和Android平臺下用Groovy進行編碼,舉個例子來說,人們可能需要做的僅僅是重寫他們應用的 UI部分就可以使他們的應用更適應大部分的手機開發。至于Windows Phone,我完全不知道這是否可行。實際上對于這個平臺,我了解甚少。
Question:當前有哪些不足之處? 還有哪些是不能運行的?
直到最近,僅僅@CompileStatic類能運行在Android上。但是現在也可以運行動態代碼了,因此幾乎所有的東西都能運行了,包括 構建器。應當知道,使用動態代碼應限于應用程序的非CPU密集型部分,因為它涉及到反射。這就是說,當前的限制是不能運行時實時構建類,因此一些特定的結 構比如映射到類或者實時運行特征將不工作。欣慰的是有辦法解決這些問題。***,在方法描述符的數量上仍然有問題。Andriod缺省的方法總量的限制是 65536,這相當的低,在無優化的情況下,Groovy將消耗8k(例如,ProGuard)。因此這意味著比通常的java應用程序更快的到達限制, 即使有方法可以解決這件事情(例如用multidex選項)。
Question:對將來Groovy/Android的發展有何規劃?
CC: 官方對Android的支持會有***個測試版的Groovy2.4。目前,你已經可以將其應用于自己的應用程序,并且實際上在***個示例應用程序中,這已 經包含在產品中。([2])但是它僅是基于Groovy的一個快照版本。但我真的很想看看新的庫或框架編寫的Groovy是如何便利Android應用程 序的開發。Android非常啰嗦,Groovy則可以使編碼更容易。為此,我們很多社區的開發人員已經寫了大量的像這樣的為Java開發的庫,所以 Groovy的普及和發展只是時間問題。我相信一旦用戶在Android上面體驗到了Groovy,他們不太可能切換回Java;)
[1] https://github.com/melix/groovy-android-gradle-plugin
[2] https://play.google.com/store/apps/details?id=me.champeau.gr8confagenda.app