Ⅰ. 概要
Androidこれについて詳しく見ていきます。LinuxとJavaを基盤とするAndroidは、Linuxカーネル層から、HAL(ハードウェア抽象化レイヤー)、ネイティブC/C++ライブラリ、Android Runtime、Java APIフレームワーク、システムアプリといった層に構成されています。それぞれの層がどのような役割を担い、どのように動作しているのかを詳しく見ていきましょう。 Linuxカーネルこれは、ハードウェア、ネットワーク、ファイルシステムへのアクセスなど、システム全体の管理と制御を行います。 HALこれは、Java APIフレームワークを通じて、デバイスのハードウェア機能に対する標準的なインターフェースを提供します。 ネイティブのC/C++ライブラリこれにより、FreeFont(フォント)、Webkit(ブラウザエンジン)、Media(コーデック)、SQLite(軽量データベース)などの機能を利用できるようになります。 Android実行環境これにより、オペレーティングシステムはAndroidアプリケーションを実行できるようになります。 Java API フレームこれには、アクティビティマネージャー(通話、リソース、通知など)、コンテンツプロバイダー、ビューシステムなどが含まれ、ハードウェアの制御のためのインターフェースを提供します。 アプリケーション層これらは、システムアプリケーションとユーザーアプリケーションに分けられます。システムアプリケーションは、管理者権限を持つアプリケーションで、電話やメッセージなどが含まれます。一方、ユーザーアプリケーションは、一般のユーザーが管理できるもので、KakaoTalkやNaverなどが該当します。
Ⅱ. Android
Linuxカーネルとハードウェア抽象化レイヤー(HAL)
Androidこれは、モバイルデバイス向けのオペレーティングシステムです。Linuxカーネルを基盤として開発されており、Javaを基盤として、最近ではKotlinを用いたアプリケーション開発も行われています。ネイティブ開発キットを使用することで、Android上でC、C++を用いた開発も可能です。

Androidは一般的にこの構造に従いますが、以下 Linuxカーネルの階層まず、Linuxカーネルを基盤として開発されたOS(オペレーティングシステム)について見ていきましょう。カーネルは、他のOSと同様に ハードウェア、ネットワーク、ファイルシステムへのアクセスなど、システム全体の管理と制御を行います。 さらに、セキュリティ設定、メモリ管理、電源管理、ネットワークシステム管理、デバイス(Bluetoothデバイス、ネットワークデバイス、バッテリー、APチップ、各種センサーなど)のドライバー管理といった詳細な機能があります。次に ハードウェア抽象化レイヤー (HAL)これは、HAL(ハードウェア抽象化レイヤー)を指します。Windowsのように、ハードウェアにアクセスするために複数のAPIインターフェースを使用できますが、AndroidではJava APIフレームワークを通じて、デバイスのハードウェア機能に標準的なインターフェースを提供します。写真のように オーディオ機能の提供、またはBluetooth、カメラ、センサーなどの特定の種類のハードウェアコンポーネントのモジュールを提供します。
※ Androidで使用されるCPUは、一般的にRISCアーキテクチャを使用していますが、Intel製のCPUを使用するAndroidも存在します。CPUに関するより詳細な情報は、以下の記事を参照してください。
[SK Telecom SeSAC、ソウル1期] CPUアーキテクチャ、メモリアーキテクチャ
2. ネイティブなC/C++ライブラリとART(Android Runtime)
次に ネイティブ C/C++ ライブラリ層これらネイティブ層には、上で軽く触れたAndroid Native Development Kit (NDK)が含まれています。NDKはCやC++をベースとしたアプリ開発を可能にし、ライブラリとして、FreeFont(フォント)、WebKit(ブラウザエンジン)、Media(コーデック)、SQLite(軽量DB)などを利用できます。写真のネイティブ層のすぐ隣に Android実行環境の階層これは、オペレーティングシステムが複数のAndroidアプリケーションを利用できるようにする機能です。以前は「Dalvik」という名前でしたが、現在では Android実行環境これを「DEX形式」と呼びます。これは、Javaのコンパイル後のバイトコードをDEX形式に変換し、APK形式でパッケージ化することで、実行できるようにするものです。この説明だけでは理解が難しいかもしれませんので、Javaがどのようにコンパイルされ、実行されるのかを見ていきましょう。
2-1. JVM(Java仮想マシン)とDVM(Dalvik仮想マシン)

