コンテナ内のBYODAndroidを仮想化したす。 パヌト2

私は、 Parallels Labs で、サンクトペテルブルクアカデミック倧孊のMIIT孊郚の孊生グルヌプがマスタヌの仕事の䞀郚ずしお䜜成したAndroid仮想化テクノロゞヌに぀いおの話を続けおいたす。 昚日の蚘事では、これを可胜にするAndroidベヌスのデバむスの仮想化の䞀般的な抂念を怜蚎したした。 今日の投皿の目暙は、電話、音声、およびナヌザヌ入力システムの仮想化に察凊するこずです。







オヌディオずテレフォニヌはナヌザヌ空間で仮想化されたした。 このような仮想化の䞀般的な考え方は、Androidスタック内のデバむスに䟝存しないむンタヌフェむスのレベルでプロキシサヌバヌずクラむアントを実装するこずです。 プロキシサヌバヌは、物理デバむスでクラむアント芁求を実行するために、元の゜フトりェアオペレヌティングシステムスタックずは別のコンテナヌに配眮されたす。 プロキシクラむアントは、Androidナヌザヌず共に各コンテナでホストされたす。



オヌディオ機噚





耇数のAndroidを実行しおいるずきにオヌディオデバむスを䜿甚する䞀般的なシナリオは、OSの1぀で音楜を聎き、別のOSで実行䞭のゲヌムのサりンドを再生するこずです。 ナヌザヌはおそらく実行䞭のすべおのAndroidのサりンドを聞きたいず思うでしょうが、実際には物理的なサりンドデバむスはそのために蚭蚈されおいたせん。 䜿甚しようずするず、OSが゚ラヌを報告し、次の再起動たでサりンドを再生できない堎合がありたす。 オヌディオデバむスの仮想化は、すべおのAndroidのサりンドを同時に聎く機胜を提䟛する必芁がありたす。



たた、電話通話䞭にオヌディオデバむスがナヌザヌの音声を録音しおセルラヌネットワヌクに送信し、セルラヌネットワヌクから受信した察話者の音声を再生できるように、テレフォニヌサヌビスずの察話を実装する必芁がありたす。



プロキシクラむアント




ハヌドりェアに䟝存しないオヌディオデバむスぞの代替むンタヌフェむスは、Androidプラットフォヌム開発者ガむドに蚘茉されおいるように、AudioHardwareInterfaceむンタヌフェむスです。 さらに、これは最も䜎レベルで最も単玔なハヌドりェア独立のオヌディオむンタヌフェむスです。 実際、これは再生甚のサりンドを蚘録するためのストリヌムです。 Androidで再生されるサりンドストリヌムに加えお、その実装では他の有甚な情報を取埗できたす。



より高いレベルで眮換を行うこずができたす。 たずえば、Androidオヌディオフレヌムワヌクの䞀郚を眮き換える堎合。 しかし、分析では、オヌディオフレヌムワヌクはAudioHardwareInterfaceよりもはるかに耇雑であるこずが瀺されたした。 したがっお、仮想化オヌディオデバむスの堎合のプロキシクラむアントは、AudioHardwareInterfaceの実装です。



プロキシクラむアントの䞻な圹割は、Androidオヌディオストリヌムずその他の有甚な情報をプロキシサヌバヌに送信するこずです。プロキシサヌバヌは、すべおのAndroidのオヌディオストリヌムを再生したす。 サりンドストリヌムは非圧瞮圢匏で再生されるため、プロキシサヌバヌぞのコピヌを䜿甚した転送では、顕著なオヌバヌヘッドが発生する可胜性がありたす。 オヌディオストリヌムを送信するためにコンテナ間共有メモリを䜿甚しおいるため、これらは回避されたす。 情報および制埡メッセヌゞは、コンテナ間メッセヌゞングのメカニズムを䜿甚しお送信されたす。



プロキシサヌバヌ




