Перенос Health Connect с Android 13 (APK) на Android 14 (платформа)

Health Connect будет поставляться с Android 14 в качестве общего уровня хранения данных о состоянии здоровья потребителей, защищенного детализированными разрешениями и доступного как системное приложение Android (в этом документе именуемое «модулем каркаса»).

Разработчикам следует рассмотреть Health Connect APK (Android 13) как слой обратной совместимости для модели фреймворка. Модель фреймворка сохранит 100% паритет функций с ее предшественником APK.

При переходе с Android 13 на 14 крайне важно, чтобы пользовательский интерфейс оставался максимально плавным и интуитивно понятным.

В этом документе изложен план миграции, приведены некоторые примеры сценариев миграции и перечислены изменения в Jetpack SDK, которые облегчают доступ к API Health Connect.

План миграции

  1. После выхода Android 14 Google перейдет на предоставление Health Connect в качестве системного приложения Android.
  2. После достижения паритета функций данные будут загружены из APK.
  3. Все точки входа будут нацелены на пользовательский интерфейс системного приложения.
  4. Начнется миграция данных. Пока идет миграция, API модуля будут приостановлены со статусом «Миграция в процессе». Это также будет видно в пользовательском интерфейсе Health Connect.
  5. После завершения миграции APK можно удалить.

Примеры сценариев миграции

Вот несколько примеров сценариев, поясняющих процесс миграции для interval и series типов данных:

Пример 1 — Бег (интервальные данные)

Пользователь собрал 10 лет записей о беге по 1 часу каждый день. Это равно:

  • Записи сеансов упражнений: 365 * 10 * 1
  • Шаги: 365 * 10 * 1
  • Калории: 365 * 10 * 1
  • Всего = 365 * 10 * 3 (365 * 30) = 10 950

Учитывая, что 1 блок данных соответствует 3000 записей, приведенные выше данные в общей сложности составляют около 4 блоков.

Наше внутреннее тестирование подтвердило, что вставка типичного фрагмента занимает около секунды, поэтому указанные выше данные будут перенесены примерно за 4 секунды.

Пример 2 — Частота сердечных сокращений (серийные данные)

Пользователь собрал данные о частоте сердечных сокращений за 5 лет (запись создается каждую минуту), что в общей сложности составило 2 628 000 записей.

При 3000 записей на фрагмент, данные распределены по 876 фрагментам. Учитывая, что вставка одного фрагмента занимает примерно секунду, данные будут перенесены менее чем за 15 минут.

Предлагаемый миграционный поток

Мы решили выбрать мгновенную миграцию . На практике это означает, что APK станет неактивным, как только устройство будет обновлено до Android 14, с минимальным вмешательством пользователя.

Давайте рассмотрим высокоуровневый миграционный поток:

  1. Пользователь обновляет свое устройство до Android 14.
  2. Jetpack 14 направляет пользователя к API модуля и блокирует их, пока выполняется миграция.
  3. Процесс миграции начинается, когда версия модуля совместима по функциям с APK, т. е. версия модуля содержит тот же набор функций или больше. После начала процесса миграции APK переносит разрешения и данные.
    1. Если обе версии несовместимы по функциям, версию модуля необходимо обновить. После завершения обновления начнется процесс миграции.
  4. После завершения миграции состояние меняется на «Миграция завершена», а API модуля разблокируются.
  5. Теперь APK можно удалить.

Миграция элементов пользовательского интерфейса

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

Рисунок 1. Если APK Health Connect не «осведомлен о миграции», отображается запрос, предлагающий пользователю обновить APK. Если пользователь отклоняет обновление, модуль продолжает работать и начинает накапливать разрешения и данные:

Требуется обновление телефона


Рисунок 2. Если модулю фреймворка требуется обновление для того, чтобы он стал совместимым с функциями, отображается запрос на выполнение обновления и перезагрузку устройства. Если пользователь отклоняет обновление, модуль продолжает функционировать и начинает накапливать разрешения и данные:

Требуется обновление APK


Рисунок 3. В процессе миграции отображается счетчик с текстом, поясняющим, что данные синхронизируются:

