我有一个包含公共代码的库,使用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
规则中可用。我错过了什么吗?这不是建议设置项目的方法吗?
谢谢!
答案 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_binary
和common
。在您的应用代码中,您可以实例化特定于Android的记录器的实例,并将其传递给android_library
。
对于iOS的一半,您可以类似地使用objective-c规则来提供特定于iOS的日志记录(尽管我不太熟悉在objective-c或iOS中如何工作)。
您可能还会考虑将Model
分解为单独的规则,这将提高增量(例如,将记录置于其自己的规则中)。这一切都取决于代码的结构。