Как интегрировать Scala в основную платформу Android?

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

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

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

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

  • Включить scala-library.jar
  • Убедитесь, что изменения в -bootclasspath ничего не сломали
  • Выясните, как действовать в случае, когда классы scala зависят от классов java и наоборот
  • Основная очистка кода
  • Тестирование!
  • Выясните, что делать (кроме публикации их здесь) с внесенными мной изменениями.

Похоже, я почти готов !!!

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

Последнее: Я нашел, где скомпилированы исходные файлы Java! В файле definitions.mk см. «Define 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-файлов.Это выходит за рамки нашей заботы. Любое взаимодействие с jar-файлами предполагает наличие файлов классов, которые предполагают, что мы уже успешно построили наши файлы scala.

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

main.mk также включает build / core / definitions.mk, который, в свою очередь, определяет некоторые полезные функции. Здесь нас интересует all-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», и запустить ее (make PackageName scala-build) перед окончательной сборкой.Возможно, можно было бы также скрытно скрыть это в присваивании переменной, уменьшая необходимость явного вызова цели.

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

27
задан 20 revs 11 August 2010 в 21:01
поделиться

1 ответ

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

7
ответ дан 28 November 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: