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

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

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

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

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

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

  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) = 10150

Учитывая, что 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

Пакет SDK Jetpack служит общей точкой интеграции для 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>

Открыть Health 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 записи сеанса

В версии альфа10 были удалены четыре подтипа 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, чтобы иметь возможность использовать Android 14 Jetpack SDK.

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