Синхронизация данных

Дедуплицированные данные

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

Разрешения

Если в модуле фреймворка присутствуют разрешения, любые дублирующие разрешения, полученные из APK, игнорируются в процессе миграции.

Данные

Во время миграции дублирующие данные, исходящие из APK, игнорируются. Более свежие данные из модуля имеют приоритет.

Данные дедуплицируются на clientRecordId , если идентификатор записи предоставлен клиентом. Если нет, то временные интервалы ( startTime и endTime для внутренних записей и time для мгновенных записей) рассматриваются как ключ, наряду с типом данных и именем пакета приложения.

Изменения в Jetpack SDK

Jetpack SDK служит общей точкой интеграции как для APK-файла Health Connect, так и для API-интерфейсов фреймворка Health Connect.

OEM-производители могут начать интеграцию с Jetpack 13, чтобы, когда Jetpack 14 станет доступен, вы могли использовать новую библиотеку и скомпилировать ее в Android 14.

Мы выпустим новую версию SDK, которая поддерживает переход на Android 14. Вам потребуется внести некоторые изменения в существующую интеграцию, чтобы обеспечить плавный переход.

Разрешение декларации

В Android 13 разрешения объявляются с использованием пользовательского формата разрешений в файле ресурсов, который связан с манифестом:

#AndroidManifest.xml

<activity>
    android:name=".RationaleActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE"/>
    </intent-filter>
    <meta-data
        android:name="health_permissions"
        android:resource="@array/health_permissions"/>
</activity>

<queries>
    <package android:name="com.google.android.apps.healthdata" />
</queries>

#health_permissions.xml

<resources>
  <array name="health_permissions">
    <item>androidx.health.permission.SleepSession.READ</item>
    <item>androidx.health.permission.SleepStage.READ</item>
    <item>androidx.health.permission.Weight.READ</item>
    <item>androidx.health.permission.Weight.WRITE</item>
  </array>
</resources>

Для поддержки Android 14 разработчикам необходимо перейти на стандартный формат разрешений:

#AndroidManifest.xml

<uses-permission android:name=android.permission.health.READ_SLEEP />
<uses-permission android:name=android.permission.health.READ_WEIGHT />
<uses-permission android:name=android.permission.health.WRITE_WEIGHT />

<activity>
    android:name=".RationaleActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
    </intent-filter>
</activity>

<queries>
    <package android:name="com.google.android.apps.healthdata"/>
</queries>

Открытое здравоохранение Connect

В большинстве сторонних приложений есть кнопка, которая открывает приложение Health Connect, например кнопка «Управление доступом» в Fitbit.

В Android 13 вы можете открыть приложение Health Connect, используя имя пакета или с помощью действия androidx.health.ACTION_HEALTH_CONNECT_SETTINGS .

В Android 14 необходимо использовать действие намерения, указанное в Jetpack SDK, которое имеет разные значения в зависимости от версии Android, на которой оно выполняется:

@get:JvmName("getHealthConnectSettingsAction") @JvmStatic val ACTION_HEALTH_CONNECT_SETTINGS

Получение клиента Health Connect

Мы создали единый API под названием sdkStatus , доступный в Jetpack 11, для замены двух других устаревших API — IsSdkSupported() и isProviderAvailable() .

Изменения API записи сеанса

В рамках выпуска alpha10 были удалены четыре подтипа ExerciseSession :

  • ExerciseEvent
  • ExerciseLaps
  • ExerciseRepetitions
  • SwimmingStrokes

Как и в случае с ExerciseSessionRecord , SleepStage станет подтипом SleepSession .

Изменения подтипов ExerciseSessionRecord и SleepSession будут выпущены в рамках апрельского обновления SDK.

Обновление типа сеанса упражнений

