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

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

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

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

В этом документе изложен план миграции, приведены примеры сценариев миграции и перечислены изменения в SDK Jetpack, которые упрощают доступ к 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-файла. Если пользователь отказывается от обновления, модуль продолжает функционировать и начинает накапливать разрешения и данные.

Требуется обновление изображения телефона.
Рисунок 1 : Предложение обновить APK-файл Health Connect.

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

Требуется обновление APK-файла (см. рисунок).
Рисунок 2 : Подсказка об обновлении модуля фреймворка.

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

Схема синхронизации данных
Рисунок 3 : Процесс миграции данных в процессе.

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

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

Разрешения

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

Данные

В процессе миграции дублирующиеся данные из APK-файла игнорируются. Приоритет отдается более актуальным данным из модуля.

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

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

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

Производители оборудования могут начать интеграцию с 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>

Open Health Connect

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

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

В Android 14 необходимо использовать действие Intent, заданное в 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 года, одновременно с выходом бета-версии 3 Android 14. Для использования Android 14 Jetpack SDK вам потребуется начать компиляцию вашего приложения для Android 14.

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

Если вы хотите протестировать своё решение на бета-версии 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 обратитесь к документации Google Mobile Services Health Connect . Возможно, вам потребуется войти в Google Developers, чтобы просмотреть страницу.