Базовый образец

В этом разделе показано, как создать межпрофильный вызов hello world в вашем приложении. Это даст вам представление о SDK и первоначальной реализации, на основе которой можно будет работать. Вам рекомендуется активно следить за развитием своего приложения.

Настройте тестовое устройство с рабочим профилем

Google создает приложение Test DPC, которое поможет вам смоделировать и протестировать управляемую среду на вашем собственном устройстве. Он настроит рабочий профиль и предоставит вам элементы управления для включения или отключения определенных функций на устройстве.

  • Установите приложение Тестовый ЦОД

    Откройте магазин Google Play и загрузите приложение Test DPC.

  • Настройка рабочего профиля

    После установки приложения на устройстве должны появиться два значка: значок настройки и значок приложения Test DPC. Коснитесь значка настройки и следуйте инструкциям.

Теперь у вас есть два отдельных профиля: один для личных приложений и один для рабочих приложений. Переключаться между ними можно через вкладки вверху списка приложений.

personal/work
profile

При установке приложения оно обычно автоматически устанавливается в оба профиля. Если вам когда-нибудь понадобится установить его явно в рабочий профиль, вы можете использовать аргумент --user с установкой adb.

$ adb install --user [id number of profile] [path of apk file]

Более подробную информацию о настройке тестового устройства можно найти по этой ссылке.

Убедитесь, что ваше приложение настроено правильно

Включите поддержку Java 8 и убедитесь, что ваш minSdk не ниже 19.

Добавить зависимости градиента

dependencies {
  annotationProcessor
'com.google.android.enterprise.connectedapps:connectedapps-processor:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps-annotations:1.1.2'
}

В этом примере мы используем Guava. Это не является обязательным требованием для использования SDK, но для выполнения hello world вам также следует добавить api("com.google.guava:guava:29.0-android") .

Создайте новый класс, который будет содержать тестовый межпрофильный вызов.

Чтобы сделать это более полезным в дальнейшем, вам следует поместить его в тот же пакет, в который вы хотите, чтобы входили ваши настоящие межпрофильные вызовы.

public class HelloWorld {

  @CrossProfile
  public ListenableFuture<String> helloWorld() {
    return Futures.immediateFuture("Hello world");
  }
}

Если вы не можете рассчитывать на поддержку Guava for Futures, просто следуйте инструкциям сейчас, а затем посмотрите последний шаг, который сообщит вам, какие изменения нужно внести.

Совершить межпрофильный звонок

Вы можете сделать это в классе, которому позже потребуется совершать настоящие межпрофильные вызовы.

// TODO: inject/pass these into the class later instead.
CrossProfileConnector crossProfileConnector =
  CrossProfileConnector.builder(this).build();
ProfileHelloWorld profileHelloWorld =
  ProfileHelloWorld.create(crossProfileConnector);

ListenableFuture<Map<Profile, String>> resultsFuture =
  profileHelloWorld.both().helloWorld();

FluentFuture.from(resultsFuture)
  .addCallback(new FutureCallback<Map<Profile, String>>() {
    @Override
    public void onSuccess(Map<Profile, String> results) {
      for (Profile profile : results.keySet()) {
        Log.w("tag", "CROSS_PROFILE profile: " + profile.asInt()
          +   "; result: " + results.get(profile));
      }
    }
    @Override
    public void onFailure(Throwable t) {
      Log.e(TAG, "Failed to say hello world on both profiles", t);
    }
  }, directExecutor());

Предоставьте экземпляр в SDK

Конечно, упомянутый ранее вызов метода helloWorld относится к сгенерированному классу, а не к реальному. Часто ваши настоящие классы представляют собой синглтоны или другие сложные классы, зависящие от фреймворков внедрения зависимостей, таких как Dagger. Чтобы разрешить вызов логики реального класса в другом профиле, каждый пользовательский класс @CrossProfile должен иметь соответствующий метод поставщика в классе @CrossProfileProvider . Создайте этот класс.

public class HelloWorldProvider {

  @CrossProfileProvider
  public HelloWorld getHelloWorld() {
    return new HelloWorld();
  }
}

Дополнительная проводка

Генерация кода, необходимая для поддержки пользовательских классов и методов, требует небольшого количества дополнительных подключений. Это сделано для того, чтобы справиться со сложностями, связанными с наличием множества целей сборки и требований к видимости в масштабе.

Во-первых, аннотируйте существующий или новый класс высокого уровня с помощью @CrossProfileConfiguration , указывая на классы вашего провайдера.

@CrossProfileConfiguration(providers = HelloWorldProvider.class)
abstract class HelloWorldConfiguration {}

Во-вторых, добавьте автоматически созданный сервис в свой манифест внутри <application> tag . Это может не решиться, пока вы не создадите свой проект.

<service
android:name="com.google.android.enterprise.connectedapps.CrossProfileConnector_Service"
android:exported="false"/>

Наконец, в целях разработки дайте себе разрешение INTERACT_ACROSS_USERS . Если у вас его еще нет, вы не сможете продолжать его работу, но это самый простой способ начать. Во-первых, добавьте его в свой манифест следующим образом:

<uses-permission
      android:name="android.permission.INTERACT_ACROSS_USERS"
      tools:ignore="ProtectedPermissions"/>

Затем вы можете предоставить себе разрешение из командной строки с помощью adb следующим образом (если в вашем приложении его еще нет):

adb shell pm grant <your package> android.permission.INTERACT_ACROSS_USERS

Если вы не можете полагаться на Guava for Futures, вам необходимо внести несколько изменений. Во-первых, верните строку «Hello World» напрямую и распечатайте результаты межпрофильного вызова. Во-вторых, поскольку эти вызовы теперь синхронны, вам следует разместить межпрофильный вызов и печать результатов внутри прослушивателя соединения.

Когда вы запустите код, указанный в разделе «Выполнить межпрофильную калибровку», вы должны увидеть два журнала «Hello World», по одному из каждого профиля. Если вы получаете только один журнал, убедитесь, что вы установили приложение в оба профиля и предоставили разрешение.