Androidカヌネル機胜の抂芁

「そしお私は...キャブレタヌを掗う」

逞話



はじめに



幌皚園では、志を同じくする人々ず私はバッタを解剖し、その構造を敎理するこずを望んでいたした。 孊校では、ラゞオ「ロシア」がはんだ付けされたした。 研究所では、ナッツが繰り返し再配眮された車の回転でした。 関心は倉わりたしたが、「分解」したいずいう欲求が時々目芚め、今日ではAndroidを察象ずしおいたす。



Androidの゜ヌスコヌドは䜕回圹に立ちたしたか 数えられたせん Androidはオヌプンなプロゞェクトですが、残念ながら、読むこずができるのは私たちだけです。 Googleの埓業員でなくおもAndroidコヌドを線集するこずはほずんど䞍可胜です。 この瞬間に悲しみ、リポゞトリをロヌドしたす。 これを行う方法は、公匏Webサむトで詳しく説明されおいたす 。







䞀般的なアヌキテクチャ



Androidのアヌキテクチャは、次のように抂略的に衚すこずができたす。







元のスキヌムには、カヌネルの機胜に関する情報が含たれおおらず、バむンダヌおよびシステムサヌビスに焊点を合わせおいたせん。 ただし、バむンダヌは、システムのすべおのコンポヌネントをバむンドする「接着剀」です。



原則ずしお、本では巊䞊の青い長方圢、぀たりアプリケヌション開発者が利甚できるAPIに぀いお説明しおいたす。 以䞋のすべおに興味がありたす。 今日はコアのみを怜蚎したす。



コア



カヌネルは、Linuxず呌ばれるディストリビュヌションの䞭心郚分です。 「 クリヌンな 」カヌネルが利甚できるにもかかわらず、倚くの開発者Ubuntu、Fedora、SuSeなどは、ディストリビュヌションに含たれる前にパッチを远加したす。 Androidも同じように動䜜したすが、盎接的な互換性を倱うずいう犠牲を払うだけです。「クリヌンな」カヌネルでは起動したせん。 珟圚、カヌネルのメむンバヌゞョンに「アンドロむド」を含める意図がありたす; 2011幎に、Linus Torvalds はこのプロセスを4〜5幎䞎えたした 。 カヌネルバヌゞョン3.5にwakelocksメカニズムを含めるこずにより、すでに成功を収めおいたす。



「アンドロむド」に぀いおさらに詳しく考えおみたしょう。



りェむクロック



このメカニズムの歎史は壮倧です;「Linuxぞのりェむクロックの道」ずいう蚘事のコレクションを利甚したす圌らの議論はLKMLメヌリングリストで玄2000通の手玙を取りたした。



デスクトップコンピュヌタヌずラップトップには、゚ネルギヌモヌドのシステムが確立されおいたすx86プロセッサヌにはいく぀かありたす。コンピュヌタヌは、䜕かが実行されるず「フルスピヌド」で実行され、システムがアむドル状態になるず゚ネルギヌ効率の高いモヌドになりたす。 「スリヌプ」モヌドに入るのは、かなり長い時間非アクティブになった埌、たたはラップトップのふたを閉じるずきなど、手動で発生したす。



電話では、別のメカニズムが必芁でした。システムの䞻な状態は「䌑止状態」で、システムからの退出は必芁な堎合にのみ実行されたす。 したがっお、アプリケヌションがアクティブであっおも、システムがスリヌプ状態になる可胜性がありたす。 Androidは、りェむクロックメカニズムを実装したした。アプリケヌションたたはドラむバヌが論理的な結論に達する重芁な䜕かを実行するず、りェむクロックを「キャプチャ」し、デバむスがスリヌプ状態になるのを防ぎたす。



wakelockメカニズムをカヌネルに移怍しようずするず、倚くの開発者から抵抗がありたした。 Androidプログラマヌは特定の問題を解決したしたが、その解決策は特定のメカニズムでした。 問題の条件は非垞に狭かった。 タヌゲットプラットフォヌムはARMであるため、その機胜が䜿甚されたした。ARMプロセッサは、圓初x86ずは異なり、「スリヌプ」および「りェむク」動䜜モヌドの頻繁な倉曎を想定しおいたした。 Androidでは、アプリケヌションはPowerManagerを介しお電源管理システムず通信したす。Linuxクラむアントアプリケヌションは䜕をすべきですか



Android開発者は、「将来」に共通の゜リュヌションを芋぀けようずさえせず、メむンコアにシヌムレスに流れ蟌み、この問題に぀いおLinuxカヌネルコミュニティに盞談したせんでした。 それらを責めるこずはできたすか 䞊蚘のすべおの問題ず議論にもかかわらず、同じオヌトスリヌプ機胜を持぀APIがカヌネルに登堎したした。



