grep

Android

안드로이드 런처와 위젯 톺아보기 (1) - 홈 화면도 앱이었다?

NHN

2021년 12월 22일

원문에서 보기 ↗

소개

안녕하세요, PAYCO 앱기술개발팀에서 PAYCO 안드로이드 앱을 개발하고 있는 유상현이라고 합니다.

대략 작년 초부터 간간히 업무의 일환으로 안드로이드 시스템 및 위젯에 관한 검토(a.k.a 숙제)를 해왔습니다. 검토 내용이 하나둘 내용이 쌓이고 실제 페이코 앱에서 발생했던 이슈 해결에 도움이 되었던 케이스도 생기면서, 기술공유 게시판에 공유해보는 것도 좋겠다는 명을 받고 용기를 내어 글을 쓰게 되었습니다.

조금이나마 도움이 된 분이 생기면 좋겠다는 마음가짐으로 시작해보겠습니다!

주제는 무엇인가요?

안드로이드 폰 사용자라면 모두가 전원을 키고 홈 화면을 처음으로 마주하게 되는데요, 홈 화면도 하나의 앱이라는 사실을 알고 계셨나요?

통상적으로 홈 화면(또는 배경화면, 잠금화면) 이라 불리우는 이 앱 의 공식적 명칭은 런처(Launcher) 로, 런처 중에서도 전원을 켰을 때 처음으로 실행되는 런처를 Default Launcher 라고 부른다고 합니다.

해당 연재에서는 UX상으로 모든 안드로이드 앱 사용의 근간이 되는 이 Default Launcher(편의상 이후 런처라고 하겠습니다.) 의 실행 과정에 대한 주제로 시작하여, 런처의 다양한 역할 중 주로 안드로이드 위젯에 초점을 두고 공유를 해보려 합니다. 또한 위젯 내용은 페이코 앱에서 실제 발생했던 이슈 사례를 같이 작성할 예정입니다.

글재주가 부족해 서론이 길었는데요. 내용이 조금(?)은 개발자의 시선에 치우쳐 있기 때문에 최소한의 관심 유발을 위해(..) 페이코의 가상인물 인기스타1위 출신 배익호 씨를 상황극에 섭외하여 공유를 진짜 시작해보겠습니다

요즘 잘나가는 신형 안드로이드 폰을 새로 산 배익호씨, 언빡싱 후 폰의 전원을 키다.

1.png

새로 바꾼 스마트폰을 처음 킬 때의 그 짜릿한 순간, 기본 세팅을 마치면 재부팅을 할 때 불과 10초 안에 홈 화면을 볼 수 있습니다. 그렇다면,

홈 화면을 노출하는 "런처"도 앱이라고 했는데, 런처는 어떻게 실행되는걸까요?


2.png

런처의 실행 과정은 안드로이드 폰의 부팅 과정에서 일어나는 일이기 때문에, 안드로이드 폰의 부팅 과정을 먼저 알아야 합니다.


안드로이드 시스템 부팅 과정

Android 라는 시스템 은 리눅스 기반으로 구현되어 있기 때문에, Android 단말기를 부팅 하면 여느 리눅스 시스템과 마찬가지로 리눅스 커널에서 처음으로 init 프로세스가 실행됩니다. (init.rc) 이후의 과정을 간단히 표현한 도식화 내용을 검색해봤더니 아래와 같은 형태가 나왔는데요,

3.png

...

4.png

도식화된 내용을 처음 보았을 때의 제 표정이 떠올라 가져와보았습니다. 도식화를 하여도 안드로이드 시스템은 정말 방대하기 때문에, 더 줄여서 이번 연재에서 필요한 최소한의 부분만 박스를 쳐보았습니다.


Zygote 프로세스 실행

init 프로세스 실행 이후에는, Zygote 라는 프로세스가 실행됩니다.

Zygote..? 읽는 법도 어려워보이는 이 단어를 사전에 검색하면 수정란이라는 뜻이 나오는데요.

5.png

