交叉编译平台

时间:2019-02-28 12:15:32

标签: android scala sbt cross-platform

我想创建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

This is how my project looks

我的问题是如何在这个项目中创建一个android平台;我的SBT应该有什么变化?

1 个答案:

答案 0 :(得分:1)

Android构建基本上是一个带有附加步骤的JVM构建-获取JVM字节码,可以选择运行proguard以最小化代码并将其编译为Android格式。

这里您有很多有关如何在sbt中设置常规android构建的信息: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作为跨项目的第四个选择的原因-您具有不同的运行时依赖项,不同的启动应用程序的方式,因此您将拥有更多的代码部分与众不同。更好的主意是将子模块的代码依赖于公共依赖项(甚至是交叉编译的依赖项)专门用于平台。