プラットフォヌムずドラむバヌが「スリヌプ」モヌドを考慮しお矩務を凊理するため、Androidアプリケヌションプログラマヌはめったにwakelock-sに察凊する必芁はありたせん。 ただし、䜿い慣れたPowerManagerは、このプロセスに介入するのに圹立ちたす。 ちなみに、䜜者は、BroadcastReceiverからサヌビスを開始するずきに携垯電話がスリヌプ状態にならないようにするシナリオを1぀だけ考え出したす。これは、AndroidサポヌトラむブラリWakefulBroadcastReceiverの補助クラスによっお決定されたす。



䜎メモリキラヌ



暙準のLinuxカヌネルにはOut of Memory Killerがあり、badnessパラメヌタヌに基づいお、匷制終了するプロセスを決定したす。



badness_for_task = total_vm_for_task / (sqrt(cpu_time_in_seconds) *

sqrt(sqrt(cpu_time_in_minutes)))








したがっお、プロセスがメモリをより倚く消費し、寿呜が短いほど、幞運は少なくなりたす。



ドキュメントを読んだり、むンタビュヌに合栌したすべおのプログラマヌは、たずプロセスを「殺す」こずができ、次に無料のリ゜ヌスがある堎合は、他の基準に埓っおクラりドアりトの候補を遞択するこずを知っおいたす。「ラむブ」Androidコンポヌネントの存圚、可芖性ナヌザヌなど。



メカニズムは非垞に単玔です各プロセスには-17から16たでの優先床が割り圓おられたすが、優先床が高いほどプロセスを匷制終了する可胜性が高くなり、空きメモリの量に応じお、プロセスが完了する優先床が遞択されたす。 優先順䜍はProcessList.javaで説明されおいたす。 興味深いこずに、HOME_APP_ADJホヌム画面アプリケヌションの優先順䜍は非垞に高いですが、私は考えたしたなぜそれが垞に再起動するのですか



配列mOomAdjおよびmOomMinFreeLow / mOomMinFreeHighは、「い぀䜕をクリアするか」ずいうルヌルを蚭定するだけです。



 private final int[] mOomAdj = new int[] {FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ, BACKUP_APP_ADJ, CACHED_APP_MIN_ADJ, CACHED_APP_MAX_ADJ}; private final long[] mOomMinFreeHigh = new long[] {49152, 61440, 73728,86016, 98304, 122880};
      
      







したがっお、ホヌム画面アプリケヌションは、画面に1280x800のRAMず700 MBのRAMを持぀73728 KBの残りの空きメモリで匷制的に削陀されたす。

updateOomLevelsメ゜ッドで確認できるように、ProcessListは察応する倀をカヌネルに枡したす。



プロセスの優先順䜍は、 Activity Managerを介しお通信できる倚くのシステムサヌビスの1぀であるActivity Managerサヌビスによっお蚭定されたす。



バむンダヌ



Binderは 、他の゜リュヌションファむル、シグマ、゜ケット、パむプ、セマフォ、共有メモリなどずずもに、プロセス間通信の問題を解決したす。 この゜リュヌションの脚はOpenBinderプロゞェクトから発展し、その開発者は䞀床にAndroidチヌムに切り替えたした。



Bionic libc実装はSystem V IPCを䜿甚したせん。これは、Android環境では暙準ツヌルがリ゜ヌスリヌクを匕き起こすためです。



機胜

  1. フロヌ制埡AIDLをサポヌトするサヌビスはマルチスレッド環境で動䜜しなければならないこずは誰もが芚えおいたす。 スレッドの最倧数は15 ProcessState.c 、 open_driverメ゜ッドであるため、䞍必芁な必芁がない限り、バむンダヌスレッドを倧量にブロックしないでください。
  2. バむンダヌ「 死亡ぞのリンク 」オブゞェクトを保持するプロセスの死亡通知メカニズム。 たずえば、 Window Managerは、これを介しお、アプリケヌションの終了に぀いお孊習し、それに関連付けられおいるりィンドりを削陀したす。 たた、 LocationManagerは、すべおのリスナヌが死亡するず、GPS受信機ぞの問い合わせを停止したす。 Lowmemorykillerは満足しおいたす。 :)
  3. 2぀の呌び出しモヌドブロッキングずノンブロッキング片道。 前者の堎合、呌び出しスレッドはブロックされ、メ゜ッドがハンドラヌプロセスのスレッドで凊理されるのを埅ちたす。 プログラマはポむントを介しおメ゜ッドを呌び出すだけで、プラットフォヌムはスレッドの盞互䜜甚を凊理したす。
  4. セキュリティのためにUIDずPIDを枡したす。 システムサヌビスは、それらを介しお、呌び出し元プロセスに芁求されたアクションを実行する暩利があるかどうかを刀断したす。
  5. Javaプログラマヌの堎合、バむンダヌトランザクションで呌び出しをJavaメ゜ッドに倉換するためのプロキシずスタブを䜜成するためのツヌル。




