커널 구성

다음 구성 설정을 Android 커널 구성의 기본으로 사용합니다. 설정은 android-base, android-base-ARCH, android-recommended 관련 .cfg 파일로 분류됩니다.

  • android-base 옵션은 핵심 Android 기능을 사용 설정하고 모든 기기에서 지정한 대로 구성해야 합니다.
  • android-base-ARCH 옵션은 핵심 Android 기능을 사용 설정하며 ARCH 아키텍처의 모든 기기에서 지정한 대로 구성되어야 합니다. 모든 아키텍처에 아키텍처별 필수 옵션과 관련된 파일이 있는 것은 아닙니다. 아키텍처에 파일이 없으면 Android의 추가 아키텍처 관련 커널 구성 요구사항도 없습니다.
  • android-recommended. 이 옵션은 고급 Android 기능을 사용 설정하며 기기에 선택사항으로 적용할 수 있습니다.

이러한 구성 파일은 kernel/configs 저장소에 있습니다. 사용 중인 커널 버전과 일치하는 구성 파일 세트를 사용하세요.

기기에서 커널을 강화하기 위해 이미 실행된 제어에 관한 자세한 내용은 시스템 및 커널 보안을 참조하세요. 필수 설정에 관한 자세한 내용은 Android 호환성 정의 문서(Android CDD)를 참고하세요.

커널 구성 생성

최소화된 defconfig 형식을 사용하는 기기의 경우 커널 트리에서 merge_config.sh 스크립트를 사용하여 옵션을 사용 설정합니다.

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

이렇게 하면 새 defconfig 파일을 저장하거나 사용 설정된 Android 기능으로 새 커널을 컴파일하는 데 사용할 수 있는 .config 파일이 생성됩니다.

추가 커널 구성 요구사항

경우에 따라 Android 종속 항목을 충족하기 위해 플랫폼 운영자가 여러 커널 기능 중에서 선택할 수 있습니다. 위에서 설명한 커널 구성 프래그먼트 파일의 형식은 논리 표현식을 지원하지 않기 때문에 이러한 파일에서는 이와 같은 종속 항목을 표현할 수 없습니다. Android 9 이상에서 호환성 테스트 모음(CTS)공급업체 테스트 모음(VTS)은 다음 요구사항이 충족되는지 확인합니다.

  • CONFIG_OF=y 또는 CONFIG_ACPI=y
  • 4.4 및 4.9 커널에 CONFIG_ANDROID_LOW_MEMORY_KILLER=y가 있거나 CONFIG_MEMCG=yCONFIG_MEMCG_SWAP=y가 둘 다 있음
  • CONFIG_DEBUG_RODATA=y 또는 CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y 또는 CONFIG_STRICT_MODULE_RWX=y
  • ARM64 전용: CONFIG_ARM64_SW_TTBR0_PAN=y 또는 CONFIG_ARM64_PAN=y

또한 Android 9 이상에서 4.9 커널에는 CONFIG_INET_UDP_DIAG 옵션을 y로 설정해야 합니다.

USB 호스트 모드 옵션 사용 설정

USB 호스트 모드 오디오의 경우 다음 옵션을 사용 설정합니다.

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

USB 호스트 모드 MIDI의 경우 다음 옵션을 사용 설정합니다.

CONFIG_SND_USB_MIDI=y

TSYNC와 Seccomp BPF

Seccomp BPF(Secure Computing Berkeley Packet Filter)는 프로세스가 시스템 호출을 실행할 수 있는 컨텍스트를 정의하는 샌드박스를 생성하도록 하는 커널 보안 기술입니다. 스레드 동기화(TSYNC) 기능은 다중 스레드 프로그램에서 Seccomp BPF를 사용 설정합니다. 이 기능은 Seccomp 지원 업스트림이 있는 아키텍처(ARM, ARM64, x86 및 x86_64)로 제한됩니다.

Android Live-Lock 데몬

Android 10에는 커널 교착 상태를 포착하고 완화하도록 설계된 Android Live-Lock 데몬(llkd)이 포함되어 있습니다. llkd 사용에 관한 자세한 내용은 Android Live-Lock 데몬을 참고하세요.

