Совместное использование кода между iOS и Android с использованием Bazel и j2objc - PullRequest
0 голосов
/ 07 июня 2018

У меня есть библиотека с общим кодом, которая использует android.util.Log:

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

И у меня есть правило j2objc для iOS, которое прекрасно работает:

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

Но когда яиспользуйте common в моем проекте Android:

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 голосов
/ 07 июня 2018

A java_library не сможет скомпилировать код, который зависит от Android, потому что у него не будет никаких зависимостей Android, которые предоставляет android_library.

Вы пытались запустить приложение iOS сзависимость от common, которая использует классы Android?Я немного удивлен, что это работает.

В любом случае, я рекомендую переместить вещи, зависящие от платформы, из common в правила для конкретной платформы.

Так, например,Допустим, у вас есть некоторый класс бизнес-логики Model в common, для которого требуется регистратор, создайте некоторый интерфейс, например Logger в common, и Model возьмите экземпляр Logger.Тогда у вас может быть правило android_library, которое зависит от common и обеспечивает реализацию Logger для Android, которая использует все классы android.util.*.Тогда ваше правило android_binary зависит как от common, так и от android_library.В своем коде приложения вы можете затем создать экземпляр регистратора, специфичного для Android, и передать его в Model.

. Для половины вещей в iOS вы также можете иметь правило target-c, предоставляющее iOS-специфическое ведение журнала (хотя я менее знаком с тем, как все это будет работать в target-c или iOS).

Вы могли бы также рассмотреть разбиение common на отдельные правила, которые улучшат инкрементность (например, добавлениевход в свое собственное правило).Все зависит от структуры вашего кода.

...