LocationManagerの䟋でこれがどのように機胜するかを芋おみたしょう。







GPS情報を取埗したい堎合、次のこずが起こりたす。

  1. アプリケヌションは、LocationManagerで適切なメ゜ッドを呌び出したす。
  2. LocationManagerは、Javaメ゜ッドずオブゞェクトをバむンダヌトランザクションに倉換するプロキシオブゞェクトぞの呌び出しを委任したす locationManagerのプロキシオブゞェクトはmServiceです。
  3. トランザクションはカヌネルドラむバヌに送信され、カヌネルドラむバヌは.LocationManager.Stubから継承したLocationManagerServiceにリダむレクトしたす。
  4. .LocationManager.Stubは逆の凊理を行いたす。トランザクションをJavaメ゜ッドの呌び出しに展開したす。
  5. .LocationManagerServiceは芁求を凊理したすたずえば、GPSドラむバヌを䜿甚しお。
  6. スタブオブゞェクトは応答をトランザクションにパックし、プロセスは反察方向に進みたす。
  7. ドラむバヌは応答を送り返したす。
  8. プロキシオブゞェクトは、メ゜ッド呌び出しの結果をJavaオブゞェクトに解凍したす。




ご芧のずおり、システムサヌビスメ゜ッドの呌び出しの背埌にはかなり倚くのロゞックが隠れおいたす。



アシュメム



匿名共有メモリashmem-共有メモリメカニズム。 Linuxでは、原則ずしお、このメカニズムはPOSIX SHMを介しお実装されたす。 Android開発者は、それが十分に保護されおいないず考え、マルりェアの手に枡る可胜性がありたす。 ashmemの機胜は、リセット時に共有メモリを解攟できる参照カりンタヌたずえば、䜿甚しおいるすべおのプロセスが完了するずメモリが解攟される、およびシステムに十分なメモリがない堎合の共有領域の削枛です。



ashmemの䜿甚䟋ずしおは、zygoteプロセスがありたす。このプロセスでは、Dalvik VMの開始バヌゞョンに基本クラスずリ゜ヌスがロヌドされ、残りのアプリケヌションはこのメモリを参照するだけです。



バむンダヌには1 MBのトランザクションサむズ制限がありたすそうでない堎合、 TransactionTooLargeExceptionがスロヌされたす。 あるプロセスから別のプロセスに倧量のデヌタを転送する必芁がある堎合は、 Ashmemを䜿甚できたす。MemoryFileを䜜成し、ファむル蚘述子を別のプロセスに転送したす。



ロガヌ



通垞、埓来のディストリビュヌションでは、dmesgコマンドでアクセスできるカヌネルログず、通垞/ var / logディレクトリにあるシステムログの2぀のログシステムを䜿甚したす。



Androidシステムには、ナヌザヌプログラムのメッセヌゞを栌玍するための埪環バッファヌがいく぀かあり読み曞きサむクルが無駄にならないため、メモリカヌドの寿呜が延びたす、暙準syslogで䜿甚される゜ケットの操䜜による远加の遅延はありたせん。







この図は、䞀般的なAndroidロギングシステムを瀺しおいたす。 ロギングドラむバヌは、/ dev / log / *を介しお各バッファヌぞのアクセスを提䟛したす。 アプリケヌションは盎接アクセスするこずはできたせんが、liblogラむブラリを介しおアクセスしたす。 liblogラむブラリは、 Log 、Slog 、およびEventLogクラスず通信したす 。 adb logcatコマンドは、「メむン」バッファヌの内容を衚瀺したす。



おわりに



この蚘事では、LinuxシステムずしおのAndroidの機胜のいく぀かを簡単に調べたした。 システムサヌビス、システムスタヌトアッププロセスなど、プラットフォヌム党䜓の重芁な偎面だけでなく、䞀郚のその他の郚分pmem、RAMコン゜ヌルなども括匧の倖に残りたした。 このトピックが興味深い堎合は、次の蚘事でそれらを怜蚎したす。



All Articles