使用Bazel和j2objc在iOS和Android之间共享代码



我有一个库,其中包含使用android.util.Log:的公共代码

java_library(
name = "common",
srcs = glob(["*.java"]),
)

我有一个适用于iOS的j2objc规则,它运行得很好:

j2objc_library(
name = "common_ios",
deps = ["//common"],
jre_deps = ["@bazel_j2objc//:android_util_lib"],
)

但当我在Android项目中使用common时:

android_binary(
name = "app",
srcs = glob(["*.java"]),
manifest = "//android:manifest",
resource_files = ["//android:resources"],
deps = ["//common"],
)

但当我运行bazel build //android:app时,我得到:

common/MyVeryOwnLogger.java:3: error: package android.util does not exist
import android.util.Log;

这是有道理的,因为android.*库在java_library规则中不应该可用。我是不是错过了什么?这不是建议的设置项目的方式吗?

谢谢!

java_library将无法编译依赖于Android的代码,因为它没有android_library提供的任何Android依赖项。

您是否尝试过在依赖common的情况下运行使用Android类的iOS应用程序?我有点惊讶,这是有效的。

在任何情况下,我都建议将依赖于平台的内容从common移到特定于平台的规则中。

例如,假设您在common中有某种业务逻辑Model类,它需要一个记录器,在common中创建一些类似Logger的接口,并让Model获取Logger的实例。然后,您可以有一个依赖于commonandroid_library规则,并为使用android.util.*中所有类的Android提供Logger的实现。那么您的android_binary规则取决于commonandroid_library。在您的应用程序代码中,您可以实例化Android特定记录器的实例,并将其传递给Model

对于iOS的一半,你可以类似地有一个objective-c规则,它提供iOS特定的日志记录(尽管我不太熟悉objective-c或iOS中的所有功能)。

您还可以考虑将common分解为单独的规则,这将提高递增性(例如,将日志记录放入自己的规则中)。这一切都取决于代码的结构。

最新更新