증분 파일 시스템

Android 11에 도입된 증분 파일 시스템(IncFS) 커널 모듈을 사용하면 Android OS가 Android 디버그 브리지(ADB)를 통해 스트리밍된 APK를 수신할 수 있습니다.

이 독립된 커널 모듈은 기존 Android 파일 시스템을 기반으로 하는 새로운 가상 파일 시스템을 생성합니다. 이는 프레임워크와 SDK의 변경사항을 보완하여 앱과 게임 개발자가 ADB를 통해 Android 11 이상을 실행하는 기기에 대규모 APK를 배포할 수 있도록 합니다.

이러한 커널 변경으로 새 APK 서명 체계 v4 형식을 사용할 수 있고 Android 패키지 관리자의 Android 프레임워크 변경사항, 새 시스템 서비스, ADB 변경사항이 지원됩니다.

구현

IncFS를 구현하려면 OEM 및 SoC 제조업체에서 Android 기기 빌드에 새 커널 드라이버를 추가해야 합니다.

커널 드라이버가 모듈로 빌드된 경우 주문형으로 로드됩니다(Android 11에만 해당). ADB 증분 설치를 통해 설치된 앱이 없으면 기기는 커널 드라이버를 로드하지 않습니다.

ADB 증분 설치를 통해 설치된 앱이 있으면 커널 드라이버가 커널 이미지의 일부로 빌드될 때 드라이버가 항상 로드됩니다. 이 구현은 Android 12 이상에서 유효하며 Android 11에서 사용할 수 있습니다. 커널 드라이버를 Android 12로 업그레이드하는 방법에 관한 자세한 내용은 커널 드라이버 업그레이드를 참고하세요.

커널 드라이버는 스트리밍된 APK 설치를 사용할 수 있도록 해주는 대규모 시스템의 일부입니다. OEM 및 공급업체는 샘플 구현에서 제공하는 IncFS 코드와 똑같은 코드를 사용하지 않아도 됩니다. 하지만 여러 기기에서 일관된 환경을 보장하려면 API 구현이 증분 FS용 사용자 공간 인터페이스 문서에 정의된 파일 읽기 기능과 디렉터리 읽기-쓰기 기능이 있는 파일 시스템을 포함해야 합니다.

또한 구현에는 기능적 측면에서 IncFS 샘플 구현과 일치하는 마운트 옵션특수 파일이 있어야 합니다.

다음 목록은 구현에 필요한 변경사항입니다.

  1. 개발 머신을 설정하여 커널을 빌드합니다.
  2. common-android-mainline 브랜치에서 공통 커널을 타겟팅합니다.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. IncFS에 필요한 다음 변경사항이 브랜치 체크아웃에 있는지 확인합니다.
  4. CONFIG_INCREMENTAL_FS=y 또는 CONFIG_INCREMENTAL_FS=m(Android 11에만 해당)을 defconfig 파일 하단에 추가합니다. 예를 보려면 아래 링크 중 하나를 클릭하세요.
  5. 커널 빌드
  6. Android 기기 이미지 빌드에 커널 삽입
  7. 대상 Android 기기의 경우 device.mk 파일에 다음 공급업체별 시스템 속성 라인 중 하나를 추가합니다(Android 12 이상이 설치된 상태로 출시된 기기에서는 선택사항).
  8. CONFIG_INCREMENTAL_FS=y를 사용하는 경우 다음 중 하나와 함께 파일을 추가합니다.

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    CONFIG_INCREMENTAL_FS=m(Android 11만 해당)을 사용 중인 경우 다음 중 하나와 함께 파일을 추가합니다.

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Android Emulator 및 Pixel 4device.mk 파일 예를 참고하세요.
  10. Android 11에만 해당: CONFIG_INCREMENTAL_FS=m을 사용하는 경우 SE Linux 규칙을 추가합니다.
  11. 다음 콘텐츠로 vold.te 파일을 만들고 기기의 /system/sepolicy/vendor 폴더에 추가합니다.

    • vold.te

    증분 파일 시스템 드라이버를 로드하도록 허용합니다.

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    /system/sepolicy/vendor 폴더에 있는 기존 file.te 파일에 다음 SE Linux 규칙을 추가합니다.

    • file.te 파일(예는 file.te 파일 참고)
    • 증분 파일 시스템 드라이버
    • type vendor_incremental_module, vendor_file_type, file_type;

    /system/sepolicy/vendor 폴더에 있는 기존 file_contents 파일에 다음 SE Linux 규칙을 추가합니다.

    • file_contents 파일(예는 file_contents 파일 참고)
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

