Как интегрировать Scala в основную платформу Android? - PullRequest
27 голосов
/ 07 августа 2010

Я заинтересован в интеграции Scala (или какого-либо другого не Java-языка JVM) в платформу Android.Я не имею в виду написание приложения для Android с Scala, которое я делал на ранней стадии, а на самом деле зацепил процесс сборки, который создает дерево исходных текстов платформы Android.Я предполагаю, что это будет вопросом подключения к make-файлам и тому подобному.У кого-нибудь есть понимание этого?

Что у меня есть до сих пор: Дерево исходных текстов платформы из git: //android.git.kernel.org/platform/manifest.git, встроенное в его virginform, руководствуясь "[Загрузить и собрать Google Android] [1]"

  • build / core / combo / scalac.mk # Конфигурирует переменные, относящиеся к компилятору scala, включенные в config.mk
  • Добавлены определения в build / core / definitions.mk для файлов all-subdir-scala-files и all-scala-files-under
  • Добавлены определения в definitions.mk для создания файлов scala таким образом, чтобы онивключены в пакет

Что осталось:

  • Включить scala-library.jar
  • Убедитесь, что изменения в -bootclasspathничего не сломано
  • Выясните, как обращаться со случаем, когда классы Scala зависят от классов Java и наоборот
  • Большая очистка кода
  • Тестирование!
  • Рисунокчто делать (кроме как просто опубликовать их здесь) с изменениями, которые я сделал

Похоже, я почти там !!!

Некоторые заметки из прошлого

Последние: у меня естьнашел, где исходные файлы Java скомпилированы!В определении. См. «Определение transform-java-to-classes.jar».Последняя идея состоит в том, чтобы написать определение transform-scala-to-classes и затем сохранить эти классы непосредственно в пакете.Я буду вызывать transform-scala-to-class прямо перед этим шагом в transform-java-to-classes.jar.Поддержка eclipse и cygwin на данный момент будет прекращена, поскольку это загромождает код обходными путями и, следовательно, увеличивает мои шансы на сбой.

Процесс сборки запускается корневым Makefile, выполняющим build / core / main.mk build/core/main.mk включает в себя build / core / config.mk, который включает в себя build / core / combo / javac.mk, который устанавливает HOST_JAVAC, TARGET_JAVAC и COMMON_JAVAC.COMMON_JAVAC - это «команда компилятора Java с общими аргументами». Похоже, что две другие переменные получают эти значения по умолчанию, если только не в специальной среде (openjdk или eclipse).COMMON_JAVAC не используется вне этого файла.Два других используются только в build / core / definitions.mk.

build / core / java_library.mk (входит в config.mk), похоже, касается только сборки jar.Это выходит за рамки нашей заботы.Любое взаимодействие с jars предполагает наличие файлов классов, которые предполагают, что мы уже успешно создали наши файлы scala.

В main.mk есть проверки относительно версии java.Мы проигнорируем их и предположим, что наша версия scala совместима.Прямо сейчас (в combo / scalac.mk) я использую тот же аргумент --target, что и в javac.mk.Возможно, это следует хранить в переменной.

main.mk также включает build / core / definitions.mk, который, в свою очередь, определяет некоторые полезные функции.Здесь нам нужны все-java-files-under и all-subdir-java-files.Последний используется в файлах Android.mk для поиска файлов Java.Первый используется при реализации последнего.Я напишу их эквиваленты в Scala.

Чтобы выяснить, как работает процесс сборки, я сейчас запускаю make с -n и другими.Я получил эту идею из статьи stackoverflow "[Инструмент для отладки make-файлов] [2]".Я также исследую отладку с помощью римейка.

build / core / {config.mk, definitions.mk} дает нам представление о том, какие файлы / команды make используются для каких действий.

В качестве возможного способа взлома поддержки на уровне отдельных проектов, скорее всего, можно добавить дополнительный код в файл Android.mk проекта. Из платформы / build / core / build-system.html мы читаем: «Android.mk - это стандартное имя фрагментов make-файла, которые управляют сборкой данного модуля. Только файл верхнего каталога должен иметь файл с именем« Makefile ».» Вы можете создать новую цель, например «scala-build», и запустить ее (сделать PackageName scala-build) до окончательной сборки. Можно было бы также скрытно скрыть это в присваивании переменной, уменьшая необходимость явного вызова цели.

Другой способ (гораздо более хакерский) - перехватить команду, используемую для javac. Это установлено в build / core / combo / javac.mk. Android.mk вашего проекта должен будет включать файлы * .scala в LOCAL_SRC_FILES вместе с файлами * .java.

1 Ответ

7 голосов
/ 13 августа 2010

Ребята на Reddit говорят, что есть учебник по интеграции Scala в Android с муравьем здесь .

...