Подтвердить что ты не робот

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

Мне интересно интегрировать Scala (или некоторый другой Java-JVM-язык) в платформу 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 для всех-subdir- scala файлов и all- scala файлов под
  • Добавлено определение в define.mk для создания Scala файлов, чтобы они были включены в пакет

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

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

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

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

Последний: я нашел, где сгенерированы исходные файлы Java! В определениях .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), похоже, касается только сборки банок. Это выходит за рамки нашей заботы. Любое взаимодействие с банками предполагает файлы классов, которые предполагают, что нам уже удалось создать наши Scala файлы.

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

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

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

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

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

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

4b9b3361

Ответ 1

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