Я заинтересован в интеграции Scala (или какого-либо другого языка JVM, отличного от Java) в платформу Android. Я не имею в виду написание приложения для Android с помощью Scala, которое я делал на ранней стадии, но на самом деле подключаюсь к процессу сборки, который строит дерево исходных текстов платформы Android. Я предполагаю, что это будет вопрос подключения к make-файлам и тому подобному. Кто-нибудь знает об этом?
Что у меня есть на данный момент: Дерево исходных текстов платформы из git: //android.git.kernel.org/platform/manifest.git, созданное в исходной форме , руководствуясь «[Загрузите и соберите Google Android] [1]»
Что осталось:
Похоже, я почти готов !!!
Некоторые заметки из прошлого
Последнее: Я нашел, где скомпилированы исходные файлы 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.
Ребята из reddit говорят, что здесь есть руководство по интеграции Scala в Android с помощью ant .