Mirah — глоток свежего… кофе

Посвящяю разработчикам под андроид, которым наскучила Java.

The Un-Java

Причины отказа от Java приводить не стану. Если вы решили читать дальше — они у вас есть. Но факт остается фактом — для андроида младше 2.3 основным языком программирования является Java и только Java.

На самом деле при всей безысходности существует множество альтернатив. Как правило это языки, которые компилируются в байт-код JVM, а оттуда в байт-код Dalvik.

Например, вы любите лисп. Язык красивый и лаконичный. Вот вам пример создания простого Activity на Kawa (Scheme для JVM).

(require 'android-defs)
(activity hello
  (on-create-view
   (let ((tv (android.widget.TextView (this))))
     (tv:setText "Hello, Android from Kawa Scheme!")
     tv)))

Работает быстро, запускается недолго, приложение без proguard весит около 1Мб. Для работы требует рантайм Scheme (он и прибавляет около 1Мб к размеру программы). Самое печальное то, что в этих самых android-defs есть всего пара функций — собственно для создания activity и перегрузки метода onCreate()+setContentView() (насколько я понял).

Есть еще Clojure, который тянет свой runtime. И Scala (хотя там все же попроще). Примеров кода приводить не буду. Код на Scala очень похож на Java, а код на Clojure очень похож на Kawa. Если вам импонируют эти языки — рекомендую заглянуть в эти репозитории.

Mirah

И вот я узнал про Mirah. Вообще меня язык подкупил логотипом на сайте 🙂

Mirah — это диалект Ruby для JVM. К сожалению, я не знаю Ruby, но синтаксис показался понятным, так что эта статья — это скорее повод уговорить себя поизучать Ruby.

Документации по Mirah мало. В основном она тут. Но давайте разбираться сразу по мере написания кода.

Особенность Mirah в том, что никакого рантайма она не тянет, а потому по скорости и времени запуска от Java практически не отличима! Так ли это на самом деле?

Сборка

Я решил собрать минимально возможный проект на Mirah, и собрать его без Ant/build.xml вообще. Я о системах сборки уже говорил в прошлых статьях, здесь мы обойдемся простым скриптом, чтобы был виден порядок действий. На самом деле прикрутить mirah к build.xml можно, и можно без особых усилий. Так что если не осилю Mirah — можно смешивать в проектах Java и Mirah.

Итак, от исконно андроидских принципов нам никуда не уйти. Создаем AndroidManifest.xml, и папку res/ с иконками. res/layout и res/values можно удалить. Также создадим пустой исходник в папке hello/mirah/Hello.mirah (заметьте, не src/hello/…). В AndroidManifest укажите основным Activity класс hello.mirah.Hello:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="hello.mirah"
	android:versionCode="1"
	android:versionName="1.0">
	<application android:label="Hello Mirah" android:icon="@drawable/icon">
		<activity android:name=".Hello"
			android:label="Hello Mirah">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
</manifest>

Вот скрипт, которым будем собирать наш проект. Скрипт очень упрощенный и показывает этапы процесса сборки обычного андроид-приложения. От нашего оно отличалось бы только тем, что вместо mirahc (компилятора языка Mirah) вызывался бы javac с несколько другими опциями.

#!/bin/sh

ANDROIDJAR="/opt/android-sdk-linux_x86/platforms/android-13/android.jar"
MIRAHC=/opt/mirah/bin/mirahc

mkdir -p bin/classes
mkdir -p gen

echo "aapt"
aapt package -f -M AndroidManifest.xml -I $ANDROIDJAR -S res -F \
	bin/hello-mirah.res -m -J gen || exit 1

echo "javac R"
javac -sourcepath src -cp $ANDROIDJAR:bin/classes \
	gen/hello/mirah/R.java -d bin/classes || exit 1

echo "mirah"
/opt/mirah/bin/mirahc -c $ANDROIDJAR:bin/classes -d bin/classes . || exit 1

echo "dx"
dx --dex --output=bin/classes.dex --verbose bin/classes || exit 1

echo "apkbuilder"
apkbuilder bin/hello-mirah-unsigned.apk -u -z bin/hello-mirah.res \
	-f bin/classes.dex || exit 1

echo "jarsigner"
jarsigner  -keystore ~/.android/debug.keystore -storepass android \
	-signedjar bin/hello-mirah.apk bin/hello-mirah-unsigned.apk androiddebugkey \
	|| exit 1

echo "adb install"
adb install -r bin/hello-mirah.apk

В скрипте мы:

* запаковываем ресурсы и манифест в zip-архив, попутно создаем R.java с идентификаторами ресурсов
* компилируем R.java
* компилируем остальные исходники проекта (написанные на Mirah)
* конвертируем JVM байт-код в Dalvik байт-код с помощью утилиты `dx`. Получем classes.dex
* добавляем classes.dex в архив с ресурсами — получаем apk.
* подписываем apk отладочным ключем.
* устанавливаем подписанный apk на телефон

Самое время написать тот самый класс Hello, который и является нашим основным Activity:

import "android.app.Activity"
import "android.os.Bundle"
import "android.widget.TextView"
import "android.content.Context"

class Hello < Activity
  def onCreate(savedInstanceState:Bundle)
     super(savedInstanceState)
     @view = TextView.new(self)
     @view.setText("hello from Mirah")
     setContentView(@view)
  end
end

Собираем это все командой `bash build.sh`. У меня сборка заняла около 20 секунд, после чего на эмуляторе появилось приложение «Hello Mirah».

Итоги

Приложение собирается быстро.

Приложение стартует мгновенно.

Приложение весит около 14Кб.

Приложение пишется быстрее чем на Java (если конечно знать Mirah).

Вывод. Я хочу перейти на Mirah. Поэтому все кто со мной — за мной!

P.S. Если эта сумбурная статья вас заинтересовала — задавайте вопросы, и будем учиться вместе.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s