수정란.. 한국어도 어렵지만, 뭔가 세포 복제/분열 과 관련된 이름인듯 합니다. Zygote 의 역할은 무엇을 복제하는 것인지 설명하기 위해, 그림이 편할 것 같아 구글의 힘을 빌려 핫한 개구리 이미지를 가져왔습니다.

6.png

Zygote 가 개구리(Android Framework, 모든 앱이 필수적으로 사용하는 클래스들)를 한번 로딩해놓으면, 이후 사용자가 앱을 실행할 때마다 Zygote 개구리는 복제되어 (리눅스 fork 함수) 앱 실행시 Zygote 가 로딩한 부분 이외에 각 앱에서 필요한 부분들(오른쪽 낙서) 만 읽어들여 실행 속도가 향상되도록 기여합니다.

결론적으로 Zygote 라는 친구는 새로운 앱 실행이 필요할 때 자신을 복제하여 순식간에 앱이 켜지도록 하는데에 큰 기여를 하는 친구였습니다.


SystemServer 실행

Zygote 프로세스 실행 이후에는 SystemServer 라는 친구가 실행됩니다. (이 외에도 수많은 다른 일들이 일어나지만 제맘대로 스킵했습니다.)

딱 봐도 중요해보이는 이름을 가진 SystemServer 란, 모든 안드로이드 앱들이 공통적으로 활용하는 시스템 API 를 관장하는 로컬 서버로, GPS, 단말기 정보, 앱 설치 정보, 네트워크 정보, 오디오 정보, NFC 정보... 등 어느 앱에서 접근해도 동일한 정보들은 거진 이곳에서 관리된다고 볼 수 있습니다. 안드로이드 개발자라면 한번쯤 만나게 되는 바로 그녀석, getSystemService 로 획득할 수 있는 거의 모든 Service 들은 이 SystemServer 를 통해 획득하는 클래스들입니다.

(PAYCO 에서 사용중인 getSystemService 코드 중 일부)

7.png


PackageManager 초기화

SystemServer 의 광범위한 역할 중, 런처와 가장 밀접한 관련이 있는 클래스를 하나 뽑자면 PackageManager 를 고를 수 있다고 생각합니다.

PackageManager 초기화 과정에서는 단말기에 설치된 모든 apk 의 정보를 파싱하여 획득합니다. (root 디렉토리부터 .apk 파일을 모두 조사하여, AndroidManifest.xml 파싱 진행)

이 모든 apk 의 정보는, 런처 실행 및 런처가 설치된 모든 앱을 화면에 노출할 수 있도록 도와주는 역할을 합니다.

런처 앱 탐색

8.png

드디어! Zygote, SystemServer, PackageManager, 그외 생략한 많은 단계를 거쳐 안드로이드 시스템은 꽁꽁 숨어있는 런처 앱을 찾아낼 준비가 되었습니다. (언빡싱 후 폰을 킨 배익호씨는 아직도 홈 화면을 못보고 있습니다)

PackageManager 에서 획득한 apk 정보들을 바탕으로, 안드로이드 시스템은 AndroidManifest.xml 파일에 아래의 코드를 포함하고 있는 apk 를 찾습니다.

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.HOME"/>
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

9.png

(찾았다 요놈!) 만약 해당 코드가 있는 apk 가 여러개일 경우, 시스템 상에서 우선순위가 높은 apk 를 런처로 간주합니다.(기본 런처앱으로 사용 옵션을 지정한 apk)

런처 앱 실행

10.png

드디어 기나긴 과정을 거쳐(실제로는 순식간에 일어나지만), 시스템은 런처 앱을 실행하게 되었습니다. 다음 편에서는 실행된 런처가 설치된 앱들을 어떻게 노출할 수 있는건지, 이어서 공간이 남는다면 런처의 기능 중 하나인 앱 위젯에 대한 내용까지 작성해보겠습니다.

11.png

긴 글 읽어주셔서 감사드리며, 그럼 다음편에 뵙겠습니다. 감사합니다. (_ _)

(이미지 출처)