在安卓开发中使用groovy语言

阅读时注意

这篇文章实在太久远了,可能充斥以下内容:

  • 令人不适且非常奇怪的口语/萌二式文笔
  • 受年龄经验导致浅显且幼稚的“技术”类文章
  • 情绪宣泄、个人隐私、对生活的无端负能量抱怨
  • 中二病

阅读这些文章可能让你产生不适或嘲笑感,请谨慎甄别。

groovy作为jvm层的语言,在国外也算是比较火爆的语言,可惜在国内用的人不多。8WB~I9[FM`7BLT@D7PN3CR3

当然如果你认为“用groovy的人挺多啊”,这典型是孕妇效应,实际上国内用这个语言的人并不多,归根到底是没人学……

今天简单的说下groovy如何在安卓里使用

话说我以前的游戏是用java8写的,用到了lambda表达式和一些好用的方法,比如List.removeIf( ()-> );

总之写的非常爽,在电脑上各种运行也没关系,前阵子突然想……尼玛libgdx怎么说也算个跨平台的引擎,最起码得做到移植性吧……这么说完,我看了看自己游戏,什么cglib(当初打算用cglib来实现libgdx的图片异步加载,但安卓不支持cglib,因为cglib操纵了jvm底层的东西,而安卓可不是jvm底层的),还有一堆PC专用的硬编码,这根本就无法移植到手机上,哭哭。

那好吧,代码可以慢慢改,cglib用不了我也可以写个静态代理类之类的,先考虑移植问题吧,首先想到的移植方向是安卓,因为我没有高贵的苹果。QQ图片20150121152252

记得上次写安卓程序都是两年多前的事情了,其实该忘的早忘了,当初记得用安卓想写个flappy bird来着,那时候也不知道什么是libgdx,反正就直接surfaceview走起,记得写的非常压抑,因为安卓调试实在是闹心,要编译,再传到你的手机,再安装,再跑起来,小一点的程序还可以接受,大型点的根本受不了。

好,谷歌一搜,直接跪,发现安卓不支持java8,国外大牛说“java8的产生导致jvm底层发生很多变动,而如果安卓也要支持java8,安卓的底层也要改,而安卓底层改就意味着要更新系统,但手机更新一次系统版本可不是喝汤一样说更新就更新的”,我对着电脑屏幕鼓了鼓掌,这位大牛说的有道理,然而并没有什么卵用。

那再搜搜有没有什么黑科技吧,谷歌一番还真搜到了个东西,叫“retrolambda”,他的作用是让java6、7能使用java8的lambda表达式,具体的可以自行百度,我试了试发现并没有什么卵用,因为他仅仅是支持lambda而已……那些其他的东西并不支持,估计是在编译时期把lambda反推导成匿名内部类之类的玩意,没什么大用的东西。有兴趣的人可以去研究研究。

那好吧,现在我的代码是java8,而且已经病入膏盲,所有能用到的回调、遍历基本都是lambda写的(因为实在很爽)。

实在不想放弃java8,因为匿名内部类太丑了,又丑有长,让自己代码变得很恶心。

于是我就想有木有什么其他的开发语言在安卓上使用呢?搜了搜,发现了groovy。

groovy以前玩过几次,为什么说玩呢,因为我也没怎么深研,就是想爽一爽这种语法。

发现安卓竟然能用groovy,我有点喜出望外,毕竟groovy是个动态语言,而且语法更爽更灵活。

我的大脑立刻整理出两条选择:

1.忍痛割爱,把java8的语法都降级成java7,用自己勤奋的小手来救赎曾经的贪婪。(2333

2.立刻转行,用groovy。

显然我选择了后者。

简单的说一下java的lambda和groovy的闭包语法区分吧,java的写法是这样的

var = (a,b)->{};

而groovy也差不多:

var = {a,b->}

好了废话了1000多字,进入正题。

百度了“安卓 groovy”后,结果比较喜庆,都是一些逗逼网站抄来抄去的一篇文章“groovy 2.4支持安卓开发啦”,翻了两三页都是这个文章,根本就没有什么如何在安卓里使用groovy的教程,我大喊一声我支持你妈逼,挂上只有我天朝能尊享的高贵代理,用谷歌搜了搜。

groovy支持安卓,而这需要你使用gradle,好吧习惯了eclipse的酸爽,用gradle还是不舒服(虽然非常强大(

eclipse对gradle的支持我就不说了,这里我把目标放到了“Android Studio”这个IDE上,因为他是idea改造的,而idea的对gradle的支持当然和eclipse不是一个档次。

-groovy的安卓插件官方github仓库点我-

其实没啥说的,readme里写的很清楚了。

这里就用个简单的示例,首先我们创建一个新的android studio工程,名字什么的随便起。

好,我们正常能看到两个build.gradle文件,一个是公共全局的,另一个是模块的,

QQ截图20150615155510

我们跟着readme操作,打开公共的这个build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        //XXX
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

大概的代码就是上面这样的,我们在上面那个xxx里面加入一句话

classpath 'org.codehaus.groovy:gradle-groovy-android-plugin:0.3.6'

来告诉gradle我要启动groovy安卓插件。

嗯,保存关闭……额不用保存,毕竟是我高贵的idea,其实我还是喜欢eclipse手动保存的感觉……ctrl+s按下去,不仅仅是保存,而是为了那种按下去的快感和成就感(雾。

好,我们打开另一个build.gradle文件。

代码大致如下:

apply plugin: 'com.android.application'
// XXX 2
android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0 rc2"

    defaultConfig {
        applicationId "com.example.administrator.myapplication"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
//XXX 3
dependencies {
    //XXX 4
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}

我们在xxx2处加上这句话:

apply plugin: 'groovyx.grooid.groovy-android'

表明我们要应用这个插件,注意的是,一定要在”apply plugin: ‘com.android.application'”这行话下面插入哦,在他的上面应用这个插件会报错。

接着在xxx3的地方加上这句话:

project.androidGroovy {
    options {
        sourceCompatibility = '1.7'
        targetCompatibility = '1.7'
    }
}

表明我们要用java1.7版本来编译程序,注意你的工程要设定成java1.7,才可以正常编译!

最后我们在xxx4插入这句话:

compile 'org.codehaus.groovy:groovy:2.4.3:grooid'

表明我们要把groovy编译进我们的安卓程序里。

ok,配置完毕,点一下菜单build->Rebuild Project,android studio会自动从jcenter上面下载我们需要的插件(慢的话挂个代理就好了_(:3」∠)_

全部弄完后,不要心急,我们看一下readme还有什么说明。

Where to put sources?

Groovy sources must be found inside src/main/groovy. Note that the plugin follows the behavior of the Groovy plugin in Gradle, which means that if you want to be able to have Groovy classes referencing Java classes that themselves reference Groovy classes, then those Java classes must be found inside src/main/groovy too (this is called joint compilation).

上面很清楚的告诉我们,如果想用groovy写安卓程序,就必须建一个叫“groovy”的文件夹,然后把它放进src/main/groovy下面。

往上翻到第一个图,我们发现android studio默认在src/main/下面建的文件夹叫“java”,我们直接把它改名成groovy就行。

上面这段鸟文的大概意思就是,你必须要建个叫“groovy”的文件夹,然后groovy编译器会编译这个文件夹的里代码,对于别的文件夹肯定是忽视的,所以理论来说,你可以有一个java文件夹,一个groovy文件夹,在java文件夹里写java程序,在groovy文件夹里写groovy程序,不过估计也只有傻逼才会做这种事情,因为如果你在java文件夹里调用groovy文件夹里的groovy代码,会编译失败,因为是两个编译器在编译两个东西,所以肯定不能互相访问,反过来也是,所以我们干脆直接就用groovy文件夹,里面写groovy代码或者java代码都行。

顺便编译失败还有一种可能就是,jar包访问java代码(注意,是已经编译的jar包访问你正在写的java代码的类),会导致编译错误,这个编译器还是有点残疾,总之不要这么做就好了。

okay,我们随便写两段groovy代码,直接编译,运行,没有问题的话就能看到光鲜的手机应用啦。

gradle已经把步骤弄的很简单了,只要跟着把代码放到相应的地方就行了(

最后,我要说个非常非常非常重要的事情:

Groovy在安卓下性能非常非常低下,非常残疾。

对,就是这样,我做了个简单的比较,发现groovy写的apk效率比原生java效率慢大概5-10倍!没错,就是这么慢,不是慢0.5倍也不是慢1倍,而是活生生的5-10倍,这可不是开玩笑的。

具体的你可以自己运行下ADM里带的那个性能检测工具,你会发现CPU大多数浪费在两个函数上:

invoke()

getClass()

没错,groovy因为是动态语言,需要各种获取和校对变量的类型,所以访问这两个函数很多情有可原……但尼玛不至于把CPU的80%、90%都浪费在这上面吧!

翻了翻国外的一些网站,发现社区里对groovy的安卓部分热度不高,估计有可能很大原因是因为groovy在安卓下面这残疾一般的性能导致的。

好吧,那也就说明写了2500多字都是废话了,我并不推荐各位在安卓上用groovy,除非只是些性能不重要的小项目,当我发现我的游戏用groovy写完后在安卓上只能跑个位数帧数的时候,我立马哭着花了三个小时把原来项目里所有lambda都删掉,然后用匿名内部类代替了hhhhhhhh(好在高贵的idea竟然能帮我自动反推导……卧槽)

写了将近3k字的废话,心塞………………

4 Responses to “ 在安卓开发中使用groovy语言 ”

  1. 作为游客留言

    Java6 完全够了Java7 感觉上只是多了个switch(String)Java8 就是Lamda.虽然有特地去了解过..但是到头来记住的还是这2点…一个switch(String)一个lamda.不过Java8倒还没有用过.

  2. 如果没有动态创建方法的话,试试@CompileStatic?

发表评论