태그 보관물: 안드로이드

안드로이드 스마트 워치용 괘종시계 페이스

개요

안드로이드 기반 스마트 워치를 사용하던 친구가 새로운 것을 구매하면서 써 보라고 주었습니다. 스마트 워치를 처음 써 보았는데 다양하게 디자인을 변경할 수 있는 것이 좋았습니다. 문득 괘종시계 앱의 디자인을 넣었으면 좋겠다는 생각이 들었습니다. 그래서 한번 스마트 워치 페이스를 제작해 보기로 했습니다.

정보 수집

안드로이드 스마트 워치의 페이스를 만드는 방법을 알아보니 이전에는 프로그래밍 방식이었고 지금은 WFF(Watch Face Format) 형식으로 정의해서 제작하는 것으로 변경되었다는 것을 알게 되었습니다. 즉, 프로그램 코드는 전혀 들어가지 않습니다.

개발 도구 선택

필자는 Android Studio 를 이용해서 제작할 계획이었습니다. 자료를 찾는 중에 Watch Face Studio 라는 도구가 있고 꼭 개발자가 아니어도 쉽게 제작할 수 있도록 해 주는 것 같았습니다. 필자는 또 다른 도구를 설치하는 것 보다 원래 사용하던 것으로 작업하는 것이 나을 것 같다는 생각이 들어 Android Studio 로 진행하기로 결정했습니다.

제작

Android Studio 에서 New Project > Wear OS > No Activity 를 선택하여 프로젝트를 생성했습니다. 다른 Wear OS 앱은 모르겠는데 워치 페이스는 Activity 가 없어야 aab 파일을 빌드할 수 있습니다.

Wear OS 프로젝트 생성
Wear OS 프로젝트 생성

프로젝트 구조를 살펴보니 기존 앱과 큰 차이가 없었습니다. 프로그래밍 언어로 작업하는 것이 아니어서 build.gradle 파일에서 프로그램 언어와 관련한 부분을 모두 삭제했습니다.

/res/raw/watchface.xml, /xml/watch_face_info.xml 파일을 새롭게 추가하고 형식에 맞추어 시계의 모양을 정의했습니다.

테스트

Wear OS 에뮬레이터를 설치하고 실행해서 일반 안드로이드 앱처럼 테스트를 진행했습니다. 처음에는 원하는 모양이 정확하게 나타나는지 확인했습니다. 그 다음으로 시침, 분침, 초침의 색상 변경, 배경 변경의 기능을 추가했습니다.

어느 정도 구색이 갖추어 지고 실제 스마트 워치에 올려서 테스트를 진행했습니다. 보여지는 것 자체는 문제가 없었는데 시분초침의 색상 테마 변경, 배경 이미지의 변경이 실제로 반영되지 않는 문제가 있었습니다. 이것은 Wear OS의 버전과 WFF 버전간의 불일치 문제였습니다.

필자가 테스트로 사용한 스마트 워치는 Wear OS 5 였고 이 버전이 작업한 WFF 버전을 제대로 지원하지 못하는 문제였습니다. 기기 연동 앱을 통해 연결된 스마트 워치의 모양을 변경하면 제대로 반영이 되므로 그것으로 만족할 수 밖에 없었습니다.

빌드 시 문제

에뮬레이터와 실제 기기에서 문제가 없어서 당연히 빌드에는 문제가 없을 것이라 생각했습니다. 그러나 처음 보는 오류가 많이 발생했습니다. 다른 오류들은 비교적 쉽게 해결이 가능했습니다. 그러나 다음 오류 메시지 해결은 어려웠습니다.

Watch face base module cannot have any components and can only have resources.

결론부터 말하면 이 오류는 AndroidManifest.xml 파일에 activity 가 정의되어 발생한 문제였습니다. 필자가 정의한 AndroidManifest.xml 파일에는 activity 가 없어서 문제 해결에 시간이 많이 소요되었습니다. 이 오류를 해결하는 방법은 하단의 Merged Manifest 탭을 선택해서 activity 가 있는지 확인하고 관련된 라이브러리나 설정을 해제하면 됩니다.

Merged Manifest 탭 확인
Merged Manifest 탭 확인

