开始使用

本部分旨在让工程师在 5 分钟内大致了解跨资料调用如何与 SDK 搭配使用以及如何进行测试。请勿尝试 尚不能用作参考或指南, 只是简单介绍一下

自定义个人资料感知类和方法

通过关联的应用 SDK,您可以为自己的类和方法添加注解, 进行跨资料跟踪这将生成允许您执行 注释的方法。

例如,请考虑添加 SDK 注释的以下类:

public class CalendarDatabase {

  @CrossProfile // SDK annotation
  public void deleteEvent(Event event, Account account) {
    // complex logic with database calls
  }
}

这会生成一个带有 Profile 前缀的类,让您可以在 所选个人资料例如:java profileCalendarDatabase.work().deleteEvent(event, account);

更复杂的示例

在更现实的情况下,您的类和方法会更复杂。例如: 您的现有 API 可以使用 ListenableFuture 返回值类型,您可能需要 来合并两个配置文件的结果。请参考下面的示例:

public class CalendarDatabase {

  @CrossProfile // SDK annotation
  public ListenableFuture<Collection<Event>> getEvents() {
    // complex logic with database calls
  }
}
// Merge results from both profiles into a set
profileCalendarDatabase.both()
  .getEvents()
  .transform((Map<Profile, Collection<Event>> events) -> {
    return events.values()
        .stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toSet());
  }, directExecutor());

这些生成的类和方法会按预期运行,并具有完整的类型安全性和 IDE 代码补全功能。

SDK 必须支持带注解的 API 的每个返回值和参数类型,但除了 ListenableFutureOptional 和 proto 之外,它还完全支持列表、集合、数组、基元、任何 Parcelable 类型和任何可序列化类型的嵌套和泛型。你还可以将 支持 SDK 本身不支持的类型。极端情况下,它可以无缝支持 ListenableFuture<List<Map<CustomProto, CustomParcelableType[]>>>

测试

该 SDK 旨在简化单元测试。对于生成的每个 Profile 类 您可以提供对应的 FakeProfile 类, 个人实例。例如:

// Create an instance of the SDK-generated fake connector class. This
// class lets you control the availability of the profiles, which
// profile you are now running on.
private final FakeCrossProfileConnector connector =
  new FakeCrossProfileConnector();

// Create an instance of your real/fake/mock class for both profiles.
private final CalendarDatabase personalCalendarDatabase =
  new FakeCalendarDatabase();
private final CalendarDatabase workCalendarDatabase =
  new FakeCalendarDatabase();

// Create an instance of the SDK-generated fake profile-aware class.
private final FakeProfileCalendarDatabase profileCalendarDatabase =
  FakeProfileCalendarDatabase.builder()
    .personal(personalCalendarDatabase)
    .work(workCalendarDatabase)
    .connector(connector)
    .build();

// Pass profileCalendarDatabase into your classes under test, or set
// Dagger up to inject the fake automatically.