Android 13(APK)에서 Android 14(프레임워크)로 헬스 커넥트 이전

헬스 커넥트는 세분화된 권한으로 보호되고 Android 시스템 앱(이 문서 전체에서 '프레임워크' 모듈이라고 함)으로 액세스할 수 있는 소비자 건강 데이터를 위한 공통 데이터 저장소 레이어로 Android 14와 함께 패키징됩니다.

개발자는 헬스 커넥트 APK(Android 13)를 프레임워크 모델의 하위 호환성 레이어로 고려해야 합니다. 프레임워크 모델은 이전 버전 APK와의 기능 패리티를 100% 유지합니다.

Android 13에서 14로 전환하는 동안 사용자 환경을 가능한 한 원활하고 직관적으로 유지하는 것이 무엇보다 중요합니다.

이 문서에서는 이전 계획을 간략히 설명하고, 몇 가지 이전 시나리오를 예로 들며, Health Connect API에 대한 액세스를 용이하게 하는 Jetpack SDK의 변경사항을 나열합니다.

이전 계획

  1. Android 14가 출시되면 Google은 헬스 커넥트를 Android 시스템 앱으로 제공하도록 전환합니다.
  2. 그런 다음 기능 패리티가 달성되면 데이터가 APK에서 백필됩니다.
  3. 모든 진입점이 시스템 앱 UI를 타겟팅합니다.
  4. 데이터 이전이 시작됩니다. 이전이 진행되는 동안 모듈 API는 '이전 진행 중' 상태로 정지됩니다. 이는 헬스 커넥트 UI 내에도 표시됩니다.
  5. 이전이 완료되면 APK를 제거할 수 있습니다.

이전 시나리오 예

다음은 intervalseries 데이터 유형의 이전 프로세스를 설명하는 시나리오 예입니다.

예 1: 달리기(인터벌 데이터)

사용자가 10년 동안 매일 1시간씩 달린 기록을 수집했습니다. 이는 다음과 같습니다.

  • 운동 세션 기록: 365 * 10 * 1
  • 걸음 수: 365 * 10 * 1
  • 칼로리: 365 * 10 * 1
  • 합계: 365 * 10 * 3(365 * 30) = 10,150

1개의 청크가 3,000개의 기록에 해당한다는 점을 고려하면 위의 데이터는 약 4개의 청크에 해당합니다.

내부 테스트 결과 일반적인 청크를 삽입하는 데는 약 1초가 걸렸으므로 위의 데이터를 이전하는 데는 약 4초가 걸릴 수 있습니다.

예 2: 심박수(시리즈 데이터)

사용자가 5년간의 심박수 데이터(1분마다 기록이 생성됨)를 수집하여 기록이 총 2,628,000개입니다.

청크당 기록이 3,000개이므로 이 데이터는 876개 청크로 분산됩니다. 청크 1개를 삽입하는 데 약 1초가 소요되는 점을 감안하면 이 데이터는 15분 미만으로 이전할 수 있습니다.

제안된 이전 흐름

Google에서는 즉시 이전을 선택했습니다. 실질적으로 이는 기기가 최소한의 사용자 개입으로 Android 14로 업그레이드되는 즉시 APK가 비활성화된다는 의미입니다.

대략적인 이전 흐름을 살펴보겠습니다.

  1. 사용자가 기기를 Android 14로 업그레이드합니다.
  2. Jetpack 14에서는 사용자를 모듈 API로 라우팅하고 이전이 진행되는 동안 이를 차단합니다.
  3. 이전 프로세스는 모듈 버전이 APK와 기능이 호환될 때 시작됩니다. 즉, 모듈 버전에 동일한 기능 세트 또는 그 이상이 포함되어 있습니다. 이전 프로세스가 시작되면 APK가 권한 및 데이터를 이전합니다.
    1. 두 버전 모두 기능이 호환되지 않는 경우 모듈 버전을 업그레이드해야 합니다. 업그레이드가 완료되면 이전 프로세스가 시작됩니다.
  4. 이전이 완료되면 상태가 '이전 완료'로 변경되고 모듈 API가 차단 해제됩니다.
  5. 이제 APK를 제거할 수 있습니다.

이전 UI 요소

다음 화면은 이전 전과 이전하는 동안 사용자 교육 목적으로 프레임워크 모듈에서 표시합니다.

그림 1. 헬스 커넥트 APK가 '이전 인식'이 아닌 경우 사용자에게 APK를 업데이트하라는 메시지가 표시됩니다. 사용자가 업데이트를 거부하면 모듈은 계속 작동하고 권한과 데이터를 축적하기 시작합니다.

휴대전화 업데이트 필요


그림 2. 프레임워크 모듈이 기능 호환을 위해 업데이트가 필요한 경우 사용자에게 업데이트를 실행하고 기기를 재부팅하도록 요청하는 메시지가 표시됩니다. 사용자가 업데이트를 거부하면 모듈은 계속 작동하고 권한과 데이터를 축적하기 시작합니다.

APK 업데이트 필요


그림 3. 이전 프로세스 중에 스피너가 표시되며 데이터가 동기화되고 있다는 텍스트가 포함됩니다.

