以下の設定を Android カーネル設定のベースとして使用します。設定は android-base
、android-base-ARCH
、android-recommended
の .cfg
ファイルにまとめられています。
android-base
: このオプションは、Android のコア機能を有効にするもので、すべてのデバイスで指定する必要があります。android-base-ARCH
: このオプションは、Android のコア機能を有効にするもので、アーキテクチャ ARCH のすべてのデバイスで指定する必要があります。すべてのアーキテクチャに、対応するアーキテクチャ固有の必須オプションのファイルがあるわけではありません。ファイルのないアーキテクチャでは、Android 用のアーキテクチャ固有のカーネル設定は不要です。android-recommended
: このオプションは、Android の高度な機能を有効にします。デバイスでの指定は任意です。
これらの設定ファイルは、kernel/configs
リポジトリにあります。使用しているカーネルのバージョンに対応する設定ファイルのセットを使用してください。
カーネルの堅牢化のためにすでに行われている制御の詳細については、システムとカーネルのセキュリティをご覧ください。必要な設定の詳細については、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
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
、またはCONFIG_MEMCG=y
とCONFIG_MEMCG_SWAP=y
の両方が設定されている 4.4 カーネルまたは 4.9 カーネル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
Secure Computing Berkeley Packet Filter(Seccomp BPF)は、プロセスによるシステムコールを許すようなコンテキストを定義するサンドボックスが作成できるカーネル セキュリティ技術です。スレッド同期(TSYNC)機能を利用すると、マルチスレッド プログラムから Seccomp BPF を使用できます。この機能は、アップストリームで Seccomp がサポートされているアーキテクチャに限定されています(ARM、ARM64、x86、x86_64)。
Android ライブロック デーモン
Android 10 には、カーネルのデッドロックを検出して軽減するように設計された Android ライブロック デーモン(llkd
)が含まれています。llkd
の使用方法について詳しくは、Android Live-Lock Daemon をご覧ください。
ARM64 上の vDSO32
仮想動的共有オブジェクト(vDSO)はシステムコールの代わりに使用され、正しく設定するとサイクルコストを削減できます。Android 10 では、64 ビットカーネルで vDSO32 がサポートされています。64 ビットカーネルでの vDSO64 と 32 ビットカーネルでの vDSO32 はすでにサポートされています。ARM64 アーキテクチャで vDSO32(CONFIG_VDSO_COMPAT
)を使用すると、電池寿命が 0.4% 延び、その他のパフォーマンスも向上します。
Linux コミュニティは、アーキテクチャ間で vDSO を統合する作業に積極的に取り組んでいます。Linux カーネルで vDSO をセットアップするには、arm32 コンパイラのトリプレットで CONFIG_COMPAT
と CONFIG_CROSS_COMPILE_COMPAT_VDSO
を設定して、vDSO32 を有効にします。Android カーネルのチームが vDSO のパッチシリーズの旧バージョンを Google Pixel デバイスにバックポートしているので、Pixel カーネルのビルド内のサンプル(LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
パス、CROSS_COMPILE_ARM32
参照、CONFIG_CROSS_COMPILE_ARM32
設定)を参考にしてください。
低 RAM 設定
カーネルと ActivityManager を調整して直接回収を削減する
直接回収は、プロセスまたはカーネルがメモリのページを(直接的に、または新しいページで障害が発生したために)割り当てようと試み、カーネルが使用可能な空きメモリを使い尽くしたときに発生します。このため、カーネルはページを解放すると同時に割り当てをブロックする必要があります。それにより、ファイルにバックアップされるダーティなページを一掃するために、または lowmemorykiller
がプロセスを停止するまで待つために、ディスク I/O が必要になることがよくあります。その結果、UI スレッドを含むすべてのスレッドで、余分な I/O が発生する可能性があります。
直接回収を回避するため、カーネルには kswapd
つまりバックグラウンド回収をトリガーするウォーターマークがあります。これはページを解放しようとするスレッドであり、次回実際のスレッドが割り当てられるとすぐに成功します。
バックグラウンド回収をトリガーするデフォルトのしきい値はかなり低く、2 GB のデバイスでは約 2 MB、512 MB のデバイスでは 636 KB です。バックグラウンド回収では、カーネルは数メガバイトのメモリしか回収しません。つまり、数メガバイトを超えるメモリを迅速に割り当てるプロセスは、すぐに直接回収の対象になります。
カーネル調整パラメータのサポートは、パッチ 92189d47f66c67e5fd92eafaa287e153197a454f として Android-3.4 カーネル ブランチに追加されています(「extra_free_kbytes 調整パラメータの追加」)。このパッチをデバイスのカーネルにチェリーピックすると、ActivityManager
はカーネルに 3 つのフルスクリーン 32 bpp のメモリバッファを空けておくように指示できます。
これらのしきい値は、config.xml
フレームワークで設定できます。
<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). A high value increases 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 increases 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 causes 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 keeps 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 causes 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 keeps 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>