brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Apr 20. 2017

GDG DevFest Seoul 2016 후기

소규모 팀으로 1억 글로벌 앱 개발하기

소규모 팀으로 1억 글로벌 앱 개발하기




작년에 다녀온 행사인데 공식적인 발표자료를 기다리다가 이제야 발행하네요.

다른 후기에도 발표 내용이 있는 걸로 봐서 오픈해도 저작권 문제? 는 없는 거 같습니다.

혹시라도 문제가 있다면 삭제할게요 ㅎㅎ





안드로이드 버전별 호환성


호환성 라이브러리 : support-compat(support-v4)

안드로이드 버전별 API 호환성 해결

Notification API는 매번 바뀌는 API 중에 하나


플랫폼 내장 리소스:appcompat-v7

- theme는 버그 투성이, 버전 바뀔 때마다 매번 새로운 버그가 있음

- appcompat-v7을 사용하는 것이 최선


API 문서에는 표시되지 않는 호환성 문제

AOSP에서 조용히 생겼다가 플랫폼 업데이트하면서 사라지는 버그

하지만 실제로는 계속 발생




신규 안드로이드 버전


예) 런타임 퍼미션

스토리지 접근 권한의 경우 사용자가 허용해도 프로세스가 다시 시작되어야만 스토리지 접근 가능한 문제 머시멜로 초기 빌드에서 발생


예) TextView

매 업데이트마다 각종 문제 나타났다가 조용히 사라지는 경우 많음

특별한 상황에서 미묘하게 동작 변경되는 경우도 많음


Deprecated API

Deprecated 되었다고 다른 API 사용하라고 Android Studio에서 경오 메시지만 보고서 수정해서는 안됨. 반드시 Deprecated 되기 이전 버전에서 테스트

예) singleLine="true" is deprecated use maxLines="1" instead.

실제로는 maxLines="1" and ellipsize="end"로 변경해야 같은 동작


platform_framework_base 소스와 친해져야 함.

http://github.com/android/platform_frameworks_base




제조사별 호환성


예) ActionMode : 공개된 Abstract Class

제조사가 여기에 abstract method를 추가 내부적으로 호출한 경우가 있음.

Appcompat-v7에서 이것을 상속받아 구현하고 있는데 Runtime exception 발생

Appcompat-v7 소스 직접 사용하고 수정해서 방어


예) TextView

edit 불가능한 상태의 TextView에서 클립보드 Cut 메뉴를 사용자에게 표시해서 Runtime Exception 발생. 상속해서 Runtime Exception 방어 처리


예) ImageView

특별한 이유 없이 request layout을 호출해서 ListView의 스크롤 성능을 대폭 떨어뜨림. 상속해서 문제 해결




제조사별 에러 대응


삼성은 적극적으로 QA 하고 AOSP 버그의 대응을 하는 것으로 보임

AOSP 에 있는 문제 상당 부분이 삼성에서는 발생 안 함

하지만 삼성만의 다른 문제가 발생하기도 함


모토로라는 빠르게 새로운 버전을 적용

AOSP의 각종 문제 그대로 발생

펌웨어 업데이트가 안 하는 사용자 많아서 초기 버전 문제 지속적 발생


디바이스는 최소 삼성과 구글의 두 가지 이상 폰으로 테스트 필요함




구글 플레이 서비스 API


구글 플레이 서비스 라이브러리

애드몹, 구글 애널리틱스, 구글 인증, 구글 드라이브, 게임, 파이어 베이스


구글이 자체적으로 기능 업데이트

com.google.android.apk 자동으로 업데이트됨


개발 시에 없던 문제 구글 플레이 서비스 업데이트로 발생




릴리즈전 완벽한 문제 해결은 불가능 하지만 관리할 수 있어야 함




베타 테스트 & 롤아웃


구글 플레이에서 쉽게 가입 가능한 베타 테스팅 기능 추가됨

구조에 큰 변경이 있으면 바로 베타 테스트 업로드


APK Staged Rollout 반드시 사용

한 번에 Publish 절대로 하지 않기

0.5%, 1%, 5%, 10%, 20%, 50%, 100%

잦은 업데이트는 언인스톨의 원인, 천천히 조심스럽게 올리기


Manage release 플레이 개발자 콘솔에 추가됨

베타 테스트 및 rollout 히스토리 확인 가능




문제 모니터링


개발자 콘솔 crashes에 보고된 문제

실제 해당 문제는 10배 이상 발생한다고 가정

보고 확인까지 시간차가 있음


사용자가 발생 문제에 대한 이메일 및 댓글 작성

실제 해당 문제는 100배 이상 발생한다고 가정


Unhandled Exception

Crashlytics, Firebase 등의 외부 도구가 필요함.

실시간 확인이 가능해야 함 : 실시간 확인이 안 되는 도구는 사용 불가

이상 현상 감지 시 알림  서비스도 제공한다면 최고




릴리즈 문제 확인 및 해결 과정


릴리즈 시작은 월요일 오전이 최적, 불금에는 롤아웃 크게 올리는 것 금지