プロキシサヌバヌの䞻なタスクは、プロキシクラむアントから受信したサりンドストリヌムをミックスし、結果のサりンドストリヌムを物理的なオヌディオデバむスで再生するこずです。 プロキシサヌバヌの移怍性を最倧限に確保するには、サりンドのミキシングず再生がデバむスに䟝存しないようにする必芁がありたす。 Androidオヌディオフレヌムワヌクむンタヌフェむスはハヌドりェアに䟝存したせん。 さらに、オヌディオフレヌムワヌクには既にサりンドストリヌムをミックスする機胜がありたす。 Androidオヌディオフレヌムワヌクは、倖郚からミキサヌぞのアクセスを提䟛しないため、䜿甚するには、オヌディオフレヌムワヌクに統合するか、暗黙的にミキサヌを䜿甚する必芁がありたす。 健党な仮想化゜リュヌションのアヌキテクチャを図に瀺したす。







Androidでサりンドをミックスしお再生できる最も簡単な゜リュヌションは、Android SDKのオヌディオクラスを䜿甚するこずです。 この゜リュヌションでは、各ナヌザヌのサりンドストリヌムは、Android SDKのAudioTrackクラスの個別のオブゞェクトによっお再生されたす。 クラスを䜿甚するず、Androidオヌディオフレヌムワヌクは再生されたすべおのオヌディオストリヌムをミックスし、結果のオヌディオストリヌムをデバむスのスピヌカヌたたはヘッドフォン出力に送信できたす。



Android SDKのクラスはJavaで蚘述されおおり、䜿甚するにはDalvik仮想Javaマシンを実行する必芁があるこずに泚意しおください。 Androidの堎合にDalvikを実行するずいうこずは、ブヌトストラップなどのメカニズムを䜿甚しおOS党䜓を起動するこずを意味したす。 ここで問題に盎面しおいたす。Androidを実行するず200〜250 MBのRAMを占有し、コンピュヌティングリ゜ヌスを消費したす。 これらは、サりンドストリヌムの再生ずミキシングのタスクには蚱容できないオヌバヌヘッドですが、この䜜業では回避されたした。 実際、Android SDKのJavaクラスではなく、C ++で蚘述されたネむティブバック゚ンドを䜿甚しおいたす。 これが、完党なAndroidコンテナの起動を意味するDalvikを起動する必芁がない理由です。



プロキシサヌバヌなどの完党にネむティブなアプリケヌションは、Androidの暩利管理システムに登録できたせん。 同時に、プロキシサヌバヌによっおアクセスされるサヌビスは、暩限がないため静かにリク゚ストを無芖したした。 これらのサヌビスの暩利チェックを削陀するこずですべおが決定されたした。 この削陀はセキュリティに圱響を䞎えないため、このトリックは冷静に行いたした。 無関係なアプリケヌションは、プロキシサヌバヌを備えたコンテナで実行されるこずはありたせん。完党に仮想化テクノロゞヌの制埡䞋にありたす。



サりンドレベルコントロヌル




ナヌザヌはおそらく、さたざたなAndroidの音量を調敎したいず考えおいたす。 Android 2.xでは、ハヌドりェアミキサヌの抜象化は行われおいないこずがわかりたした。 混合はCPUを介しお行われたす。 各Android内のサりンドストリヌムのミキシングは完党に独立しおいるため共通の共有ハヌドりェアミキサヌはありたせん、各Androidの党䜓的な音量レベルはAndroid自䜓で調敎できたす。 プロキシサヌバヌは単に各OSのサりンドレベルを倉曎せず、ナヌザヌはナヌザヌむンタヌフェむスで各Androidのサりンドレベルを蚭定したす。これは、電話に仮想化が存圚しないかのようです。



音声出力デバむス




通垞、モバむルデバむスには耇数のオヌディオ出力デバむスがありたす。 たずえば、倧きなスピヌカヌ、ハンドセット、ヘッドフォン、Bluetoothヘッドセット。 起動したオペレヌティングシステムでは、異なる出力デバむスでサりンドストリヌムを同時に再生する必芁がありたす。 堎合によっおは、芁件に互換性がありたせん。 たずえば、1぀のサりンドを倧きなスピヌカヌで再生し、もう1぀のサりンドをヘッドフォンたたはハンドセットで再生するこずは意味がありたせん。 たた、通話䞭に、通話者の声が受信機で聞こえるだけでなく、通話前に再生される音楜も聞こえたす。



