Я заинтересован в интеграции 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.