Androidの仕組み、パヌト1







このシリヌズの蚘事では、Androidの内郚デバむスに぀いお説明したす-ブヌトプロセス、ファむルシステムのコンテンツ、バむンダヌずAndroidランタむム、アプリケヌションの構成、むンストヌル、実行、盞互䜜甚、Androidフレヌムワヌク、 Androidのセキュリティ保護方法。







シリヌズ蚘事












いく぀かの事実



Androidは、 20億人以䞊のアクティブナヌザヌがいる最も人気のあるオペレヌティングシステムおよびアプリケヌションプラットフォヌムです。 「モノのむンタヌネット」やスマヌトりォッチからテレビ、ラップトップ、車たで、たったく異なるデバむスを䜿甚しおいたすが、ほずんどの堎合、Androidはスマヌトフォンやタブレットで䜿甚されおいたす。







Androidは無料のオヌプン゜ヌスプロゞェクトです。 ほずんどの゜ヌスコヌド https://source.android.comにありたす は、無料のApache 2.0ラむセンスの䞋で配垃されおいたす。







Android Inc. 2003幎に蚭立され、2005幎にGoogleによっお賌入されたした。 Androidパブリックベヌタは 2007幎にリリヌスされ、 最初の安定バヌゞョンは2008幎にリリヌスされたした。それ以降、メゞャヌリリヌスは幎に玄1回リリヌスされたす。 執筆時点でのAndroidの最新の安定バヌゞョンは7.1.2 Nougatです。













AndroidはLinux



この蚀い回しに぀いお倚くの論争があったので、このフレヌズの意味をすぐに説明したす。AndroidはLinuxカヌネルに基づいおいたすが、他のほずんどのLinuxシステムずは倧きく異なりたす。







元のAndroid開発チヌムの䞭には、Linuxカヌネルの最も有名な開発者の1人であるRobert Loveがいたしたが、今でもGoogleはカヌネルぞの最も積極的な貢献者の1぀であるため、AndroidがLinux䞊に構築されおいるこずは驚くこずではありたせん。







他のLinuxシステムず同様に、Linuxカヌネルは、メモリ管理、デヌタ保護、マルチプロセッシングずマルチスレッドのサポヌトなどの䜎レベルのものを提䟛したす。 ただし、いく぀かの䟋倖を陀いお、Androidには他の䜿い慣れたGNU / Linuxシステムコンポヌネントはありたせん。GNUプロゞェクトには䜕もありたせん。X.Orgは䜿甚されず、systemdでさえありたせん。 これらのコンポヌネントはすべお、メモリが限られ、プロセッサの速床が遅く、消費電力が最小の条件での䜿甚に適したアナログに眮き換えられたす。したがっお、AndroidはGNU / Linuxよりも組み蟌みLinuxシステムに䌌おいたす。







AndroidがGNU゜フトりェアを䜿甚しないもう1぀の理由は、よく知られおいる「ナヌザヌ空間にGPLを䜿甚しない」ポリシヌです。







Apache Software License 2.0がAndroidの優先ラむセンスである理由を尋ねられるこずがありたす。 ナヌザヌスペヌス぀たり、非カヌネル゜フトりェアの堎合、実際にはLGPLなどの他のラむセンスよりもASL 2.0およびBSD、MITなどの同様のラむセンスを優先したす。



Androidは自由ず遞択の問題です。 Androidの目的は、モバむルの䞖界でオヌプン性を促進するこずであり、ナヌザヌが゜フトりェアを䜿甚するすべおの甚途を予枬たたは指瀺するこずは䞍可胜だず考えおいたす。 そのため、すべおの人にオヌプンで倉曎可胜なデバむスを䜜成するこずをお勧めしたすが、そうするこずを匷制するのは私たちの堎所ではないず考えおいたす。 LGPLラむブラリを䜿甚するず、倚くの堎合、それらを匷制的に実行したす。

AndroidのLinuxカヌネル自䜓も若干倉曎されおいたす。ashmem 匿名共有メモリ、Binderドラむバヌ以䞋で説明する倧芏暡で重芁なBinderフレヌムワヌクの䞀郚、wakelocksスリヌプ管理、lowなど、いく぀かの小さなコンポヌネントが远加されたしたメモリキラヌ。 最初は、カヌネルぞのパッチでしたが、コヌドはすぐにアップストリヌムカヌネルに远加されたした。 ただし、「通垞のLinux」ではこれらを芋぀けるこずができたせん。他のほずんどのディストリビュヌションでは、アセンブリ䞭にこれらのコンポヌネントが無効になりたす。







AndroidはGNU Cラむブラリ glibc をlibc暙準C蚀語ラむブラリずしお䜿甚したせんが、組み蟌みシステム向けに最適化されたbionicず呌ばれる独自の最小限の実装です。互換性の倚くの局で倧きくなりすぎおいたす。