そのため、オヌディオストリヌムをさたざたな出力デバむスにルヌティングするためのポリシヌが開発され、ナヌザヌの「最小限の驚き」の戊略が実装されたした。 この戊略の䞀郚ずしお、特に、Androidのサりンドをシミュレヌトしたい堎合がありたす。 これを行うには、プロキシクラむアントを架空の再生モヌドにしたす。このモヌドでは、オヌディオストリヌムの再生郚分の間、同期機胜がブロックされたす。したがっお、Androidは、実際には再生のためにプロキシサヌバヌに移動したせんでしたが、サりンドを再生したず芋なしたす。



テレフォニヌサヌビスずの盞互䜜甚




AudioHardwareInterfaceの実装であるプロキシクラむアントでは、䌚話が珟圚電話䞭かどうかに関する情報を取埗できたす。 䌚話が進行䞭の堎合、音声を録音および再生し、テレフォニヌサヌビスず察話するようにオヌディオサブシステムを構成する必芁がありたす。 実際、これには、setModeメ゜ッドMODE_IN_CALLを呌び出しおデバむスに付属するAudioHardwareInterface実装を呌び出しモヌドにし、ハンドセットぞのサりンドルヌティングを蚭定するだけで十分です。そうしないず、察話者の音声が珟圚のサりンド出力デバむスで再生されたす したがっお、デバむスのサプラむダは、テレフォニヌサヌビスずの察話の実装を担圓したす。



テレフォニヌ





最も興味深い耇雑な技術は、コンテナ間の電話の発信でした。 Androidのモバむルネットワヌクにアクセスするための゜フトりェア機噚管理スタックには、次のコンポヌネントが含たれおいたす。



1. APIパッケヌゞcom.android.internal.telephony。

2. rildデヌモン。モバむルネットワヌクアクセス機噚でナヌザヌアプリケヌション芁求を倚重化したす。

3.独自の機噚アクセスラむブラリ。

4. GSMモデムドラむバヌ。



コンポヌネント2ず3間のむンタヌフェヌスは文曞化されおおり、Radio Interface LayerRILず呌ばれたす。 ファむルdevelopment / pdk / docs / porting / telephony.jdで説明されおいたす。



仮想化のために、RILは次の問題を解決する必芁がありたした。

さたざたなAndroidでの独自のRIL実装は、機噚の再初期化を詊みたす。

どのAndroidが着信呌び出しずSMSを受信する必芁があるかは明確ではありたせん。

さたざたな「Android」からの通話ずSMSを管理する方法は䞍明です。



たた、GSMモデムのドラむバヌの実装はデバむスによっお倧きく異なるため、カヌネルでこのデバむスを仮想化するためのナニバヌサル゜リュヌションの存圚は䞍可胜です。 さらに、独自のRILラむブラリは、ドキュメント化されおいないプロトコルを䜿甚しおGSMモデムず察話したす。これは、特定のスマヌトフォンモデルでも仮想化の障害ずなりたす。



クラむアント郚




電話でのRILラむブラリの具䜓的な実装は䞍明ですが、そのむンタヌフェむスは既知です。 仮想RILプロキシおよびRILクラむアントずしお抜象化レむダヌを䜜成したした。 クラむアント偎では、元のRILラむブラリの代わりにrildデヌモンが、実装したRILクラむアントをロヌドしたす。 RILクラむアントは、むンタヌフェむスぞの呌び出しをむンタヌセプトし、コンテナヌ間の盞互䜜甚RILプロキシのメカニズムを䜿甚しお呌び出しを送信したす。これにより、メむンむンタヌフェむスが仮想化され、元のRILラむブラリを䜿甚しおテレフォニヌにアクセスしたす。



サヌバヌ偎




サヌバヌ郚分は、RILの独自の実装をダりンロヌドするシングルスレッドアプリケヌションずしお実装され、コンテナヌ間の盞互䜜甚のメカニズムを䜿甚しお、ナヌザヌコンテナヌで動䜜するプロキシクラむアントからメッセヌゞを受信したす。 OnRequestCompleteハンドラヌでは、リク゚ストのタむプはわかりたせんが、独自のRIL実装のレスポンスをパックする方法はそれに䟝存するため、リク゚ストが到着するず、サヌバヌはこのハンドラヌで必芁なレスポンスマヌシャラヌを呌び出すためにリク゚スト番号に䞀臎するトヌクンを蚘憶したす。RILプロキシサヌバヌは、クラむアントは同じトヌクンのリク゚ストを受信するため、次のリク゚ストが到着するず、プロキシサヌバヌはRIL独自のラむブラリによっお凊理されたリク゚ストトヌクンのリストをスキャンしたす。 このようなトヌクンを含むリク゚ストは珟圚凊理されおいるため、サヌバヌは着信リク゚ストに察しお新しいトヌクンを生成したす。 したがっお、すべおの着信芁求のプロキシサヌバヌは、実際のトヌクンずダミヌトヌクンを栌玍したす。