데이터 동기화

중복 제거된 데이터

이전 또는 클라우드 기반 복원이 진행되기 전에 프레임워크 모듈이 데이터 및 권한을 획득하기 시작했다면 다음 규칙이 적용됩니다.

권한

프레임워크 모듈 내에 권한이 있는 경우 APK에서 획득한 중복 권한은 이전 프로세스 중에 무시됩니다.

데이터

이전하는 동안 APK에서 발생하는 중복 데이터는 무시됩니다. 모듈의 최신 데이터가 우선 적용됩니다.

클라이언트에서 레코드 ID를 제공하면 clientRecordId에서 데이터가 중복 제거됩니다. 그렇지 않으면 시간 간격(내부 레코드의 경우 startTimeendTime, 인스턴트 레코드의 경우 time)이 앱의 데이터 유형 및 패키지 이름과 함께 키로 처리됩니다.

Jetpack SDK의 변경사항

Jetpack SDK는 헬스 커넥트 APK 및 헬스 커넥트 프레임워크 API의 공통 통합 지점 역할을 합니다.

OEM은 Jetpack 13과의 통합을 시작할 수 있으므로 Jetpack 14가 제공되면 새 라이브러리를 적용하고 Android 14 내에서 컴파일할 수 있습니다.

Android 14로의 전환을 지원하는 새 버전의 SDK가 출시됩니다. 원활한 전환을 위해 기존 통합을 일부 변경해야 합니다.

권한 선언

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>

헬스 커넥트 열기

대부분의 서드 파티 앱에는 Fitbit의 '액세스 관리' 버튼과 같이 헬스 커넥트 앱을 여는 버튼이 있습니다.

Android 13에서는 패키지 이름을 사용하거나 androidx.health.ACTION_HEALTH_CONNECT_SETTINGS 작업을 통해 헬스 커넥트 앱을 엽니다.

Android 14에서는 Jetpack SDK에 지정된 인텐트 작업을 사용해야 합니다. 이 작업은 작동하는 Android 버전에 따라 값이 다릅니다.

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

헬스 커넥트 클라이언트 가져오기

Jetpack 11에서 사용할 수 있는 sdkStatus라는 단일 API를 만들었습니다. 이 API는 지원 중단된 다른 2개의 API인 IsSdkSupported()isProviderAvailable()을 대체합니다.

Session Record API 변경사항

alpha10 출시의 일환으로 ExerciseSession 하위유형 4개가 삭제되었습니다.

  • ExerciseEvent
  • ExerciseLaps
  • ExerciseRepetitions
  • SwimmingStrokes

ExerciseSessionRecord와 마찬가지로 SleepStageSleepSession의 하위유형이 됩니다.

ExerciseSessionRecord 하위유형과 SleepSession 변경사항이 모두 4월 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일 동안의 모든 데이터 읽기 및 중복 제거

앱이 헬스 커넥트에서 마지막으로 데이터를 읽은 시간의 타임스탬프를 저장합니다. 토큰 만료 시 이 값 또는 이전 30일(어느 쪽이든 최솟값에 해당하는 것)부터 데이터를 다시 읽고 UUID를 사용하여 이전에 읽은 데이터를 대상으로 중복 제거해야 합니다.

2. '마지막 읽기' 타임스탬프 이후 데이터 읽기

헬스 커넥트에서 데이터를 마지막으로 읽은 시간을 나타내는 타임스탬프를 설정하고 토큰 만료 시 해당 값 이후의 모든 데이터를 읽습니다.

3. 지난 30일 동안의 데이터 삭제 및 다시 읽기

지난 30일 동안 헬스 커넥트에서 읽은 모든 데이터를 삭제하고 해당 데이터를 모두 다시 읽습니다(예: 앱이 처음 헬스 커넥트와 통합될 때처럼).

4. 아무 작업도 하지 않음(즉, 지난 30일 동안의 데이터를 다시 읽고 중복 제거하지 않음)

이 방법은 중복 데이터가 표시될 수 있는 위험이 있어 최후의 수단으로 사용해야 합니다. UUID를 이미 사용 중임을 고려하면 개발자는 대신 옵션 1~3을 살펴봐야 합니다.

Jetpack SDK로 Android 14 API 테스트

Android 14 Jetpack SDK는 Android 14 베타 3 출시와 함께 2023년 6월 7일에 출시될 예정입니다. Android 14 Jetpack SDK를 사용하려면 Android 14에서 앱을 컴파일해야 합니다.

6월 7일 전에 Android 개발자 프리뷰 빌드를 대상으로 솔루션을 테스트하려면 Google POC에 문의하여 지원을 받으세요.

베타 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에서는 헬스 커넥트 개인 정보 보호 및 데이터 관리 제어가 시스템 설정에 있습니다.

데이터 관리 및 권한 화면이 기기의 일부인 것처럼 보이도록 하기 위해 헬스 커넥트에서는 맞춤 오버레이 사용을 통해 OEM 테마 설정을 제공합니다.

OEM 스타일 지정에 관한 문서는 헬스 커넥트 Google 모바일 서비스 문서를 참고하세요.