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

Posted

技术标签:

【中文标题】如何将 Scala 集成到核心 Android 平台中?【英文标题】:How to integrate Scala into core Android platform? 【发布时间】:2011-03-26 13:17:54 【问题描述】:

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

我目前所拥有的: 来自 git://android.git.kernel.org/platform/manifest.git 的平台源代码树以其原始形式构建,由“[下载并构建 Google Android][1]”

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

剩下的:

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

看来我快到了!!!

过去的一些笔记

最新:我找到了Java源文件的编译位置!在 definitions.mk 中,请参阅“定义 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 开始 build/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。我从 *** 文章“[调试 makefile 的工具][2]”中得到了这个想法。我也在研究使用 remake 进行调试。

build/core/config.mk, definitions.mk 让我们了解哪些 make 文件/命令用于做什么。

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

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

【问题讨论】:

我会在 android building 邮件列表中询问这个问题。 groups.google.com/group/android-building 【参考方案1】:

reddit 上的人说,有一个使用 ant here 将 Scala 集成到 Android 的教程。

【讨论】:

我会试试这个。谢谢! @Octoberdan 如果你能通知这个线程你的进度,那真是太酷了。 我周末出去了,但刚回来。直到明天我才有时间试一试。我一定会让你知道的! 其实这不是我想要的。我正在寻找将它集成到平台本身的构建系统中。还是谢谢你!

以上是关于如何将 Scala 集成到核心 Android 平台中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中水平滚动 ImageView?

如何减少 android 的 scala 应用程序的文件大小?

在 Scala 和 Gradle 中使用 AndroidAnnotations

热点Scala 2.12将只支持Java 8

如何将 SIP 集成到 Android 中?

如何将 Amazon Alexa SDK 集成到 Android 应用程序?