Java言語で開発(コーディング)を行った後、Javaコンパイラがクラスに基づいてJavaバイトコードを作成します。このバイトコードを使って Java仮想マシンこのプログラムを実行できるのですが、Javaのバイトコードで実行可能なファイルが바로 Jarファイルです。もう少し詳しく説明すると、

例えば、Javaで開発されたプログラムがコンパイラによってバイトコードに変換され、そのバイトコードが通常のJavaプログラムのJARファイルになる場合、 Android アプリケーションは、まず Dalvik ByteCode (.dex) に変換され、さらに変換されて APK 形式に変換されます。 これらの変換されたJARファイルとAPKファイルは JVM(Java仮想マシン)卵 Android実行環境これにより、ユーザーは、まるでネイバーの地図で目的地を検索するような形で、アプリケーションを実際に使用することができます。
※ JVM(Java Virtual Machine)は、シェルとユーザープログラム(アプリケーション)の間で動作します。Android用の名称はDalvik Virtual Machineであり、クロスコンパイルされます。 クロスコンパイルこのアプリケーションは、Aプラットフォーム上でJavaをコンパイルし、Bプラットフォーム上で動作するように設計できます。つまり、Linux上でコンパイルし、Android上で動作するように設計できる、と考えることができます。JVM自体は、どのOSでも動作しますが、Androidでは軽量で、クロスコンパイルも可能であるという利点があります。 Dalvikバイトコード(正確には classes.dex)Dalvik仮想マシン上でアプリケーションを実行するために、必要な要素を準備します。
まず、JVMとDVMについてもう少し詳しく見ていきましょう。JVMは、Javaバイトコードを実行するために使用されます。 Java仮想マシンこれは、Android アプリケーションを実行するための DVM (Dynamic Virtual Machine) のことです。 Dalvik 仮想マシンこれは、Javaの仮想マシンはプラットフォームに依存していることを意味します。つまり、

OSの種類によって、JVMは異なります。しかし、 コンパイルされたJavaバイトコード(JARファイル)は、どのJVMでも実行可能です。 Dalvik仮想マシンは、モバイルデバイスの環境に最適化されており、限られたメモリでも動作するように設計されています(これは、モバイルデバイスのバッテリーや性能の制約によるものです)。この2つの仮想マシンは、Javaをベースにしています。Javaでコーディングすると、.javaファイルを確認できます。これはJavaのソースコードであり、.classファイルはJavaのバイトコードです。 Dalvik仮想マシンは、この.classファイルをdex形式に変換することで、実行可能にするものです。 さらに、もう一つの特徴として

JVMは、 スタックDVMは、これに基づいていますが、 レジスタこれは、JVMをベースにしています。そのため、計算の過程で、JVMは、以前に軽く触れたアセンブリのPUSH、POPと類似した演算子を使用します。一方、DVMでは、オペランドが保存されるため、PUSH、POPの演算子を使用せずに、よりシンプルな命令で動作するため、命令数は少なくなり、コードは長くなります。AndroidのDEXをアセンブリのSmaliコード(Android DEX形式のアセンブリ)にデコンパイルすることで、アセンブリのコードを確認することができます。