Перечисленные ниже типы сеансов упражнений больше не будут поддерживаться и вместо этого будут добавлены как типы сегментов позднее:

  • EXERCISE_TYPE_BACK_EXTENSION
  • EXERCISE_TYPE_BARBELL_SHOULDER_PRESS
  • EXERCISE_TYPE_BENCH_PRESS
  • EXERCISE_TYPE_BENCH_SIT_UP
  • EXERCISE_TYPE_BURPEE
  • EXERCISE_TYPE_CRUNCH
  • EXERCISE_TYPE_DEADLIFT
  • EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM
  • EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM
  • EXERCISE_TYPE_DUMBBELL_FRONT_RAISE
  • EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE
  • EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM
  • EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM
  • EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM
  • EXERCISE_TYPE_FORWARD_TWIST
  • EXERCISE_TYPE_JUMPING_JACK
  • EXERCISE_TYPE_JUMP_ROPE
  • EXERCISE_TYPE_LAT_PULL_DOWN
  • EXERCISE_TYPE_LUNGE
  • EXERCISE_TYPE_PLANK
  • EXERCISE_TYPE_SQUAT
  • EXERCISE_TYPE_UPPER_TWIST

Типы замены:

  • EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING
  • EXERCISE_TYPE_STRENGTH_TRAINING
  • EXERCISE_TYPE_CALISTHENICS

Обработка журнала изменений

Журналы изменений не будут перенесены в ходе перехода с APK на Android 14.

После завершения миграции вы начнете получать исключения TOKEN_EXPIRED или TOKEN_INVALID . Их следует обрабатывать следующими способами (в порядке предпочтения):

1. Прочитать и дедуплицировать все данные с момента отметки времени «последнего чтения» или за последние 30 дней.

Сохраните временную метку, когда приложение в последний раз считывало данные из Health Connect. По истечении срока действия токена данные должны быть повторно считаны либо из этого значения, либо за предыдущие 30 дней (в зависимости от того, что соответствует минимуму), и дедуплицированы по сравнению с ранее считанными данными с использованием UUID.

2. Чтение данных с момента отметки времени «последнего чтения»

Установите временную метку, которая указывает, когда данные были последний раз считаны из Health Connect, и по истечении срока действия токена считывайте все данные после этого значения.

3. Удалить и перечитать данные за последние 30 дней.

Удалите все данные, считанные из Health Connect за предыдущие 30 дней, и считайте все эти данные снова (например, как это делается при первой интеграции приложений с Health Connect).

4. Ничего не делать (т.е. перечитать данные за последние 30 дней и не выполнять дедупликацию)

Это следует использовать в качестве крайней меры, с сопутствующим риском отображения дублирующихся данных. Разработчикам следует вместо этого изучить варианты 1-3, учитывая, что UUID уже должны быть на месте.

Тестирование API Android 14 с помощью Jetpack SDK

Android 14 Jetpack SDK должен выйти 7 июня 2023 года одновременно с выпуском Beta 3 Android 14. Чтобы использовать Android 14 Jetpack SDK, вам нужно будет начать компиляцию своего приложения для Android 14.

Если вы хотите протестировать свое решение на сборках Android Developer Preview до 7 июня, обратитесь за помощью к своему контактному лицу Google.

Если вы хотите протестировать свое решение на базе версии Beta 3, вам следует внести следующие изменения в APK:

  1. Установите compileSDKPreview = UpsideDownCake .
  2. Обновите манифест, включив в него намерение для Android 14:
# AndroidManifest.xml

<uses-permission android:name=android.permission.health.READ_SLEEP/>
<uses-permission android:name=android.permission.health.READ_WEIGHT/>
<uses-permission android:name=android.permission.health.WRITE_WEIGHT/>

<activity>
    android:name=".RationaleActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE"/>
    </intent-filter>
</activity>

<activity-alias>
      android:name="AndroidURationaleActivity"
      android:exported="true"
      android:targetActivity=".RationaleActivity"
      android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
      <intent-filter>
        <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
        <category android:name="android.intent.category.HEALTH_PERMISSIONS" />
      </intent-filter>
</activity-alias>

<queries>
    <package android:name="com.google.android.apps.healthdata" />
</queries>

OEM-настройка

В Android 14 элементы управления конфиденциальностью и данными Health Connect находятся в системных настройках.

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

Для документации по стилю OEM обратитесь к документации Health Connect Google Mobile Services . Для просмотра страницы может потребоваться войти в Google Developers.