WFF 형식을 검사해 주는 도구도 있으니 반드시 문제가 없는지 확인 후 빌드해야 합니다. wff-validator.jar 이름으로 자료를 찾아보면 됩니다.

구글 플레이 업로드

기본 정보는 다른 일반 앱들과 비슷한데 폼 팩터를 등록해야 한다는 점이 다릅니다. 테스트 및 출시 > 고급 설정 > 폼 팩터 탭 선택하고 폼 팩터 추가 링크를 클릭합니다. Wear OS를 선택하고 진행하면 추가 됩니다.

Wear OS 폼 팩터 추가 된 화면
Wear OS 폼 팩터 추가 된 화면

작업 시 항상 Wear OS 전용이 선택되어 있는지 확인하시기 바랍니다. 필자는 아무 생각 없이 진행하다가 휴대전화, 태블릿… 이것으로 선택된 상태라는 것을 나중에 알았습니다.

Wear OS 전용 선택
Wear OS 전용 선택

개인적으로 Wear OS 관련 설정이 숨어 있어서 혼동이 많이 된다는 생각이 들었습니다. 구글 측에서 이것을 좀 개선해 주었으면 좋겠습니다.

안드로이드 스마트 워치용 괘종시계 페이스
안드로이드 스마트 워치용 괘종시계 페이스

느낀 점

안드로이드 스마트 워치용 페이스를 Android Studio 로 제작하는 데 관련한 정보가 부족하다는 것을 많이 느꼈습니다. 자료를 찾아보거나 AI 도움을 받아보면 이전 프로그래밍 방식으로 제작했을 때의 해결책만 있는 경우가 많았습니다. 그래도 WFF 정의 방식으로 일반 사용자들도 쉽게 만들 수 있게 전환한 점은 활발한 생태계를 위해서 좋은 일이라 생각되었습니다.

처음이라서 헤메이기도 하고 바보 같은 실수도 했지만 또 다른 페이스를 만들 수 있는 기반이 되었다고 생각합니다.

다음 주소에서 확인하실 수 있습니다. 유료 워치 페이스 입니다.

https://play.google.com/store/apps/details?id=jaeyoung.kim.grandfatherclockface

Android 13(API level 33) 이상 Storage 관련 오류 해결

개요

새로운 앱을 업로드 하는데 API level 34 이상이어야 했습니다. API level 이 낮은 장비에서 잘 동작해서 34 로 변경 후 구글플레이에 업로드 했습니다. 그런데 앱이 거부되었습니다.

거부 이유

메일의 제목은 조치 필요: 앱이 Google Play 정책을 준수하지 않음 이었습니다. 세부 내용을 확인해 보니 다음과 같았습니다.

발견된 문제: 손상된 기능 정책 위반

비정상 기능 정책을 준수하지 않는 콘텐츠가 포함되어 있습니다.

  • 앱이 로드되지만 응답하지 않음
메일 내용

문제 파악

이미지 까지 첨부되어 있어 확인해 보았습니다. 내용은 Storage 에 쓰기 권한을 요청하는 화면이었습니다.

첨부된 이미지

단순히 SETTINGS 를 눌러 권한을 허용하면 될 것 같은데 뭔가 좀 이상했습니다.

API level 34 를 지원하는 실제 테스트 기기가 없어서 에뮬레이터를 이용해서 테스트 해 보았습니다. 앱을 설치하고 실행하니 위와 같은 화면이 나타났습니다. SETTINGS 를 터치하니 앱의 권한 관리 화면으로 이동 되었습니다. 그런데 권한을 추가할 수 없고 요청된 권한 사항이 없다는 글자만 나타나고 비활성화 되어 있는 상태였습니다.

앱이 위의 화면에서 설정 화면으로 이동만 되고 더 이상 할 수 있는 것이 없어서 정상적으로 실행되지 않는다는 것을 확인했습니다.

문제 해결

이전 API level 에서는 처음에 나타나는 권한 부여만 선택해 주면 문제 없이 동작했습니다. 문제는 API level 33 이상에서 나타나는 것으로 생각되었습니다. 이리저리 찾아보니 AndroidManifest.xml 파일에 권한 관련 설정 부분에 추가 내용이 필요했습니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

android:maxSdkVersion=”32″ 를 위와 같이 추가해서 다시 업로드 하면 문제 없이 앱이 등록되었습니다.