커널 드라이버 업그레이드

Android 12로 업그레이드하는 기기에는 이전 버전의 IncFS 드라이버가 포함될 수 있습니다. 이러한 기기의 경우 IncFS 드라이버를 현재 버전(이 경우 v2)으로 업데이트하는 것이 좋습니다(AOSP 권장사항). 그 이유는 다음과 같습니다.

  • Android 11을 사용하여 출시된 버전은 ADB 설치 지원만 대상으로 하는 IncFS의 초기 구현입니다.
  • Android 12는 IncFS 드라이버를 사용하여 Play 게임즈의 스트리밍 설치를 지원하므로 더 나은 사용자 환경을 위해 IncFS v2의 새로운 기능과 최적화가 필요합니다.
  • v1은 게임 스트리밍을 지원하지만 성능 저하가 있고 v2보다 배터리, CPU 및 RAM 사용량이 많습니다.
  • v2는 원활한 진행 애니메이션, 정확한 디스크 공간 사용량 보고, 서드 파티 앱 스트리밍 간섭 방지를 통해 스트리밍에 맞게 향상된 UX를 제공합니다.

커널에서 IncFS 드라이버를 업그레이드하려면 커널 4.14 또는 커널 4.19에 다음 패치를 적용합니다.

다른 모든 맞춤 커널 버전의 경우 패치 세트 중 하나를 포팅하세요. 패치 세트는 fs/incfs 디렉터리에만 영향을 미치며 기존 v1 코드에 원활하게 적용됩니다.

이제 원본과 동일한 방식으로 IncFS 드라이버를 계속 사용하지만, 커널 이미지의 내장 부분 또는 별도의 모듈로 Android 11을 업그레이드했습니다. 시스템 보드 또는 시스템 속성 구성을 변경하지 마세요.

GKI 커널 이미지를 사용하는 새 기기는 커널 이미지의 일부로 구성된 최신(v2) IncFS 드라이버를 자동으로 가져옵니다. 이때 추가로 실행할 단계는 없습니다.

로더블 모듈 구성은 Android 12에서 지원 중단되었으며 새로운 기기에서는 지원되지 않습니다. 원래 커널에서 이미 모듈로 빌드된 경우 업그레이드 또는 공급업체 이미지 고정에만 허용됩니다.

참조 구현

이 구현은 커널 이미지 또는 로더블 모듈(Android 11에만 해당) 중 하나로 간주할 수 있습니다.

로더블 모듈(Pixel 4 기기)Android Emulator(커널 이미지의 일부)

유효성 검사 및 테스트

기능 단위 테스트, CTS 및 GTS를 사용하여 구현을 검증합니다.

CTS

CtsIncrementalInstallHostTestCases를 사용합니다.

GTS

atest GtsIncrementalInstallTestCases:

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

IncFS 테스트

  1. 개발 환경을 설정합니다.
  2. 구현 섹션에 요약된 구현 작업을 완료합니다.
  3. 다음 수동 테스트를 실행합니다.
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Android SDK(ADB 및 apksigner)로 IncFS를 테스트하는 방법

  • 개발 환경을 설정합니다.
  • 구현 섹션에 요약된 구현 작업을 완료합니다.
  • 대상 실제 기기나 에뮬레이터에 빌드를 플래시합니다.
  • 기존 APK를 생성하거나 가져옵니다.
  • 디버그 서명 키를 만듭니다.
  • build-tools 폴더에서 v4 서명 형식을 사용하여 APK에 서명합니다.
    ./apksigner sign --ks debug.keystore game.apk
  • platform-tools 폴더에서 기기에 APK를 설치합니다.
    ./adb install game.apk
설치 예
그림 1: 설치 예

테스트 파일 위치