Кросс-компиляция платформ - PullRequest
0 голосов
/ 28 февраля 2019

Я хотел создать кросс-платформу sbt (приложение Hello world), включая JVM, Scala Native, Android и scalajs, мне удалось собрать все из них, кроме Android, и это моя сборка.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

This is how my project looks

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

1 Ответ

0 голосов
/ 04 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...