Clojure在Android开发中的应用情况
Posted 移动开发前线
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clojure在Android开发中的应用情况相关的知识,希望对你有一定的参考价值。
要说最近android开发中的新语言谁最火,毫无疑问是Kotlin,不过对于函数式编程爱好者,Clojure才算他们的心头好。
Clojure是一种运行在Java平台上的Lisp方言,有人对它的评价是这样的:
构建于JVM之上,Clojure就是一门“严肃”的语言,而非很多人眼中的Lisp“玩具”语言,你学习后可以马上使用并且实践。但是Clojure又是Lisp方言,Lisp的神奇能力它还都保留,这样兼具美学和实用的语言如何让人不爱?我相信很多熟悉Scheme之类方言的童鞋,并且有Java背景的,都会对Clojure有相见恨晚的感觉。
在Android平台上使用Clojure进行开发,在过去几年中取得了长足的进步,让开发人员可以把它用于开发完整的应用,比如SwiftKey的Clarity Keyboard。在本文中,我们将检阅当前在Android平台上支持Clojure的工具的情况。
在Android平台上,使用来自标准升级渠道的Clojure历来都要遭受缓慢的启动,相比Java这可长达4-10倍的时间。此问题可由Skummet(http://clojure-android.info/skummet/)来解决,这是Clojure的分支,它优化了Clojure的编译器,从而可以产生更精简、加载更快的字节码(bytecode)。Skummet还包括一个用Skummet构建的经过优化的Clojure运行时版本。
据Skummet的作者Alex Yakushev说,Skummet旨在确保最大的兼容性,尽管依赖直接引用Vars的代码可能会有问题,大部分Clojure代码默认应该是兼容的。
总的来说,对一个简单的基准应用,Skummet能够使首次加载时间缩短到1/4,使APK大小和堆的使用减小到一半。据SwiftKey的 Adam Clements和Ben Leavett说,使用Skummet让他们可以把Clarity Keyboard的加载时间保持在1.5–2秒,更进一步的优化也是可能的。在它的官网上有一个benchmark表格,相对于Clojure,表现相当惊人。:
在Android平台上用Clojure开发的其它有用的工具包括在Clojure-Android Initiative(https://github.com/clojure-android)项目中,有:
lein-droid(https://github.com/clojure-android/lein-droid):一个Leiningen插件,作为Clojure-Android项目的构建工具,处理打包资源、创建APK文件、进行数字签名、等等这些过程。
Neko(https://github.com/clojure-android/neko):封装了Android某些部分Java API的工具包,使得它们的使用更符合Clojure的习惯。
Zach Oakes,Android版本Nightweb应用的作者,认为Clojure通过使用简洁的语法可以使应用的代码量得到“惊人的”缩减,而且让程序员更容易地执行异步任务,从而也可以改善应用的响应。
据SwiftKey的工程师们说,使用Clojure创建Android应用,对应用的设计会产生巨大的影响。特别是,就Clarity Keyboard而言,这让他们可以采用完全的“事件驱动”设计,再结合不可变更的数据结构,从而可以轻易地保存和“重放”用户的任何动作。使用不可变的数据也有助于构建高度模块化的应用,使得每项操作默认都是异步的。
参考链接:
http://clojure-android.info/#applications
http://swiftkey.com/en/blog/what-makes-clarity-keyboard-tick-clojure/
http://blog.ndk.io/2014/03/12/clojure-android-startup-benchmarks.html
https://github.com/alexander-yakushev/clojure/tree/skummet
https://sekao.net/nightweb/blog/clojure-on-android.html
移动前线学习交流群开始招人啦,每周定期群分享,与大牛谈笑风生~
移动开发前线
以上是关于Clojure在Android开发中的应用情况的主要内容,如果未能解决你的问题,请参考以下文章
BearyChat 沙龙北京站第二期 | 攒了一个有关 Clojure 的局
Clojure - 在没有project.clj的情况下启动REPL