※ なお、Windowsもスタック方式を採用しています。
2-2. ART (Android Runtime)、APK (Android Package Kit)、DEX (Dalvik Executable)
ARTは、GoogleがDVM(ディスプレイエンジン)の性能向上を目的として変更したものです。DVMの 即時コンパイルプロセス~を AOT (Ahead-of-Time) コンパイル プロセス変更されました。しかし、両方のプロセスは現在も使用されており、AOTコンパイルは ガベージコレクションこれは改善されました。次に、JIT(Just In Time)についてもう少し詳しく見ていきましょう。JITとは 動的翻訳また、これは最初の起動時に機械翻訳を使用するためです。代わりに ハードウェアへの負荷が高いため、バッテリーの持続時間など、ネガティブな影響(バッテリー、CPUなど)が生じる可能性があり、動作速度が遅くなる可能性があります。 しかし、容量は小さいですが、インストール速度は速いです。AOT(Ahead of Time)は アプリをインストールする際に、コンパイル処理を行います。これにより、電力消費を削減し、パフォーマンスを2倍に向上させることができます。 一方、容量は大きいものの、インストール速度は遅いという特徴があります。しかし、実行速度は速く、ハードウェア(バッテリー、CPU)の使用量を削減できます。2016年のAndroid Nougat (7.0) 以降、ARTではJITとAOTの両方のコンパイルを使用していますが、インストール時にはJITを使用し、状況に応じてAOTを柔軟に適用します。
APKは、Androidで使用されます。 プログラムとして配布される形式のファイルこれは、Javaプログラムの形式であるJARファイルから派生した形式で、ZIP形式の圧縮構造を持つファイルです。APKパッケージファイルがインストールされるパスは、/data/app/パッケージ名、/data/data/パッケージ名です。DEXは Dalvik実行ファイルこれは、Javaで記述されたクラスファイルの集合体です。

この画像を見れば、より理解しやすくなると思います。Javaのソースコードは、クラスごとに作成され、これらのクラスをまとめてClasses.dexというファイルにまとめ、DVM上で実行されるのです。
※ 以前の投稿で説明しましたが、WindowsではPE構造が存在します。このPE構造は、WindowsがPrefetchを通じて最適化を行う際に利用されるもので、拡張子で「pf」となっているファイルです。プログラムを初めて使用した後、最適化を行うことで、その後の実行速度が向上する可能性があります。以下のサイトからWinPrefetchViewプログラムをインストールして開くと、複数の「pf」ファイルが表示されます。同じプログラムであるにも関わらず、複数のファイルが存在するのは、ファイルパスが異なるためです。上記で説明したAndroidのDEXが、アプリケーションの最適化を担当していると考えることができます。ただし、Androidの場合、ファイルパスが異なる可能性があります。
Windows のプレフェッチファイル (.pf) の内容を表示する


