문제 해결

샘플 앱

Home API를 사용할 때 문제가 발생하면 추가 디버깅을 위해 로그를 수집할 수 있습니다. 휴대기기에서 로그를 수집하려면 Android 디버그 브리지 (adb)가 필요합니다. Google의 지원이 필요한 경우 Android 기기와 허브에서 모두 로그를 수집하고 문제 추적기에서 관련 정보와 연결된 로그를 포함하여 티켓을 여세요.

Android 로그 수집

adb와 관련된 모든 단계에서 휴대기기가 로컬 머신에 연결되어 있어야 합니다.

adb 설치

아직 Android 디버그 브리지를 설정하지 않았다면 로컬 머신에서 설정합니다.

  1. 컴퓨터에 'adb'를 설치합니다.
  2. Android 휴대전화에서 개발자 옵션과 USB 디버깅을 사용 설정합니다.

Android 스튜디오용 Google Home 플러그인

Google Home Plugin for Android Studio는 로그를 수집하고 분석하는 데 유용한 도구이며 Google Home platform 개발자를 위해 특별히 제작되었습니다. 이 플러그인을 사용하면 Google Assistant Simulator, Cloud Logging, 기타 도구에 액세스하여 smart home 개발 프로세스를 간소화할 수 있습니다.

이 도구를 adb와 함께 사용하여 Matter 기기 로그를 추가로 분석합니다.

자세한 내용을 알아보고 도구를 다운로드하려면 Google Home Plugin for Android Studio를 참고하세요.

버전 정보

