Кросс-компиляция платформ

1

Я хотел создать кросс-платформу 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

Изображение 174551

Мой вопрос, как я могу создать платформу Android в этом проекте; какие изменения должны быть в моем SBT?

Теги:
cross-platform
sbt

1 ответ

1
Лучший ответ

Сборка 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 четвертым вариантом в кросс-проекте - у вас разные зависимости времени выполнения, другой способ запуска приложения, поэтому у вас будет больше частей кода, которые отличаются от общий. Подмодули с кодом, предназначенным для платформы в зависимости от общей зависимости (даже кросс-скомпилированной), являются лучшей идеей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню