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