3. Java APIフレームワークとアプリケーション層
アンドロイドの階層構造の写真を、再度上から取得してみました(すでに何度も取得してしまったため…)。 Java API フレームこれは、上記で軽く触れたものです。HAL層において ハードウェアを使用できるようにするためのインターフェースの利用方法については、フレームワークを参照してください。「そうです」と説明がありました。Android OSの様々な機能は、このAPIを通じてアクセスできます。Activity Manager(通話、リソース、通知など)、コンテンツプロバイダ、ビューシステムなどが含まれます。この部分は、アプリケーション層におけるアプリのコンポーネントについて詳しく説明する際に、さらに詳しく解説する内容であると思われます。
アプリケーション層システムアプリケーションとユーザーアプリケーションに分けられます。システムアプリケーションは`/system`ディレクトリに存在し、ユーザーが制御したり変更したりすることはできません。Android携帯の購入時に、標準でインストールされているアプリ(電話、メッセージなど)をイメージしてください。ユーザーアプリケーションは`/data`ディレクトリに存在し、ユーザーが制御したり変更したりすることができます。各アプリケーションは サンドボックスこれらのシステムは、個別に動作し、他のシステムに影響を与えたり、データ通信を行ったりすることができません。アクセスできるのは、特定のアプリケーションに付与された権限を持つリソースのみであり、カカオトークやネ이버などの一般的なアプリケーションが該当します。私たちがアプリケーションを使用し、権限を付与することも、これらのサンドボックスと関連していると考えることができます。
※ サンドボックスについてもう少し詳しく説明します。 一種の隔離された空間で、立ち入るべきではありません。 それぞれのアプリケーションは 独立した空間これは当然のことであり、さらにサンドボックス内に入ること 他のアプリケーションとの連携も、影響を及ぼすことができない。 ユーザーアプリは通常のユーザー権限で動作し、システムアプリは管理者権限でのみ制御または変更が可能です。同様に、サンドボックスによって保護されている機能も、管理者権限でのみアクセスできます。サンドボックスの保護が侵害されると、Android携帯のユーザーが聞いたことがある「ルート化」です。ルート化とは、通常のユーザーであっても、管理者権限で制御できるようになることです。これは、Linuxの`setuid`や`setgid`を使用してプロセスに権限を変更するのと似ています。つまり、Linuxカーネルのセキュリティを侵害する行為と言えます(`sudo su`コマンドをご利用経験がある方であれば、`su`がユーザー切り替え機能であることをご存知でしょう)。
サンドボックスとルート化について、もう少し詳しく説明します。
アプリケーションサンドボックスも、他のセキュリティ機能と同様に、完全に保護されています。しかし、適切に設定されたデバイスからサンドボックスを抜け出すためには、Linuxカーネルのセキュリティを侵害する必要があります。
LinuxベースのAndroidでも、root権限があれば、すべての操作を実行できます。 最高レベルのユーザー可能です。一部の重要なユーティリティのみがroot権限で実行できますが、Androidでroot化を行うと、実行中のすべてのアプリをroot権限で利用できるようになります。実際、メーカーは、私たちが購入した携帯電話の所有者と見なせるでしょう。物理的には私たちが所有者ですが、そのため、私たちはroot権限を持っていません。しかし、このroot化を行う理由は、ユーザーによって異なる可能性があります。 デバイスを完全に制御するために。 スマートフォンをより魅力的なデザインにするため、または、ルート化によってのみ利用できる特別なアプリを使用するため、あるいは、開発者やセキュリティ関連の学習や業務のためである可能性があります。しかし、これらの目的には、 欠点しかし、そのような状況も存在します。 このデバイスのセキュリティが侵害され、悪意のあるアプリケーションにも脆弱性がある。以前は、連絡先やメッセージなど、本来はサンドボックスで保護されるべきだった情報 他のアプリが侵入し、追加の操作(情報の収集など)を行う。または、デバイスが故障した場合 使用できなくなった場合、または保証が無効になった場合そのため、修理ができない場合もあります。
※ iPhoneは、当初からルートユーザーの権限で利用されています。iPhone自体も、Linuxをベースにしています。また、サンドボックスという仕組みにより、他のアプリへの侵入を防ぐように設計されています。しかし、iPhoneでのルート化は… 不正な方法で刑務所からの脱獄そう呼ばれています。それでも、iPhoneの方がセキュリティが高いと言われる理由は何でしょうか?それは、アプリに対する署名によるものです。具体的には、「コード署名」という仕組みがあり、AndroidやiPhoneなど、開発されたアプリケーションに署名を行い、認証書を通じて… 信頼関係を築く。 しかし、Androidであれば開発者が署名できますが、iPhoneの場合はApp StoreでAppleが独自に行うため、認証されていないアプリは利用できません。そのため、セキュリティが高いとされています。 Androidでは、ウェブ上には多くのAPKファイルが存在しますが、iPhoneではそうではないという理由もあります。
3-1. アプリケーションのコンポーネント(アクティビティ、サービス、ブロードキャスト受信者、コンテンツプロバイダ)
アプリケーションの構成要素(アプリの構成要素)これらは、Android アプリケーションに必要な基本的な要素であり、それぞれ独立した機能を持つ。合計4つの要素があり、システムやユーザーがアプリにどのようにアクセスできるかについて規定されている。 入り口まず 活動これは、ユーザーがシステムと直接的に関わるための入り口となる機能です。 ユーザーインターフェース (UI)そう考えることができます。 サービスこれは、アプリをバックグラウンドで継続的に動作させるための汎用的な入り口です。ここでいう「バックグラウンド」とは、アプリを起動しなくても音楽を再生したり、時間が経過したり、大量のファイルをダウンロードしたり、コピーしたり、ネットワーク通信を行うといった一連の処理を指します。つまり、Windowsでキーボードやマウスの操作でプログラムを制御することは、フォアグラウンド(前平面)と呼ばれますが、Androidではアプリの画面を表示し、直接タッチして操作することもフォアグラウンドと考えることができます。一方、バックグラウンドは、直接的な操作なしに、自動的に動作する必要があります。アプリを起動していない状態でも動作することが求められます。 バックグラウンドは、ユーザーインターフェースを提供しません。
※ 前景と背景の概念は、すべてのオペレーティングシステムで共通の概念です。
ブロードキャスト受信機これは、定期的に発生するイベントをアプリケーションに通知するように設計されたコンポーネントです。 ユーザーフロー(非同期データストリーム:つまり、継続的にデータをやり取りする形式) 外部(私が特定のアプリを使用し、データを送受信している場合でも)、多くのブロードキャストは、画面が消灯したり、バッテリーが消耗したり、写真の撮影など、システムによって引き起こされる動作です。一般的なアプリも、ブロードキャストを通じて、ステータスバーに通知を表示するなどの処理を行うことができます。
※ ブロードキャスト受信装置の構成要素である「ブート完了」は、Windowsの起動プログラムと似ています。マルウェアがこのブート完了に登録されると、携帯電話を再起動しても、引き続き動作を続ける可能性があります。
最後に コンテンツ提供者これは、ファイルシステムやSQLiteなどのデータ永続化ストレージにおいて、アプリケーションのデータを共有するための仕組みを提供します。アプリケーションのデータ共有は、ウェブ上や一般的なアプリケーションからアクセスできることを意味します。例えば、コンテンツプロバイダーは、ユーザーの連絡先情報を管理し、それを通じて、一般的なアプリケーションも連絡先情報を利用した独自の機能を提供することができます。
※ コンポーネント内でIntentを認識することは重要ですが、Intentは、他のアプリのコンポーネントに対して、特定のタスクを実行するように依頼するためのメッセージングオブジェクトです。つまり、複数のアプリ間での通信や、同じアプリ内での通信にIntentを使用します。例えば、画面を表示するように依頼する場合は、アクティビティコンポーネントを操作していることになり、バックグラウンドで動作させるためにサービスコンポーネントを操作することも可能です。また、通知を送信するためにブロードキャスト受信コンポーネントを操作することもできます。さらに、コンテンツプロバイダーから共有データを取得するように指示するメッセージを送ることも、Intentの機能です。
Ⅲ. ネットワークを通じて学んだ、簡単なまとめ
この部分は、あくまで参考として簡単に済ませておいても良いでしょう。通信網は国家レベルで構成されており、通信会社が利用しています。自身の身元を隠すため、つまり匿名性を保つために、通常のネットワークの流れを回避する方法として、プロキシ、VPN、SNIなどが挙げられます。一般的には、出発地から複数のルーターを経由して目的地に到達する(これは軍隊で始まった技術です。) 代理これは、ある種の代理人としての役割であり、私が話した一般的なネットワークの流れを代わりに行ってくれます。そのため、Source IPはプロキシを経由し、プロキシは通常、サービスを提供するサーバーの外に存在します。 VPN(仮想プライベートネットワーク)これは、あたらしい場所から出発するように見えますが、実際には仮想的なコンピューターを経由して目的地に到達します。つまり、あたらしい場所によって、あたらしいIPアドレスが割り当てられます。複数のVPNプロバイダーがあり、これらのプロバイダーを通じてVPNを使用すると、あたらしいIPアドレスは、そのプロバイダーの仮想的なコンピューターから割り当てられます。 SNI (サーバー名インディケーション)これは、インターネットサービスプロバイダ(ISP)が、ホストの情報に基づいて有害サイトへのアクセスをブロックする仕組みです。ISPは、韓国のSKT、KT、LGに相当し、つまり、私たちのネットワーク活動は、ある程度監視されていると言えます。一般ユーザーが、HTTP(80番ポート)やHTTPS(暗号化された443番ポート)を使用して、国が指定した有害サイトにアクセスしようとすると、アクセスが遮断されます。つまり、ルーターを経由して通常のネットワーク通信を行う前に、中間で監視を行い、アクセスを遮断するのです。Source IPは、自分自身です。
※ 危険なウェブサイトにはアクセスしないように(または、...)。
おまけ
今日から、基礎学習の最終週が始まりました。まずはモバイルに関する基礎知識からですが、徐々に範囲が広がるのは面白いですが、内容が多いため、少し不安もあります。明日からは、実践的な演習を中心とした授業が予定されています。うまく理解できるか少し心配ですが、一方で、とても興味深い内容になるのではないかと期待しています。😁
ログイン