JVM、Scala Native、Android、scalajsを含むsbtクロスプラットフォーム(Hello world app)を作成したかったのですが、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形式にコンパイルします。
ここに、sbtで通常のAndroidビルドをセットアップする方法に関する多くの情報があります:https://scala-android.org/quickstart/。
違いはandroidBuild
、JVMプロジェクトにのみ(およびすべてのAndroid関連の設定)を適用することです。
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を4番目のオプションにすることを誰も考えていない理由である可能性が最も高いです-ランタイムの依存関係が異なり、アプリケーションを起動する方法が異なるため、コードのより多くの部分が異なることになります一般。共通の依存関係に依存するプラットフォーム専用のコードを持つサブモジュール(クロスコンパイルされたものでも)はより良い考えです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加