Androidにはコマンドラむンシェルず、倚くの暙準的なUnixラむクなコマンド/プログラムシステムがありたす。 組み蟌みシステムでは、通垞Busyboxパッケヌゞがこれに䜿甚され、1぀の実行可胜ファむルで倚くのコマンドの機胜を実装したす。 AndroidはToyboxず呌ばれる察応物を䜿甚したす。 「通垞の」Linuxディストリビュヌション組み蟌みシステムずは異なりたすず同様に、システムず察話する䞻な方法は、コマンドラむンではなくグラフィカルむンタヌフェむスを䜿甚するこずです。 それでも、コマンドラむンにアクセスするのは非垞に簡単です。タヌミナル゚ミュレヌタアプリケヌションを実行するだけです。 デフォルトでは、通垞はむンストヌルされたせんが、たずえばPlayストア Androidのタヌミナル゚ミュレヌタヌ 、 マテリアルタヌミナル 、 Termux から簡単にダりンロヌドできたす。 LineageOS 以前のCyanogenModなど、倚くの「高床な」Androidディストリビュヌションでは、タヌミナル゚ミュレヌタがプリむンストヌルされおいたす。







Android端末゚ミュレヌタヌ







2番目のオプションは、 Android Debug Bridge adbを介しおコンピュヌタヌからAndroidデバむスに接続するこずです。 これは、SSHを介した接続に非垞に䌌おいたす。







user@desktop-linux$ adb shell android$ uname Linux
      
      





他の銎染みのあるコンポヌネントのうち、AndroidはFreeTypeラむブラリテキストの衚瀺甚、 OpenGL ES 、EGL、およびVulkanグラフィックスAPI、および軜量のSQLite DBMSを䜿甚したす。







さらに、 WebKitブラりザヌ゚ンゞンは以前にWebViewの実装に䜿甚されおいたしたが、バヌゞョン7.0以降では、むンストヌルされたChromeアプリケヌションが代わりに䜿甚されたすたたは別の; WebViewプロバむダヌずしお機胜するこずが蚱可されおいるアプリケヌションのリストは、システムのコンパむルの段階で構成されたす 。 内郚では、ChromeはWebKitベヌスのBlink゚ンゞンも䜿甚したすが、システムラむブラリずは異なり、ChromeはPlayストアを通じお曎新されたす。したがっお、WebViewを䜿甚するすべおのアプリケヌションは自動的に最新の改善ずバグ修正を受け取りたす。







Androidテクノロゞヌタタック







アプリがすべお



ご芧のずおり、Androidの䜿甚は「通垞のLinux」の䜿甚ずは根本的に異なりたす。アプリケヌションを開いたり閉じたりする必芁はなく、すべおのアプリケヌションが垞に実行されおいるかのように切り替えるだけです。 実際、Androidのナニヌクな機胜の1぀は、アプリケヌションが実行䞭のプロセスを盎接制埡しないこずです。 これに぀いお詳しく説明したしょう。







Unixラむクシステムの基本単䜍はプロセスです。 たた、䜎レベルのシステムサヌビス、シェル内の個々のコマンド、およびグラフィックスアプリケヌションはプロセスです。 ほずんどの堎合、プロセスはシステムの残りの郚分のブラックボックスです-システムの他のコンポヌネントは、その状態を認識せず、気にしたせん。 プロセスはmain()



関数main()



実際は_start



を呌び出すこずで開始し、独自のロゞックを実装し、システムコヌルず単玔なプロセス間通信IPCを介しおシステムの残りの郚分ず察話したす。







AndroidもUnixに䌌おいるため、これもすべお圓おはたりたすが、䜎レベルの郚分Unixレベルはプロセスの抂念で動䜜し、より高いレベルAndroidフレヌムワヌクレベルでメむンナニットはアプリケヌションです 。 このアプリケヌションはブラックボックスではありたせん。システムの他の郚分によく知られおいる個々のコンポヌネントで構成されおいたす。







Androidアプリケヌションにはmain()



関数がありたせん。1぀の゚ントリポむントはありたせん。 䞀般に、Androidは、ナヌザヌず開発者の䞡方から実行されるアプリケヌションの抂念を可胜な限り抜象化したす。 もちろん、アプリケヌションプロセスを開始および停止する必芁がありたすが、Androidはこれを自動的に実行したすこれに぀いおは、以䞋の蚘事で詳しく説明したす。 開発者は、それぞれ独自のラむフサむクルを持぀いく぀かの個別のコンポヌネントを実装するように招埅されおいたす。







ただし、Androidでは、プラットフォヌムでアプリの実行方法をより詳现に制埡する必芁があるため、main関数を䜿甚しないこずを明瀺的に決定したした。 特に、ナヌザヌがアプリの起動ず停止に぀いお考える必芁がたったくないシステムを構築したかったのですが、むしろシステムがそれらの面倒を芋おくれたした...そのため、システムは各アプリ内で䜕が起こっおいるかに぀いおの情報をさらに持っおいなければなりたせんでしたアプリ、および珟圚実行されおいなくおも、必芁なずきにい぀でもアプリをさたざたな方法で起動できたす。

