HOME > android > feature

안드로이드 Q - Mainline, APEX에 대해서 알아보기

By JS|31 May 2019

Mainline

안드로이드 Oreo에서 소개된 안드로이드 트레블(Treble)이 제조사의 OS 업그레이드 속도를 높이는데 도움을 주었습니다. 하드웨어 인터페이스를 정의하여 포팅이 매우 수월해졌기 때문입니다.(이상적으로는 타 디바이스의 바이너리를 넣어도 동작함)

안드로이드 Q에서는 OS업그레이드를 하지 않고, 부분적으로 시스템을 업데이트할 수 있는 방법을 소개하였는데요. 그것이 바로 메인라인(Mainline)입니다. 메인라인은 앱 또는 시스템의 일부를 의미합니다. 예를들어, Permission Controller는 퍼미션과 관련된 작업을 처리해주는 앱이며, 메인라인 중 하나입니다.

Full OTA(On The Air)같은 시스템 업데이트는 파일이 크고 시간이 오래 걸리기 때문에 빈번하게 자주 할 수 없습니다. 하지만 메인라인은 Apk 또는 Apex 파일로 제공되기 때문에 파일이 매우 작고 설치 시간이 적게 걸립니다. 업데이트가 쉬워지면, 보안 문제 등에 대해서 빠르게 대처할 수 있습니다.

메인라인들은 시스템(SystemServer)과 매우 밀접하게 연결되어있습니다. 메인라인은 앱과 같지만, 많은 권한을 갖고 있고 시스템과 상호작용을 통해서 프레임워크처럼 동작을 하게 됩니다. 다시말해서, 주요 Core에 대한 기능들은 시스템에 구현이 되어있고, 그 기능을 사용하는 구현(비지니스 로직) 내용들은 메인라인에 분리하였습니다. 그래서 빠른 업데이트를 통해 비지니스 로직을 쉽게 변경할 수 있습니다.

다음은 구글이 안드로이드 Q에서 소개하는 메인라인들입니다. 보안, 사생활, 일관성으로 분야를 나눠서 소개하고 있습니다.

  • Security: Media Codecs, Media Framework Components, DNS Resolver, Conscrypt
  • Privacy: Documents UI, Permission Controller, ExtServices
  • Consistency: Timezone data, ANGLE (developers opt-in), Module Metadata, Networking components, Captive Portal Login, Network Permission Configuration

위에서 메인라인은 Apk 또는 Apex파일로 제공된다고 하였습니다. Apk는 앱의 설치파일이고, Apex는 이번에 새로 소개되는 설치 방식입니다. Apex는 주로 프레임워크를 업데이트하는데 사용될 수 있습니다.

APEX

APEX는 Q에서 소개되는 안드로이드의 새로운 설치 방식입니다. 설치파일의 확장자는 .apex입니다. 메인라인 앱을 제공할 때, Apk방식으로는 업데이트에 한계가 있어서 APEX를 도입하였습니다.

APEX 파일의 구조는 다음과 같습니다. Apk와 유사하게 AndroidManifest.xml이 있습니다. 그리고 주요 설치 파일은 apex_payload.img이미지에 있습니다. 그림에서 보시는 것처럼 APEX 파일은 so, jar 파일들을 갖고 있고 업데이트를 통해 단말에 제공됩니다. 그래서 시스템(프레임워크)에서 사용하는 so, jar 파일들을 업데이트하는데 사용될 수 있습니다. Apex

설치 방법

Apex는 PlayStore를 통해 업데이트하거나, adb를 통해 업데이트할 수 있습니다. 최신 adb 버전을 설치하면 다음과 같이 .apex파일을 adb install 명령으로 설치할 수 있습니다.

$ adb install 파일이름.apex

설치가 되면 디바이스의 쉘에서 /apex/경로에 패키지가 설치가 됩니다.

$ ls -al /apex
drwxr-xr-x  4 root root 4096 2019-04-26 06:58 com.android.conscrypt
drwxr-xr-x  4 root root 4096 2019-04-26 06:59 com.android.media
drwxr-xr-x  5 root root 4096 2019-04-26 06:52 com.android.media.swcodec
drwxr-xr-x  3 root root 4096 2019-04-26 06:50 com.android.resolv
drwxr-xr-x  6 root root 4096 2019-04-26 06:59 com.android.runtime
drwxr-xr-x  3 root root 4096 2019-04-26 06:50 com.android.tzdata

특정 패키지에 들어가보면 jar또는 lib등의 파일들이 있습니다.

/apex/com.android.media $ ls -al
-rw-r--r--  1 root root   58 2019-04-26 06:50 apex_manifest.json
-rw-r--r--  1 root root 1032 2019-04-26 06:50 apex_pubkey
drwxr-xr-x  2 root root 4096 2019-04-26 06:59 javalib
drwxr-xr-x  3 root root 4096 2019-04-26 06:51 lib
/apex/com.android.media $ ls javalib/                                                                                                                                                         
updatable-media.jar

설치가 완료되면, 시스템은 이 파일을 사용합니다. 다시말해서, APEX는 시스템의 중요 파일을 업데이트할 수 있으며, 파일이 작고 설치가 빠르기 때문에 일부분만 변경하고 싶을 때 OTA보다 효율적입니다.

시스템에서 APEX를 사용하는 방법

/system/lib은 프레임워크에서 사용하거나 제공하는 네이티브 라이브러리가 있는 폴더입니다. 여기 파일들을 보면 심볼릭 링크로 Apex의 파일을 참조하고 있습니다.

/system/lib $ ls -al
lrw-r--r--  1 root root       44 2019-04-26 07:01 libc.so -> /apex/com.android.runtime/lib/bionic/libc.so
lrw-r--r--  1 root root       44 2019-04-26 07:01 libm.so -> /apex/com.android.runtime/lib/bionic/libm.so
....

또 시스템에서 사용하는 $PATH를 보면 /apex/com.android.runtime/bin처럼 APEX의 파일을 참조하는 부분도 보입니다.

$ echo $PATH
/sbin:/system/sbin:/product/bin:/apex/com.android.runtime/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin

이처럼 APEX가 업데이트될 때 path만 변경되지 않는다면 시스템은 변경된 파일들을 사용할 수 있습니다.

정리

지금까지 시스템의 일부를 변경할 때 OTA로 업데이트를 했습니다. 하지만 이 방법은 매우 무겁고 시간이 오래걸립니다. 메인라인은 이런 것을 쉽고 빠르게 할 수 있게 도와줍니다. 메인라인은 앱일 수도 있고 시스템의 일부일 수도 있습니다. 앱은 Apk방식으로 업데이트할 수 있지만 시스템의 일부를 업데이트할 때는 Apk방식이 적합하지 않다고 생각하여 Apex를 도입하였습니다. Apex는 lib, jar 파일을 업데이트할 수 있습니다.

참고