ARM64의 vDSO32

vDSO(Virtual Dynamic Shared Object)는 시스템 호출을 대체하고, 올바르게 구성해 사용하면 주기 비용을 줄일 수 있습니다. Android 10은 64비트 커널에서 vDSO32 지원을 추가합니다. Android에서는 64비트 커널에서 vDSO64를, 32비트 커널에서 vDSO32를 이미 지원하고 있습니다. ARM64 아키텍처에서 vDSO32(CONFIG_VDSO_COMPAT)를 사용하면 배터리 수명이 0.4% 증가하고 다른 성능이 향상됩니다.

Linux 커뮤니티는 아키텍처 간에 vDSO를 통합하기 위해 노력하고 있습니다. arm32 컴파일러 triplet과 함께 CONFIG_COMPATCONFIG_CROSS_COMPILE_COMPAT_VDSO를 사용하여 vDSO32를 사용 설정하여 Linux 커널에서 vDSO를 설정할 수 있습니다. Android 커널팀은 vDSO 패치 시리즈의 이전 버전을 Pixel 기기로 백포팅했으므로 Pixel 커널 빌드에서 LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN 경로, CROSS_COMPILE_ARM32 참조, CONFIG_CROSS_COMPILE_ARM32 구성 등의 예를 찾을 수 있습니다.

RAM 부족 구성

직접 회수를 줄이기 위해 커널/ActivityManager 미세 조정

직접 회수는 프로세스 또는 커널이 메모리 페이지를 (직접 또는 새 페이지의 결함으로 인해) 할당하려고 하며 커널이 사용 가능한 모든 여유 메모리를 사용했을 때 발생합니다. 이렇게 하려면 커널이 페이지를 확보하는 동안 할당을 차단해야 합니다. 따라서 일반적으로 디스크 I/O가 더티 파일 지원 페이지를 플러시하거나 lowmemorykiller가 프로세스를 중지할 때까지 기다려야 합니다. 이로 인해 UI 스레드를 포함하여 모든 스레드에서 추가 I/O가 발생할 수 있습니다.

직접 회수를 피하기 위해 커널에는 kswapd 또는 백그라운드 회수를 트리거하는 워터마크가 있습니다. 이는 페이지 확보를 시도하는 스레드입니다. 따라서 다음에 실제 스레드를 할당할 때 빠르게 할당에 성공할 수 있습니다.

백그라운드 회수를 트리거하는 기본 기준점은 2GB 기기의 경우 약 2MB, 512MB 기기의 경우 636KB 정도로 매우 낮습니다. 커널은 백그라운드 회수 시 불과 몇 MB의 메모리만 회수합니다. 즉, 몇 MB 이상을 빠르게 할당하는 프로세스는 빠르게 직접 회수됩니다.

미세 조정 가능한 커널에 대한 지원은 Android-3.4 커널 브랜치에 92189d47f66c67e5fd92eafaa287e153197a454f 패치로 추가되었습니다('미세 조정 가능한 여유 KB 추가'). 기기의 커널에 대해 이 패치를 선별하면 ActivityManager가 메모리의 전체 화면 32bpp 버퍼 3개를 여유 버퍼로 유지하게 시도하도록 해당 커널에 명령할 수 있습니다.

이러한 기준점은 config.xml 프레임워크를 사용하여 구성할 수 있습니다.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

LowMemoryKiller 미세 조정

ActivityManager는 각 우선순위 수준 버킷에서 프로세스를 실행하는 데 필요한 파일 지원 페이지(캐시된 페이지)의 작업 세트에 관한 기대치를 충족하도록 LowMemoryKiller의 기준점을 구성합니다. 작업 세트 요구량이 큰 기기의 경우(예: 공급업체 UI에 더 많은 메모리가 필요하거나 더 많은 서비스가 추가된 경우) 기준점을 늘릴 수 있습니다.

파일 지원 페이지에 너무 많은 메모리가 예약되어 있으면 기준점이 줄어들 수 있습니다. 따라서 캐시가 너무 작아져 디스크 스래싱이 발생하기 훨씬 전에 백그라운드 프로세스가 종료됩니다.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value will keep more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value will
keep more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>