Мне интересно интегрировать 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 файлами.