요즘은 APK 올리면 최소 1시간 안에 배포 시작


실시간 크래쉬 리포트 모니터링


크래쉬가 발견되면 일단 문제의 중요성 파악

심각한 문제면 릴리즈 중단 처리 후 해결하고 빠르게 다시 업로드

덜 심각한 문제면 추가 문제 파악을 위해서 일단 계속 진행


사용자수와 코드 변경 정도에 따라서 롤아웃 속도 조절

사용자 수가 많으면 0.5%만 올려도 바로 문제 발견되지만

사용자 수가 적으면 5% 정도는 올려야 문제가 발견될 수 있음

10%로 1일 이내에 발생하는 문제는 1%로 10일 걸려 확인할 수도 있음

시간적 여유를 가지고 릴리즈 하기


Runtime Exception 발생 시

정확한 문제 발생 원인 파악 후 코드 수정

정확한 문제 파악이 안 되는 경우 일단 크래쉬 방어 처리하고 해당 문제에 대해서 문제 수집 서버에 보고 처리해서 얼마나 발생하는지 차후에 해결할 수 있도록 지속적인 모니터링


Runtime Exception의 종류 파악

개발자가 잘못한 문제 : 부주의함을 반성하고 수정

특정 버전 및 디바이스에서만 발생하는 문제 : 해당 문제가 재현이 안 되는 경우 특정 버전 및 디바이스에서만 발생하는 것일 수 있으니 확인

해결할 수 없는 문제 : APK 설치 도중 문제가 생겨 앱이 비정상 동작하는 경우, 시스템의 이상으로 비정상 동작하는 경우, 업데이트 중 일시적으로 발생하는 문제

문제 파악을 잘못하는 경우가 있을 수 있으니 매우 명확한 문제를 제외하고는 문제 수집 서버에 보고 처리해서 지속적으로 모니터링하는 게 좋음. 해결할 수 없는 문제로 생각했는데 알고 보니 개발이 잘못된 경우 종종 발생




신규 안드로이드 버전 대응


신규 안드로이드 버전 대응

일단 targetSdkVersion 수정 없이 현재 apk 문제없이 동작하는지 테스트

targetSdkVersion과 상관없이 API의 동작 자체가 바뀌는 경우가 있으므로 최대한 빠르게 테스트하고 문제를 파악해서 릴리즈를 준비할 필요가 있음

플랫폼의 버그를 만들었다가 조용히 해결하는 경우도 추후에 재현이 어려울 수 있으므로 빠르게 테스트하고 해결할 필요 있음

예) 안드로이드 7.0에서 Application 클래스가 인스턴스화 되지 않고 Activity가 시작되는 경우 종종 발생


새로운 API를 사용하는 것은 조심스럽게




targetSdkVersion


targetSdkVersion 적용은 조심스럽게

targetSdkVersion을 올려서 이득이 없는 경우 바로 올리지 않는 게 좋음

targetSdkVersion 변경 여부에 따라 동작이 바뀌는 것들이 있는데 미쳐 발견하지 못하는 것들이 있을 수 있음.

해결 방법이나 원인에 대해서 충분히 밝혀졌을 시점에 하는 것이 좋음. (스택오버플로에서 쉽게 찾을 수 있는 시점)


구글은 과거 버전을 신경 쓰지 않고 새로운 버전을 올려줄 것을 원함. 하지만 앱 개발자는 실제 사용자의 분포를 고려해서 업데이트 시기를 검토해야 함

저가폰이 많은 이머징 마켓의 경우 하드웨어 제약으로 인해 최신 버전이 아닌 과거 버전의 안드로이드폰이 계속 판매되는 경우가 있음

4.4 버전 사용자는 여전히 많고 빠르게 줄어들지 않고 있음




#01 webview crash


저도 안드로이드 버전에 따른 웹뷰 문제를 겪고 있습니다.

웹뷰 자체가 플레이 스토어를 통해 업데이트되는 중에, 사용자가 웹뷰를 사용하는 액티비티를 실행하면 발생하는 문제입니다.


M 이전 디바이스에서 주로 발생하고, 플랫폼 한계 상 M 이전 디바이스에서 현상을 개선할 방법은 없습니다.
L 버전에서는 웹뷰 업데이트에 걸리는 시간이 길어서;;; 문제가 빈번히 발생하는 걸로. 이후에는 시간이 길지 않아서 거의 문제가 없고요. 해당 이슈 발생하는 시기를 살펴보시면 저희가 시스템 웹뷰 업데이트되는 시기랑 비슷하게 맞아가는 걸로... (대략 6주에 한 번꼴) [Chansuk Yang, Developer Advocate, Google]


아무리 코딩을 잘해도 기타 다른 요인에 의해 버그나 에러가 발생할 수 있습니다.

기존의 단계적 배포나 베타 릴리즈뿐만 아니라, 파이어 베이스의 새로운 도구들도 활용해 보시기 바랍니다.


#02 사전 출시 보고서


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari