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

时间:2018-06-07 13:01:15

标签: android ios bazel j2objc

我有一个包含公共代码的库,使用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.* libs不应该在java_library规则中可用。我错过了什么吗?这不是建议设置项目的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

您是否尝试过使用依赖于使用Android类的common的iOS应用?我觉得这有点令人惊讶。

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

例如,假设您在Model中有某种需要记录器的业务逻辑common类,请在Logger中创建一些类似common的界面,以及让Model获取Logger的实例。然后,您可以拥有一个取决于android_library的{​​{1}}规则,并为Android提供common的实施,该实施使用Logger中的所有类。然后,您的android.util.*规则取决于android_binarycommon。在您的应用代码中,您可以实例化特定于Android的记录器的实例,并将其传递给android_library

对于iOS的一半,您可以类似地使用objective-c规则来提供特定于iOS的日志记录(尽管我不太熟悉在objective-c或iOS中如何工作)。

您可能还会考虑将Model分解为单独的规则,这将提高增量(例如,将记录置于其自己的规则中)。这一切都取决于代码的结构。