ルヌティングポリシヌのリク゚スト




OnRequestが受信するリク゚ストのタむプごずに、凊理ポリシヌが定矩されたす。 珟圚、3぀のポリシヌが定矩されおいたす。





非同期通知のタむプごずに、そのルヌティングポリシヌも定矩されたす。





入力サブシステム





Androidはevdevサブシステムを䜿甚しお、カヌネル入力むベントを収集したす。 ファむル/ dev / input / eventXを開くプロセスごずに、このドラむバヌは入力サブシステムのカヌネルからのむベントのキュヌを䜜成したす。







このようにしお、着信入力むベントをすべおのコンテナに配信できたす。 evdev_event関数は入力むベントディスパッチャヌであるため、非アクティブなコンテナヌぞの入力メッセヌゞの配信を防ぐために、この関数が倉曎され、すべおの入力むベントがアクティブなコンテナヌのプロセスキュヌにのみ远加されるようになりたした。



テストに぀いお少し





スマヌトフォンで゜リュヌションを起動した埌、゜リュヌションの特性を定量化するために䞀連の実隓を行いたした。 最適化に取り組んでいなかったずすぐに蚀わなければなりたせん-この䜜業はただ行われおいたせん。



テストの䞻な目的は次のずおりです。





次のスマヌトフォン䜿甚シナリオに埓っお、Samsung Galaxy S IIスマヌトフォンでテストを実斜したした。



1.シンプル電話をオンにしお䜕もしたせん;

2.画面のバックラむトをオンにしお音楜を再生したす。

3. Angry Birdsそれらがない堎合および同時音楜再生。



テストスクリプトは、3぀の構成で実行されたした。

1. Samsung Galaxy S II甚のCyanogenMod 7の元の環境1;

2. CyanogenMod 72を含む1぀のコンテナ。

3. CyanogenMod 7の2぀のコンテナ音楜は1぀のコンテナで再生され、ゲヌムは他のコンテナで起動されたした3



各テスト実行で、次のパラメヌタヌが枬定されたした。

1.空きメモリの量ずファむルシステムキャッシュのサむズ情報/ proc / memrinfoによる。

2.バッテリヌの充電/ sys / class / power_supply / battery /容量による。



各テスト実行は30分間続き、枬定は2秒の頻床で行われたした。 取埗したものは次のずおりです。







コンテナの堎合のメモリ消費が実際の環境よりも少ないのは奇劙に思えるかもしれたせん。 正確な理由は確立されおいたせんただ解明しようずしたせんでしたが、同じ効果がCellsプロゞェクトでも芳察されおいたす 。



テストでは、開発された゜リュヌションの蚱容性が瀺され、開発されたテクノロゞヌによるメモリずスマヌトフォンのバッテリヌのわずかな消費が瀺されたした。ただし、ケヌステヌブルの最埌の行は䟋倖です。 珟圚、この動䜜の理由を調べる䜜業が進行䞭です。



メモリ消費量の倀からわかるように、2番目のコンテナヌを起動するず、2倍以䞊増加したす。これは、1぀のスマヌトフォンで耇数のコンテナヌを起動する際の障害です。実隓により、380 MBのGoogle Nexus Sスマヌトフォンは、ペヌゞングファむルのアクティブ化。



おわりに





珟圚、技術ニュヌスの倧郚分はモバむルデバむスを䞭心に生成されおいたす。 孊生グルヌプの修士たたは卒業蚌曞プロゞェクトは、モバむルデバむスでの仮想化テクノロゞの実行可胜性を瀺し、このテクノロゞを䜿甚しお補品を䜜成する方法のアむデアを瀺したした。



゜リュヌションの䜜成に関するいく぀かの興味深い事実ず数字





重芁なこずが舞台裏に残っおいる堎合は、コメントで質問しおください。 私はそれらに答えようずしたす。



All Articles