로그를 수집할 때마다 설정과 관련된 모든 버전 정보를 수집하는 것이 좋습니다. Google과 문제를 공유해야 하는 경우 이 동의가 필요합니다.

  1. 휴대기기의 ID를 가져옵니다.
    adb devices
    List of devices attached
    device-id    device
  2. 이 값을 phoneid라는 변수에 저장합니다.
    phoneid=device-id
  3. 다양한 기기 정보를 변수에 저장합니다.
    containerinfo=$(adb -s $phoneid shell dumpsys package com.google.android.gms | grep "versionName" || true);
    homemoduleinfo=$(adb -s $phoneid shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.home " || true);
    optionalhomemoduleinfo=$(adb -s $phoneid  shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.optional_home " || true);
    policyhomemoduleinfo=$(adb -s $phoneid  shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.policy_home" || true);
    threadinfo=$(adb -s $phoneid shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.threadnetwork" || true);
    ghainfo=$(adb -s $phoneid shell dumpsys package com.google.android.apps.chromecast.app | grep versionName || true);
    enabledfeatures=$((adb -s $phoneid shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "Enabled features" | grep -i "home") || true);
    androidversion=$(adb -s $phoneid shell getprop ro.build.version.release || true);
    androidapiversion=$(adb -s $phoneid shell getprop ro.build.version.sdk || true)
  4. 모든 변수를 _versions.txt 파일에 저장합니다.

    확장하여 변수를 파일에 저장하는 명령어 표시

    전체 블록을 한 번에 복사하여 터미널에 붙여넣을 수 있습니다.

    versionfile=$logtimestamp"_versions.txt"
    echo "Saving version info to $versionfile"
    
    echo "Container version:" >> $versionfile
    echo $containerinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Home Module version:" >> $versionfile
    echo $homemoduleinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Optional Home Module version:" >> $versionfile
    echo $optionalhomemoduleinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Policy Home Module version:" >> $versionfile
    echo $policyhomemoduleinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Thread Module version:" >> $versionfile
    echo $threadinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "GHA version:" >> $versionfile
    echo $ghainfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Android version: " >> $versionfile
    echo $androidversion >> $versionfile
    echo "" >> $versionfile
    
    echo "Android API version: " >> $versionfile
    echo $androidapiversion >> $versionfile
    echo "" >> $versionfile
    
    echo "Found enabled features (blank if missing):" >> $versionfile
    echo $enabledfeatures >> $versionfile
    echo "" >> $versionfile
  5. _versions.txt의 콘텐츠를 확인합니다.
    cat _versions.txt

    샘플 파일 출력을 표시하려면 펼치세요.

    Container version:
    versionName=23.19.12 (190400-530524295) versionName=22.46.17 (190408-491726958)
    
    Home Module version:
    com.google.android.gms.home [v230508900]
    
    Optional Home Module version:
    
    
    Policy Home Module version:
    com.google.android.gms.policy_home [230508900] [230508900065.505615668.505615668] [Download:000003be/dl-Home.integ_230508900100400.apk] [download:/Home.integ/230508900100400:Home.integ:230508900100400]
    
    Thread Module version:
    com.google.android.gms.threadnetwork [v231912000]
    
    GHA version:
    versionName=3.2.32.1
    
    Android version:
    13
    
    Android API version:
    33
    
    Found enabled features (blank if missing):
    이제 이 파일을 문제 해결에 필요한 경우 Google에 제공할 수 있습니다.

로그 수집

로그를 수집하려면 휴대기기에서 실행 중인 모든 앱을 닫습니다. 그런 다음 아래를 실행합니다.

  1. 터미널 창을 열고 기존 기기 로그를 지웁니다.
    adb logcat -b all -c
  2. 로그 수집 프로세스를 시작합니다.
    adb logcat >> _logs.txt
    이 터미널을 열어 둡니다. 이렇게 하면 프로세스가 실행되는 동안 기기에서 로그가 수집됩니다.
  3. 샘플 앱을 실행하고 모든 사용자 인터페이스 작업을 캡처합니다. 완료되면 Ctrl+C (Mac의 경우 Cmd+C)를 눌러 터미널에서 실행 중인 logcat 프로세스를 중지합니다.
  4. 이 세션의 로그는 _logs.txt라는 파일에 저장됩니다.

error, exception, crash와 같은 키워드를 검색하는 등 다양한 방법으로 이 파일의 정보를 분석할 수 있습니다.

로그 스크립트

편의를 위해 샘플 앱은 관련 로그를 가져와 텍스트 파일로 컴파일하는 스크립트를 제공합니다. 최상의 디버깅 환경을 제공하려면 이러한 로그를 Google의 근본 원인 분석을 용이하게 하기 위해 신고된 모든 버그에 첨부해야 합니다.

이러한 로그는 샘플 앱 소스 트리의 scripts 디렉터리에 있습니다. 실행하려면 프로젝트 루트 디렉터리에서 다음 단계를 따르세요.

  1. 휴대기기의 ID를 가져옵니다.
    adb devices -l
    List of devices attached
    device-id device
  2. get_logs.sh 스크립트를 실행합니다.
     ./scripts/get_logs.sh device-id
    Cleared previous logs from device.
    Saving version information to home_api_sample_logs_20240605233243.txt...
    Saving logs to home_api_sample_logs_20240605233243.txt...
    (Press CTRL+C to stop the script)
  3. 문제를 재현합니다.
  4. CTRL+C를 눌러 스크립트를 중지합니다.

스크립트는 모든 관련 정보가 포함된 타임스탬프가 지정된 로그 파일을 생성합니다. 발생한 버그 신고에 첨부하세요.

Cast 허브 기기 로그

다음 단계에 따라 Google 허브의 기기 로그를 볼 수 있습니다.

  1. Android 디버그 브리지를 설정합니다.
  2. 허브의 IP 주소를 가져옵니다.

    • 화면이 있는 허브의 경우 다음 단계를 따르세요.
      1. 화면 상단에서 아래로 스와이프합니다.
      2. 설정 아이콘 을 탭합니다.
      3. 기기 IP 주소 찾기: Nest Hub (2nd gen)에서 기기 정보 > 기술 정보 > IP 주소로 이동합니다.
    • 휴대전화의 GHA에서 다음 단계를 따르세요.
      1. 기기를 탭하여 기기 세부정보 페이지를 엽니다.
      2. 설정 아이콘 을 탭하여 설정 페이지를 엽니다.
      3. 기기 IP 주소 찾기: 기기 정보 > 기술 정보 > IP 주소로 이동합니다.
  3. 기기와 동일한 Wi-Fi 네트워크에 연결된 컴퓨터에서 다음 단계를 따르세요.

      adb connect ip-address
      adb logcat
    

  4. 다른 사용자에게 로그를 제공하려면 실패하는 작업을 실행하고 출력을 텍스트 파일로 파이프합니다.

      adb logcat -d > platform-logs.txt
    

자동화

노이즈 제거

Google Home 생태계의 자동화에는 에지 감지가 포함되어 있습니다. 에지 감지는 기기의 이전 상태를 반복하는 상태 업데이트와 달리 실제 상태 변경이 있을 때만 시작 조건이 활성화되도록 하는 로직입니다.

예를 들어 조명 켜기가 시작 조건인 경우, 조명 기기가 꺼짐에서 켜짐으로 전환될 때만 시작 조건이 활성화되고 켜짐에서 켜짐으로 전환될 때는 활성화되지 않습니다 (변경 없음).

자동화가 예상대로 작동하지 않음

가장자리 감지를 고려한 후에도 자동화가 예상대로 작동하지 않으면 다음 단계를 따르세요.

  1. 각 기기가 자동화와 관계없이 제대로 작동하는지 확인합니다.

  2. 자동화의 자동화 그래프를 살펴보고 자동화 DSL과 비교하여 잘못된 가정이 있는지 확인합니다.

  3. 자동화가 실행되는 동안 Google Home 앱에서 기기 상태를 관찰합니다.

  4. 자동화에서 참조하는 모든 기기가 예상되는 구조에 있는지 확인합니다. 자동화가 종속된 기기를 삭제하면 의도치 않은 결과가 발생할 수 있습니다. 기기 삭제가 자동화에 미치는 영향을 참고하세요.

실행되어서는 안 되는 자동화가 실행됨

자동화가 실행되어서는 안 되는 시점에 실행되는 경우 시작 조건을 검토하세요. 상태 변경이 한 번만 캡처되고 자동화가 한 번만 트리거되도록 하려면 로직을 추가해야 할 수 있습니다.

자동화가 컴파일되지 않음

앱에 다양한 노드 유형에 해당하는 각 클래스와 참조하는 트레잇을 비롯하여 필요한 모든 가져오기가 포함되어 있는지 확인합니다.

자동화 생성 시 유효성 검사 실패

자동화 생성이 유효성 검사를 통과하지 못하면 경고 또는 오류 메시지에 문제에 관한 정보가 제공됩니다. 자세한 내용은 ValidationIssueType 참조를 참고하세요.

목록 함수가 예외를 발생시킴

Automation API List 함수를 호출할 때 읽기 핸들러가 누락된 API 기능으로 인해 예외를 발생시킬 수 있습니다. 이 문제를 완화하려면 영향을 받는 자동화를 삭제하세요.

방법은 다음과 같습니다.

  1. adb가 설치되어 있는지 확인합니다. adb 설치를 참고하세요.
  2. 다음을 호출하여 Android 로그에서 자동화의 ID를 가져옵니다.

    adb logcat -s GhpNative

    예시 로그:

    adb logcat -s GhpNative level:debug | grep -A 10 -B 10 AutomationManagerTrait\.ListResponse
    
    INTERACTION RESPONSE -> SendCommandsResponse:
    1 {
    1: "automation@global"
    3 {
      1: "home.internal.traits.automation.AutomationManagerTrait.ListResponse"
      2:
      5 {
        1: "type.googleapis.com/home.internal.traits.automation.AutomationManagerTrait.ListResponse"
        1 {
            1: "1111-2222-3333-44444-55555" // Automation ID to delete
            2: "structure@2222-3333-4444-5555-6666"
    ...

    여러 자동화 ID를 삭제해야 하는 경우 터미널 페이저를 사용하여 출력을 제어할 수 있습니다.

    adb logcat -s GhpNative level:debug | less
  3. 자동화 ID를 사용하여 자동화를 삭제합니다.

    structure.deleteAutomation(new object : HasId(id = "1111-2222-3333-44444-55555"))
    

트레잇이 등록 취소되면 Discovery API에서 경고를 로깅함

Discovery API가 Trait not found에 관한 경고를 로깅하면 API가 Discovery 후보에 트레잇을 사용하려고 시도하고 있지만 초기화 중에 트레잇이 등록되지 않았기 때문에 실패한다는 의미입니다. 예를 들면 다음과 같습니다.

09-03 17:45:20.578 10646 10646 W AutomationSdk: trait_id: "home.matter.6006.clusters.fc43" and Exception occurred com.google.home.HomeException: 18: Trait not found: home.matter.6006.clusters.fc43
09-03 17:45:20.578 10646 10646 W AutomationSdk: While converting candidate: # com.google.home.platform.traits.AutomationCandidateNode@76f0b582

트레잇 식별자는 home.matter.6006.clusters.fc43이며 RelativeHumidityControl에 해당합니다. ID에서 트레잇 이름을 확인하려면 트레잇 색인을 참고하세요.

이 예에서는 앱 초기화 중에 RelativeHumidityControl를 등록해야 합니다. 레지스트리에 트레잇을 추가하려면 트레잇 등록을 참고하세요.

OAuth

기존 OAuth 클라이언트가 있는 경우

게시된 앱에 대해 이미 확인된 OAuth 클라이언트가 있는 경우 기존 OAuth 클라이언트를 사용하여 Home API를 테스트할 수 있습니다.

Home API를 테스트하고 사용하기 위해 Google Home Developer Console 등록은 필요하지 않습니다. 하지만 다른 통합에서 확인된 OAuth 클라이언트가 있더라도 앱을 게시하려면 승인된 Developer Console 등록이 필요합니다.

다음 고려사항이 적용됩니다.

  • 기존 OAuth 클라이언트를 사용하는 경우 사용자 한도가 100명입니다. 테스트 사용자를 추가하는 방법에 관한 자세한 내용은 OAuth 동의 화면 설정을 참고하세요. OAuth 인증과는 별도로 애플리케이션에 권한을 부여할 수 있는 사용자는 Home API에서 100명으로 제한합니다. 이 제한은 Developer Console 등록이 완료되면 해제됩니다.

  • Home API로 앱을 업데이트하기 위해 OAuth를 통해 기기 유형 부여를 제한할 준비가 되면Developer Console 등록 을 승인받기 위해 전송해야 합니다.

아직 OAuth 인증이 대기 중인 Google Cloud 앱의 경우 인증이 완료될 때까지 사용자는 OAuth 흐름을 완료할 수 없습니다. 권한을 부여하려고 하면 다음 오류와 함께 실패합니다.

Access blocked: <Project Name> has not completed the Google verification process.