다음 구성 설정을 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=y
및CONFIG_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_COMPAT
및 CONFIG_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>