- PVSM.RU - https://www.pvsm.ru -

Разработка мобильных приложений — это всегда компромисс между тем, что хочется сделать и тем, что позволяет сделать платформа устройства. В этой статье рассказывается о том, как увеличить возможности приложения Android с помощью Golang.
Здесь вы не найдете утечки секретного api android. Используемые механизмы — это стандартные (или почти стандартные) инструменты android и golang, описание которых есть на официальных сайтах и профильных форумах. Но в виде единого плана действий, да еще и на русском языке — такое публикуется впервые и эксклюзивно для Хабра.
По многочисленным просьбам пользователей одного из приложений были разработаны предсказания текста. Предсказания обслуживал алгоритм radix tree [1], реализованный в отдельной android-библиотеке. Алгоритм показывал хорошую производительность наряду с экономным потреблением ресурсов — выдавал результат за десятки миллисекунд при потреблении 1,5 Мб памяти. Вполне рабочие показатели. Но так было только при изолированном тестировании библиотеки на JVM.
Проблемы начались при подключении библиотеки к приложению. На android алгоритм предсказаний стал тормозить, выдача результатов затянулась до 7-ми секунд. Ничего себе! Да за 7 секунд можно вручную набрать слово, стереть и набрать его правильно. Такие предсказания никуда не годились.
Проведенный анализ не выявил проблем кода. Алгоритм работал безупречно, памяти потреблял в строго отведенных количествах, не отвлекался на посторонние процессы, все асинхронно, аппаратных ресурсов предостаточно. Вывод напрашивался только один — виртуальная машина android dalvik имеет производительность, отличную от JVM, и в рамках dalvik данный код обречен на тормоза.
Тогда и было решено, что алгоритм предсказаний нужно выносить из dalvik. Для этого существует JNI — Java Native Interface [2]. Механизм, позволяющий вызывать из java методы библиотек, написанных на C/C++. И обратно, — из библиотеки C/C++ вызывать методы java.
Для создания нативной библиотеки был выбран язык Go. Просто потому что имеется опыт работы с ним, в отличие от C/C++. Golang восхитителен, но этот путь имеет свои трудности, поскольку мы получаем дополнительный уровень сложности. Для чистого C/C++ достаточно использовать NDK [3] и следовать инструкциям, описанным на сайте android developers [3]. Для Golang придется изучить еще и компиляцию golang под android, начать можно здесь [4].
Впереди лежал путь, полный опасностей и приключений. Но сейчас этот путь уже пройден, и я с удовольствием поделюсь его планом.
Среда разработки android:
Среда разработки golang:
$HOME/android/android-sdk-linux
$ apt-get default-jdk
$ git clone https://go.googlesource.com/go $HOME/go
— Скомпилировать текущую версию Go с помощью Go 1.4
$ export GOROOT_BOOTSTRAP=/usr/local/go
$ cd $HOME/go/src && ./make.bash
$ export PATH=$PATH:$HOME/go/bin
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init
Инициализация пакета занимает приличное время
Разработка библиотеки golang.
Компиляция библиотеки golang в библиотеку android *.aar.
$ cd <golang project folder>
$ ANDROID_HOME=$HOME/android/android-sdk-linux gomobile bind
Подключение библиотеки *.aar к приложению:
Прежде всего, передать библиотеку *.aar на машину разработки android. Далее в зависимости от IDE.
для Eclipse:
для Android Studio:
Вызов методов нативной библиотеки из android.
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
Go.init(getContext());
}
}
package radix
…
func Suggest(params string) string {
…
}
java:
suggestions = Radix.Suggest(params);
После переноса алгоритма в нативную библиотеку, предсказания стали работать даже быстрее, чем в JVM — результат отдается менее чем за 10 мс. Также уменьшилось количество garbage collection, потому что часть ресурсов была передана на сторону нативного кода.
Эффект от внедрения JNI превзошел ожидания. С такими показателями клавиатура и отправилась в релиз.
Ускорить приложение android с помощью golang — это вовсе не теория, а реальная возможность, которая уже используется в приложениях маркета.
Конечно, это усложняет разработку приложений, зоопарк инструментов удваивается. Но это даёт возможность реализовать интересные решения.
С выходом Go 1.5 ожидается, что интеграция android-golang станет еще доступнее, за счет инструментария gomobile, который сокращает весь процесс до 2-х команд.
Автор: ReshetnikovAF
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android/92325
Ссылки в тексте:
[1] radix tree: https://en.wikipedia.org/wiki/Radix_tree
[2] JNI — Java Native Interface: https://ru.wikipedia.org/wiki/Java_Native_Interface
[3] NDK: https://developer.android.com/ndk/index.html
[4] здесь: https://godoc.org/golang.org/x/mobile/app
[5] официального сайта android: https://developer.android.com/sdk/index.html#Other
[6] gomobile: http://godoc.org/golang.org/x/mobile/cmd/gomobile
[7] golang.org/doc/install: https://golang.org/doc/install
[8] Источник: http://habrahabr.ru/post/260609/
Нажмите здесь для печати.