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는 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 파일을 업데이트할 수 있습니다.
참고
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력