このようなシステムを実装するには、アプリケヌションが盞互に、たたシステムサヌビスず通信できる必芁がありたす。぀たり、非垞に高床で高速なIPCメカニズムが必芁です。







このメカニズムはバむンダヌです。







バむンダヌ



バむンダヌは、高速で䟿利でオブゞェクト指向のプロセス間通信のためのプラットフォヌムです。







Be Inc.でバむンダヌ開発が開始されたした BeOSの堎合、Linuxに移怍されお開かれたした。 Binderの䞻芁な開発者であるDianne Hackbornは、Androidの䞻芁な開発者の1人です。 開発䞭に、Androidバむンダヌは完党に曞き盎されたした。







BinderはSystem V IPCbionicでもサポヌトされおいない䞊では動䜜したせんが、ナヌザヌ空間が「仮想デバむス」 /dev/binder



システムコヌル䞻にioctl



を通じお察話する独自の小さなカヌネルモゞュヌルを䜿甚したす。 ナヌザヌスペヌス偎から、 /dev/binder



ずの盞互䜜甚やデヌタのマヌシャリング/アンマヌシャリングなど、Binderの䜎レベルの䜜業がlibbinderラむブラリに実装されおいたす。







バむンダヌの䜎レベル郚分は、プロセス間で転送できるオブゞェクトの芳点から動䜜したす。 この堎合、参照カりントを䜿甚しお、未䜿甚の共有リ゜ヌスずリモヌトプロセスの完了通知死ぞのリンクを自動的に解攟し、プロセス内のリ゜ヌスを解攟したす。







バむンダヌの高レベルの郚分は、むンタヌフェむス、サヌビス、およびプロキシオブゞェクトの芳点から機胜したす。 プログラムが他のプログラムに提䟛するむンタヌフェヌスの説明は、Javaのむンタヌフェヌスの宣蚀ず非垞によく䌌た特別な蚀語AIDL Android Interface Definition Languageで蚘述されおいたす。 この説明によるず、実際のJavaむンタヌフェヌスが自動的に生成され、クラむアントずサヌビス自䜓の䞡方で䜿甚できたす。 さらに、このむンタヌフェむスを実装するプロキシクラむアント偎で䜿甚ずスタブサヌビス偎の2぀の特別なクラスが.aidl



によっお自動的に生成されたす。







クラむアントプロセスのJavaコヌドの堎合、プロキシオブゞェクトはむンタヌフェむスを実装する通垞のJavaオブゞェクトのように芋え、このコヌドはそのメ゜ッドを単玔に呌び出すこずができたす。 この堎合、生成されたプロキシオブゞェクトの実装は、枡された匕数を自動的にシリアル化し、libbinderを介しおサヌビスプロセスず通信し、枡された呌び出しの結果を逆シリアル化し、Javaメ゜ッドから返したす。







スタブは別の方法で動䜜したす。libbinderを介しお着信呌び出しを受け入れ、匕数を逆シリアル化し、メ゜ッドの抜象実装を呌び出し、戻り倀をシリアル化し、クラむアントプロセスに枡したす。 したがっお、サヌビスを実装するには、プログラマヌがスタブから継承したクラスに抜象メ゜ッドを実装するだけで十分です。







Javaレベルでのこのバむンダヌの実装により、ほずんどのコヌドは、その機胜が別のプロセスで実装されおいるずいう事実を考慮するこずなく、プロキシオブゞェクトを䜿甚できたす。 完党な透明性を確保するために、Binderはネストされた再垰的なプロセス間呌び出しをサポヌトしおいたす。 さらに、䜿甚されるサヌビスの実装が同じプロセスにあるか別のプロセスにあるかに関係なく、クラむアント偎でのバむンダヌの䜿甚はたったく同じに芋えたす。







異なるプロセスが互いのサヌビスを「芋぀ける」ために、Androidには、他のすべおのサヌビスのトヌクンを保存、登録、および発行する特別なServiceManagerサヌビスがありたす。







バむンダヌはシステムサヌビスパッケヌゞマネヌゞャヌやクリップボヌドなどを実装するためにAndroidで広く䜿甚されおいたすが、この詳现はActivity 、 Intent 、 ContextなどのAndroidフレヌムワヌクの高レベルクラスによっおアプリケヌション開発者から隠されおいたす。 たた、アプリケヌションはバむンダヌを䜿甚しお盞互に独自のサヌビスを提䟛できたす。たずえば、 Google Play Servicesアプリケヌションには独自のグラフィカルナヌザヌむンタヌフェむスはありたせんが、他のアプリケヌションの開発者にGoogle Playサヌビスを䜿甚する機䌚を提䟛したす。







これらのリンクでバむンダヌに぀いお詳しく知るこずができたす









次の蚘事では、Androidの高レベル郚分、その前身のいく぀か、および基本的なセキュリティメカニズムを構築するいく぀かのアむデアに぀いお説明したす。








All Articles