如何将Scala集成到核心Android平台?

Oct*_*dan 27 android scala jvm-languages dalvik

我有兴趣将Scala(或其他一些非Java JVM语言)集成到android平台中.我不是指用Scala编写一个Android应用程序,我早期就做过,但实际上是在构建android平台源代码树的构建过程中.我想这将是一个挂入makefile等问题.有没有人对此有所了解?

到目前为止我所拥有的: 平台源代码树来自git://android.git.kernel.org/platform/manifest.git以其处女形式构建,以"[下载并构建Google Android] [1]"为指导

  • build/core/combo/scalac.mk#配置由config.mk包含的scala编译器相关变量
  • 在build/core/definitions.mk中为all-subdir-scala-files和all-scala-files-under添加了定义
  • 在definitions.mk中添加了定义以构建scala文件,以便它们包含在包中

还剩什么:

  • 包括scala-library.jar
  • 确保对-bootclasspath的更改没有破坏任何内容
  • 弄清楚如何处理scala类依赖于java类的情况,反之亦然
  • 主要清理代码
  • 测试!
  • 通过我所做的更改,弄清楚要做什么(除了在这里发布)

看起来我快到了!

过去的一些笔记

最新:我找到了编译Java源文件的位置!在definitions.mk中,请参阅'define transform-java-to-classes.jar'.最新的想法是编写一个transform-scala-to-classes定义,然后将它们存储在直接打包的类中.我将在transform-java-to-classes.jar中的这一步之前调用transform-scala-to-class.对eclipse和cygwin的支持现在将被删除,因为它会使代码混乱,因此会增加失败的可能性.

构建过程由运行build/core/main.mk的根Makefile开始构建/ core/main.mk包括build/core/config.mk,其中包括build/core/combo/javac.mk,它设置HOST_JAVAC,TARGET_JAVAC和COMMON_JAVAC.COMMON_JAVAC是"具有公共参数的Java编译器命令",通过它看,其他两个变量默认获取这些值,除非在特殊环境(openjdk或eclipse)中.COMMON_JAVAC不在此文件之外使用.另外两个仅用于build/core/definitions.mk.

build/core/java_library.mk(由config.mk包含)似乎只关心构建jar.这超出了我们关心的范围.与jar的任何交互预先假定类文件,这些类文件预先假定我们已经成功构建了我们的scala文件.

main.mk中有关于java版本的检查.我们将忽略这些并假设我们的scala版本是兼容的.现在(在combo/scalac.mk中)我使用的是javac.mk中使用的相同的--target arg.这应该存储在一个变量中.

main.mk还包括build/core/definitions.mk,它依次定义了一些有用的函数.我们关心的是all-java-files-under和all-subdir-java-files.后者在Android.mk文件中用于查找java文件.前者用于后者的实施.我会写Scala等价物.

为了弄清楚构建过程是如何工作的,我现在用-n和其他人运行make.我从stackoverflow文章"[用于调试makefile的工具] [2]"中得到了这个想法.我也在研究翻拍调试.

build/core/{config.mk,definitions.mk}告诉我们使用哪些make文件/命令来做什么.

作为在每个项目基础上攻击支持的可能方式,可能会将额外的代码添加到项目的Android.mk文件中.从platform/build/core/build-system.html我们读到"Android.mk是控制给定模块构建的makefile片段的标准名称.只有顶层目录应该有一个名为"Makefile"的文件." 您可以创建一个新目标,如"scala-build",并在最终make之前运行(make PackageName scala-build).也许还可以偷偷地将它隐藏在变量赋值中,从而减少了明确调用目标的需要.

另一种方式(远远更加hackish)是劫持用于javac的命令.这在build/core/combo/javac.mk中设置.您的项目的Android.mk必须包含LOCAL_SRC_FILES中的*.scala文件以及*.java文件.

fol*_*one 7

Reddit上的家伙说,有上集成斯卡拉教程到的Android蚂蚁这里.