我有一个包含常用代码的库,它使用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"],
)
但是当我在我的安卓项目中使用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
规则中可用。我是不是遗漏了什么?这不是设置项目的推荐方式吗?
谢谢!
发布于 2018-06-08 03:10:22
java_library
不能编译依赖于安卓的代码,因为它不会有android_library
提供的任何安卓依赖。
您是否尝试过在依赖于使用安卓类的common
的情况下运行iOS应用程序?我有点惊讶,它居然还能用。
在任何情况下,我都建议将依赖于平台的东西从common
移到特定于平台的规则中。
例如,假设您在common
中有某种需要记录器业务逻辑Model
类,在common
中创建像Logger
这样的接口,并让Model
获取Logger
的一个实例。然后,您可以拥有一个依赖于common
的android_library
规则,并提供一个使用android.util.*
中所有类的Logger
for Android实现。那么您的android_binary
规则取决于common
和android_library
。在您的应用程序代码中,您可以实例化特定于Android的记录器的实例,并将其传递给Model
。
对于iOS的一半内容,您可以类似地使用objective-c规则来提供特定于iOS的日志记录(尽管我不太熟悉objective-c或iOS中的所有内容是如何工作的)。
您还可以考虑将common
拆分成单独的规则,这将提高增量(例如,将日志放入其自己的规则中)。这完全取决于代码的结构。
https://stackoverflow.com/questions/50741921
复制相似问题