Я хотел создать кросс-платформу sbt (приложение Hello world), включая JVM, Scala Native, Android и scalajs, мне удалось собрать все из них, кроме Android, и это мой build.sbt:
name := "Cross-Platforms-ScalaNative-JVM"
import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType}
val sharedSettings = Seq(scalaVersion := "2.11.12")
lazy val bar =
// select supported platforms
crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Full)
.settings(sharedSettings)
.jsSettings(
libraryDependencies += "org.querki" %%% "jquery-facade" % "1.2")
.jvmSettings(/* ... */)
.nativeSettings(/* ... */)
lazy val barJS = bar.js
lazy val barJVM = bar.jvm
lazy val barNative = bar.native
Мой вопрос, как я могу создать платформу Android в этом проекте; какие изменения должны быть в моем SBT?
Сборка Android - это, по сути, сборка JVM с дополнительными шагами - байт-кодом JVM, опционально запускается proguard для минимизации кода и компиляция его в формат Android.
Здесь у вас есть много информации о том, как настроить нормальную сборку Android в sbt: https://scala-android.org/quickstart/.
Разница будет заключаться в применении androidBuild
(и всех настроек, связанных с Android) только к проектам JVM:
val myProjectJVM = myProject.jvm
.settings(androidBuild: _*)
Однако, учитывая, что сборка Android и обычная сборка Scala будут выглядеть по-разному (поскольку обычное приложение JVM архитектурно мало связано с приложениями Android - например, Main.main(Array[String])
против фрагментов и сервисов Android), было бы лучше иметь модуль для некоторого общего кода JVM и выделенные проекты для частей, специфичных для платформы:
val commonJVM = myProject.jvm
val myProjectJVM = project.in(file("java-specific"))
.dependsOn(commonJVM)
val myProjectAndroid = project.in(file("android-specific"))
.settings(androidBuild)
.dependsOn(commonJVM)
Это архитектурное различие, скорее всего, является причиной, по которой никто даже не рассматривает вопрос о том, чтобы сделать Android четвертым вариантом в кросс-проекте - у вас разные зависимости времени выполнения, другой способ запуска приложения, поэтому у вас будет больше частей кода, которые отличаются от общий. Подмодули с кодом, предназначенным для платформы в зависимости от общей зависимости (даже кросс-скомпилированной), являются лучшей идеей.