gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:34:18 24 4
gpt4 key购买 nike

我有一个库,其中包含使用 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 依赖项。

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

无论如何,我建议将依赖于平台的内容从 common 中移到特定于平台的规则中。

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

对于 iOS 的一半,您同样可以有一个 objective-c 规则来提供特定于 iOS 的日志记录(尽管我不太熟悉所有这些在 objective-c 或 iOS 中是如何工作的)。

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

关于android - 使用 Bazel 和 j2objc 在 iOS 和 Android 之间共享代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50741921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com