Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

동적 시스템 업데이트

동적 시스템 업데이트(DSU)를 사용하면 사용자가 현재 시스템 이미지에 대한 손상 위험 없이 인터넷에서 다운로드하여 사용해볼 수 있는 Android 시스템 이미지를 생성할 수 있습니다. 이 문서에서는 DSU를 지원하는 방법에 대해 설명합니다.

커널 요구사항

커널 요구사항은 동적 파티션 구현을 참조하세요.

또한 DSU는 Android 시스템 이미지 확인을 위해 device-mapper-verity(dm-verity) 커널 기능에 의존합니다. 따라서 다음과 같은 커널 config을 사용 설정해야 합니다.

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

파티션 요구사항

설치된 이미지와 관련된 데이터를 저장하기 위해서는 metadata 파티션(16MB 이상)이 필요합니다. 이는 1단계 마운트 도중에 마운트되어야 합니다.

userdata 파티션은 f2fs 또는 ext4 파일 시스템을 사용해야 합니다. f2fs를 사용할 때는 Android 일반 커널에서 제공하는 모든 f2fs 관련 패치를 포함하세요.

DSU는 커널/일반 4.9로 개발 및 테스트됩니다. 이 기능에는 커널 4.9 이상을 사용하는 것이 좋습니다.

공급업체 HAL 동작

위버 HAL

위버 HAL은 사용자 키 보관을 위한 고정된 수의 슬롯을 제공합니다. DSU는 2개의 추가 키 슬롯을 소비합니다. 위버 HAL을 보유한 OEM은 일반 시스템 이미지(GSI)와 호스트 이미지를 위한 충분한 공간을 보유해야 합니다.

게이트키퍼 HAL

게이트키퍼 HAL은 큰 USER_ID 값을 지원해야 합니다. 이는 GSI가 HAL에 대한 UID를 +1000000 만큼 상쇄하기 때문입니다.

부팅 확인

GSI 키는 램디스크(Q-GSI, R-GSI 및 S-GSI)에 포함해야 합니다. 따라서 기기는 DSU를 사용하거나 fstab 설정을 수정하여 GSI 이미지를 이러한 키로 인증할 수 있습니다.

GSI 키를 포함하려면 다음 행을 파일 device/<device_name>/device.mk에 추가합니다.

$(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_keys.mk)
    

롤백 보호

DSU를 사용할 때는 다운로드한 Android 시스템 이미지가 기기의 현재 시스템 이미지보다 최신이어야 합니다. 이를 위해서는 두 시스템 이미지의 Android 자체 검사 부팅(AVB) AVB 속성 설명자에서 보안 패치 수준을 비교해야 합니다(Prop: com.android.build.system.security_patch -> '2019-04-05').

AVB를 사용하지 않는 기기의 경우 현재 시스템 이미지의 보안 패치 수준을 부트로더 커널 cmdline인 androidboot.system.security_patch=2019-04-05에 삽입합니다.

하드웨어 요구사항

DSU 인스턴스를 실행하면 2개의 임시 파일이 할당됩니다.

  • GSI.img(1~1.5G) 저장을 위한 논리 파티션
  • GSI 실행을 위한 샌드박스로서의 8GB의 빈 /data 파티션

DSU 인스턴스를 실행하기 전에 최소 10GB의 여유 공간을 남겨 두는 것이 좋습니다. DSU는 SD 카드에서의 할당도 지원합니다. SD 카드가 있으면 할당과 관련된 가장 높은 우선순위를 지닙니다. SD 카드 지원은 내부 저장소가 부족할 수 있는 저전력 기기에 매우 중요합니다. SD 카드가 있는 경우 채택되지 않았는지 확인해야 합니다. DSU는 채택된 SD 카드를 지원하지 않습니다.

사용 가능한 프런트엔드

adb 또는 앱을 사용하여 DSU를 실행할 수 있습니다.

adb를 사용하여 DSU를 실행

adb를 사용하여 DSU를 실행하려면 다음 명령어를 입력합니다.

$>simg2img out/target/product/.../system.img system.raw
    $>gzip -c system.raw > system.raw.gz
    $>adb push system.raw.gz /storage/emulated/0/Download
    $>adb shell am start-activity \
    -n com.android.dynsystem/com.android.dynsystem.VerificationActivity  \
    -a android.os.image.action.START_INSTALL    \
    -d file:///storage/emulated/0/Download/system.raw.gz  \
    --el KEY_SYSTEM_SIZE $(du -b system.raw|cut -f1)  \
    --el KEY_USERDATA_SIZE 8589934592
    

앱을 사용하여 DSU를 실행

DSU에 대한 기본 진입점은 android.os.image.DynamicSystemClient.java API입니다.

public class DynamicSystemClient {

    ...
    ...

         /**
         * Start installing DynamicSystem from URL with default userdata size.
         *
         * @param systemUrl A network URL or a file URL to system image.
         * @param systemSize size of system image.
         */
        public void start(String systemUrl, long systemSize) {
            start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
        }
    

이 앱은 기기에 번들화/사전 설치해야 합니다. DynamicSystemClient는 시스템 API이므로 일반 SDK API로 앱을 빌드할 수 없으며 이를 Play 스토어에 게시할 수도 없습니다. 이 앱의 목적은 다음과 같습니다.

  1. 공급업체에서 정의한 구성표로 이미지 목록과 해당하는 URL을 가져와야 합니다.
  2. 목록의 이미지를 기기에 대해 매칭하고 사용자가 선택할 수 있는 호환되는 이미지를 표시해야 합니다.
  3. 아래와 같이 DynamicSystemClient.start를 호출해야 합니다.

    DynamicSystemClient aot = new DynamicSystemClient(...)
           aot.start(
                ...URL of the selected image...,
                ...uncompressed size of the selected image...);
    
        

URL은 다음 명령어로 생성 가능한 gzipped, 비희소성, 시스템 이미지 파일을 가리킵니다.

$> simg2img ${OUT}/system.img ${OUT}/system.raw
    $> gzip ${OUT}/system.raw
    $> ls ${OUT}/system.raw.gz
    

파일 이름은 다음 형식을 따라야 합니다.

<android version>.<lunch name>.<user defined title>.raw.gz
    

예:

  • o.aosp_taimen-userdebug.2018dev.raw.gz
  • p.aosp_taimen-userdebug.2018dev.raw.gz

기능 플래그

DSU 기능은 settings_dynamic_android 기능 플래그 밑에 위치합니다. DSU를 사용하기 전에 해당하는 기능 플래그가 사용 설정되어 있는지 확인하세요.

기능 플래그 사용 설정

그림 1. 기능 플래그 사용 설정

기능 플래그 UI는 사용자 빌드를 실행 중인 기기에 없을 수도 있습니다. 이러한 경우에는 adb 명령어를 대신 사용하세요.

adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1
    

GCE의 공급업체 호스트 시스템 이미지(선택사항)

시스템 이미지의 잠재적인 보관 위치 중 하나는 Google Compute Engine(GCE) 버킷입니다. 릴리스 관리자는 GCP 저장소 콘솔을 사용하여 릴리스 시스템 이미지를 추가/삭제/변경합니다.

이미지는 아래에 보이는 것처럼 공개 액세스여야 합니다.

GCE의 공개 액세스

그림 2. GCE의 공개 액세스

항목을 공개로 전환하는 절차는 여기서 확인할 수 있습니다.