WeSeong ログイン
← 記事一覧に戻る
Android

Android(Linux Kernel, HAL, Native C/C++ Libraries, ART, Java API フレームワーク、アプリケーション)

Android(Linux Kernel, HAL, Native C/C++ Libraries, ART, Java API フレームワーク、アプリケーション)

Ⅰ. 概要

Android(Android)それを見てみましょう。 Linuxと Java基づいて Androidは Linux Kernel 階層から HAL(Hardware Abstraction Layer), Native C/C++ Libraries, Android Runtime, Java API Framework, System Appsこれはレイヤーにつながります。それぞれのレイヤーがどのような役割を果たしているのか、そしてどのように機能しているのかを探ってみましょう。 Linux Kernelハードウェア、ネットワーク、ファイルシステムへのアクセスなど、システム全体を管理および制御します。 HALは Java API フレームワーク (Framework)デバイスのハードウェア機能への標準インターフェースを提供します。 Native C/C++ Librariesは FreeFont(フォント), Webkit(ブラウザエンジン) Media(コーデック) SQLite(軽量 DB) これにより、次のようなツールを使用できます Android Runtimeは Android これにより、アプリケーションがオペレーティングシステムで使用できるようになります。 Java API Frameworkは Activity Manager(Telephony, Resource, Notification など) Content Providers, View System ハードウェア制御など、さまざまな種類がありますのための インターフェースを提供します。 アプリケーション層システムは、システムアプリケーションとユーザアプリケーションに分かれています。システムアプリケーションには、最も高いユーザ権限があります。root)電話やメッセージなど、ユーザーが管理できるアプリがあります。KakaoTalkやNaverなどのユーザーアプリは、通常のユーザーが管理できます。



Ⅱ. Android(Android)

  1. Linux Kernel と Hardware Abstraction Layer(HAL)

Android(Android)これは、モバイルデバイス向けに設計されたオペレーティングシステムです。 Linux これはカーネルベースであり、最近は Java 言語に基づいて構築されています。 Kotlinまた、アプリケーションも開発されています。 Native Development Kitを通して Androidで C, C++開発も可能です


Android通常、次のような構造になります。 Linux Kernel(Linux カーネル層見てみましょう。 Linux カーネルをベースに開発 OS(オペレーティングシステムとして、カーネルは他のオペレーティングシステムと似ています。 ハードウェア、ネットワーク、ファイルシステムへのアクセスなど、システム全体を管理および制御します。 セキュリティ設定、メモリ管理、電源管理、ネットワークシステム管理、およびデバイス(Bluetooth デバイス、ネットワークデバイス、バッテリ、AP チップ、複数のセンサーなど)のドライバ管理など、より詳細な機能があります。 HAL(Hardware Abstraction Layer) 階層それは存在する。 HAL抽象化されたハードウェアを指します Windowsハードウェアを使用するには、いくつかの方法があります API インターフェースを通じて アクセスしやすいように Androidでは Java API フレームワークを介して、デバイスのハードウェア機能への標準インターフェースを提供します。上の画像のように、 Audioを使用することができます Bluetooth, Camera、Sensorsなどの特定のハードウェアコンポーネントに対応するモジュールが提供されています。


Android で使用される CPU は通常 RISC を使用しますが、Intel ベースの CPU を使用する Android もあります。CPU についての詳細については、次の投稿を参照してください。

[SKシールドアース SeSAC ソンドン1丁目] CPU Architecture, Memory Architecture


  1. Native C/C++ Libraries と ART(Android Runtime)

次へ Native C/C++ Libraries(ネイティブ C/C++ ライブラリ)階層先ほど簡単に触れたネイティブ層があります。 Android Native Development Kit(NDK)以下を含んでいます Android NDKは Cまたは C++ 言語に基づいたアプリケーションの開発を可能にし、ライブラリとして、 FreeFont(フォント), Webkit(ブラウザエンジン) Media(コーデック) SQLite(軽量 DB) これにより、このようなものを使用できます。上の画像では、ネイティブレイヤーのすぐ横に Android Runtime 階層あります。簡単に言うと、いくつかあります。 Android これにより、アプリケーションがオペレーティングシステムで使用できるようになりました。以前 Dalvikそう呼ばれていたが、現在は ART(Android Runtime)バイトコードと呼ばれ、Java コンパイラを使用してコンパイルされています DEX形式に変換し、APKにパッケージ化して実行することができます。これは理解しにくいかもしれませんので、Javaがどのようにコンパイルされ、実行されるのかを見てみましょう。


2-1. JVM(Java Virtual Machine)とDVM(Dalvik Virtual Machine)


Java で開発(コーディング)した後 Java Compilerが Class基づいて Java Bytecode一つ作りましょう。それで、 Java Virtual Machineこのプログラムを実行できます Java Bytecode実行可能な状態のファイルは Jarこれをもう少し詳しく見てみましょう。


上の写真のように Java当社が開発したプログラム Compilerを通じて ByteCodeこれを変換します ByteCode「一般」に移動します Java プログラム JARそうであれば、 Android アプリケーション Dalvik ByteCode(.dex)そしてもう一度変換します APK文字列に変換されます。 変換された後 JARと APKは JVM(Java Virtual Machine)と ART(Android Runtime)実際にNaver Mapsを使用しているを通じて 訪れたい場所を探索するように、アプリケーションを実際の環境で使用することが可能になります。


※ JVM(Java Virtual Machine)これはシェルとユーザーのプログラム(アプリケーション)の間で動作します。Android の名前は Dalvik Virtual Machineクロスコンパイルされています。* クロスコンパイルは A プラットフォーム上 Javaそれをコンパイルする B このプラットフォーム上で実行されるアプリケーションを作成できます。つまり、 Linuxコンパイルする Androidそれが実行できるようになることを考えると良いですね。 JVM どのオペレーティングシステムでも可能ですが、大きな欠点があります。 Android軽量でクロスコンパイルが可能です Dalvik ByteCode(正確に classes.dex)と Dalvik Virtual Machineアプリケーションを実行します。


もう少し正確に言うと JVMと DVM知りましょう。 JVMJava バイトコードを実行するために使用されます Java仮想マシンです。 DVMは Android アプリケーションを実行するには Dalvik 仮想マシンJava バーチャルマシンはプラットフォームに依存します。つまり、


オペレーティングシステム別 JVM変化するけど コンパイルされた Java バイトコードJAR)それは何ですか? JVMどこからでも実行できます。 Dalvik 仮想マシンは、モバイルデバイスのバッテリ寿命やパフォーマンスなどの制約を考慮して、モバイルデバイス環境向けに最適化され、低メモリで動作するように設計されています。これらの両方の仮想マシン Javaに基づいて Javaそれをコードしようとすると、java Java ソースコードと .class ファイルが表示されるはずです。classこれは Java バイトコードです。 このDalvik仮想マシンです。class ファイル dex実行可能にするために変更します。 もう一つの特徴は


JVM は、 スタック (Stack) に基づいていますが、DVM は、 レジスタ (Register) に基づいています。したがって、動作中、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の JIT コンパイルプロセスを AOT コンパイルプロセスしかし、両方のプロセスが使用されており、AOT コンパイルは Garbage Collectionこれは改善されました。 JIT(Just In Time)もう少し詳しく見てみましょう。 JITは 動的翻訳Dynamic Translation)これは、アプリを最初の実行時にマシンコードに変換するため、「機械翻訳」とも呼ばれます。代わりに、 ハードウェアに負荷がかかっており、バッテリ寿命の短縮などの悪影響が生じています(バッテリ、 CPU実行が煩雑で時間がかかる場合があります。 ただし、容量が小さく、インストール速度が速いという欠点があります。 AOT(Ahead of Time)は、アプリのインストール時にコンパイルを行います。これにより電力消費が削減され、パフォーマンスが倍増します。しかし、リソースが多く必要でインストールが遅く、またハードウェア(バッテリ、CPU)の消費も多いという欠点があります。しかし、実行速度は速く、ハードウェアの消費も少ないというメリットがあります。2016年のAndroid Nougat(7.0)以降のARTでは、JITとAOTの両方が使用されており、インストール時にJITが使用され、必要に応じて柔軟にAOTが適用されます。


APKは Androidで プログラムの形で配布されるファイルです。 Java プログラム形式 JAR拡張形式で ZIP 圧縮された構造を持っています。 APK パッケージファイルは /data/app/package_name と /data/data/package_name にあります。 DEXは Dalvik Executable例えば Java著者 Class これはファイルの集まりです。


この写真を見れば分かりやすいでしょう Java Source Codeクラスとして作成され、これらのクラスが組み合わされます Classes.dexが作成されます DVMそれが続きます。


※前回の記事で説明したように、WindowsにはPE構造があります。このPE構造により、Windowsはpf拡張子を持つファイルをPrefetchを通じて最適化できます。プログラムを初めて使用した後に最適化を行うと、後で動作が高速になる場合があります。以下のサイトにWinPrefetchViewプログラムをインストールして開くと、いくつかのpfファイルが表示されます。これは、同じプログラムであるにもかかわらず、パスが異なるためです。このように、AndroidのDEXはアプリケーションの最適化を担当していると考えることができます。ただし、Androidではパスが異なる場合があります。

Windows Prefetch (.pf) ファイルの内容を表示する



3. Java API Framework とアプリケーション層

Android 上から階層の写真を再インポートしようとした(すでにダウンロードが多すぎてしまいました…)。 Java API Frameworkこれは先ほども述べたことです。 HAL この階層では、 ハードウェアを使用できるようにするためのインターフェースを使用するフレームワークを参照してください彼は言った。 Android OSその機能のいくつかには以下が含まれます APIを通じて アクセスしやすいです Activity Manager(Telephony, Resource, Notification など) Content Providers, View Systemあります。この部分は、アプリケーション層でアプリケーションコンポーネントを説明する際にさらに詳しく説明します。


アプリケーション層システムアプリケーションとユーザーアプリケーションに分かれています。システムアプリケーションは / にあります。system ディレクトリ内に存在し、ユーザーが変更または削除することはできません。 Android 電話を購入する際には、内蔵アプリ(電話、メッセージングなど)も考慮することが良いです。ユーザーアプリケーションは /data ディレクトリ内に存在し、ユーザーが変更または編集できる。各アプリケーション サンドボックス (Sandbox)インストールされており、個別に影響を与えたりデータを通信させることはできません。アクセスできるのは、各アプリケーションの権限を持つリソースだけで、KakaoTalkやNaverなどの一般的なアプリケーションはユーザーアプリケーションです。アプリを使用して、アプリに権限を付与することはすべてサンドボックスに関連していると考えることができます。


※ サンドボックスについてもう少し説明すると、 それは、孤立した空間であり、入ってはいけないエリアです。 各アプリケーション 別のスペースそこに走って、サンドボックスに入るのは当然のことです。 また、他のアプリケーションにも影響を与えません。 ユーザーアプリは通常のユーザープライバシーで実行されますが、システムアプリは管理者権限でのみ無効にしたり変更できます。同様に、サンドボックスで保護されているものも管理者権限でバイパスできますが、このサンドボックス保護が破られると、 Android モバイル電話を使用しているなら、おそらく「ルーティング」という言葉を聞いたことがあるでしょう。ルーティングを実行すると、一般ユーザーでも管理者権限を持って操作できるようになります。 Linuxで setuid, setgidこれはプログラムの所有者を変更するもので、プロセスの権限を変更すると同様に所有者が変更されます。 Linux ルーティングはカーネルのセキュリティを危険にさらすと言えるでしょう。Linuxで sudo すでに su コマンドを使用したことがあるかもしれません。 switch userです)。


サンドボックスとルーティングについて詳しく説明するために、次の章に進みましょう。

すべてのセキュリティ機能と同様に、アプリケーションサンドボックスは危険にさらされません。ただし、適切に設定されたデバイスでサンドボックスから脱出するには、Linuxカーネルのセキュリティが危険にさらされる必要があります。

Google

Linux に基づいて Androidまた、 root 許可により、すべての操作を実行できます 最高のユーザーレベル中心的なユーティリティはわずか数種類です。 root 特権で実行できますが、 Androidで Rooting(ルート化すると、すべての実行中のアプリが root 許可を得て使用することができます。実際、製造元は私たちが購入している電話の所有者と見なすことができます。私たちは物理的に所有していますが、だからこそ root 特権ではありませんが、このルーティングを行う理由はユーザーごとに異なります。 それはデバイスを完全に制御するためです。 それは、より美しいテーマで携帯電話をデコレーションするため、ルーティングを通じてのみインストールできる特別なアプリを使用するため、または開発者やセキュリティに関する研究や作業のためである可能性があります。 欠点それはまた存在します デバイスのセキュリティが侵害され、悪意のあるアプリケーションに対して脆弱になっていますサンドボックスで保護されるべき連絡先、メッセージ、およびその他のデータ 他のアプリが侵入して追加されました アクション(情報の抽出など)また、デバイスが損傷している場合にもこの操作を行うことができます。 利用できなくなった場合、または保証が無効になった場合修理することはできないかもしれません。


※ iPhoneでは最初からルートユーザーの権限を使用しています。iPhoneは実際にはLinuxに基づいています。同様に、他のアプリがサンドボックスに侵入するのを防ぐように設定されていますが、iPhoneのルーティングはjailbreaking(Jail Breaking)と呼ばれています。しかし、なぜiPhoneはより安全だと言われているのでしょうか。それはアプリの署名にあるからです。AndroidでもiPhoneでも、開発されたアプリに署名を残すコード署名というものがあり、証明書を通じて の信頼関係が確立されます。しかし、Android開発者は署名できますが、iPhoneの場合、AppleはApp Storeでそれを独自に行っていますので、認証されていないアプリは使用できません。それがより安全だと言われる理由です。 AndroidWeb上には多くのapkファイルがありますが、iPhoneにはそれがありません。それが理由です。


3-1. アプリケーションコンポーネント (Activity, Service, Broadcast Receiver, Content Provider)

アプリケーションコンポーネント(App Components)は Android アプリケーションの重要なコンポーネントは、それぞれ特定の役割を果たす別々の形態で存在します。全体で4つのコンポーネントがあり、これらがシステムやユーザーがアプリにアクセスする方法を決定します。 エントリーポイントまず第一に Activity(アクティビティ)あります。アクティビティは、ユーザーと直接やり取りするエントリポイントです。 ユーザーインターフェースUI)ただ、それについて考える必要があるだけです。 Service(サービス)バックグラウンドでアプリを継続して実行するための多用途なエントリポイントです。ここでは、バックグラウンド (Background)これは、アプリを実行する必要がなくても発生する一連のプロセスを指します。たとえば、音楽を再生する、時間を過ごす、大容量のファイルをダウンロードまたはコピーする、ネットワーク上で通信するなどです。つまり、 Windowsキーボードまたはマウス入力でプログラムを制御することは、前景にあります。Foreground)彼は言う Androidアプリでは、画面を直接タッチして拡大したり、操作することができます 前景は予想通りです。一方、背景は直接制御を受けずに独立して動作できるようになっています。アプリが実行されていないときでも動作します。したがって、背景はユーザーインターフェイスを提供しません。


※ この前景/背景の概念はすべてのオペレーティングシステムに適用されます。


Broadcast Receiver(放送受信機)システムが定期的に発生するイベントをアプリに提供できるようにするコンポーネントです。 ユーザーフローFlow - 非同期データストリーム、すなわち、継続的にデータを送受信する形式 特定のアプリを使用してデータを送受信し続けていても、ほとんどのブロードキャストは、画面がオフになったとき、バッテリーが低下したとき、写真が撮影されたときなど、システムによって起動されます。一般的なユーザーアプリでもブロードキャストが生成されます。を通じて ステータスバーに通知を表示するなどの作業を実行できます。


ブロードキャスト受信コンポーネントのBoot Complete(起動完了)は、Windowsの起動プログラムと似ています。この起動完了にマルウェアを登録すると、電話がオフになっても稼働し続けることができます。


最後に Content Provider(コンテンツプロバイダー)ファイルシステムです SQLiteこれは、データ永続ストア内の共有アプリデータの一連を管理します。共有アプリデータの一連とは、Web ベースのアプリや汎用アプリからアクセスできるものを意味します。たとえば、コンテンツプロバイダーはユーザーの連絡先情報を管理し、他のアプリに提供することができます。を通じて, 一般ユーザー向けアプリケーションも、連絡先情報を通じて別の機能を提供することができます。


※ コンポーネント内 Intent知っておくのは良いことでしょう。 Intentは、複数のアプリ間や同じアプリ内で通信する際に、他のアプリコンポーネントから特定のアクションを要求するために使用できるメッセージングオブジェクトです。 Intentアプリを作成すると、Activity コンポーネントを使用して画面を表示したり、Service コンポーネントを使用してバックグラウンドで動作させたり、Broadcast Receiver コンポーネントを使用して通知を配信したり、Content Provider コンポーネントを使用してコンテンツを提供したりできます。を通じて そこで、サーバに共有データを取得するように指示するメッセージを送信します。 Intentです。



III. ネットワーキングについて学んだことを簡単にまとめます

この部分だけです TIPただそれだけを知っておけば大丈夫です。通信ネットワークは全国規模で構築され、通信会社がリースしています。匿名性を保つため、つまりプライバシーを確保するためには、通常のネットワーク化プロセスを回避することが可能です。 Proxy, VPN, SNI 多くあります。通常、信号は、ソースから宛先までいくつかのルーターを経由して伝達されます(軍事から生まれた技術です)。 Proxyこれは一種の中継役として機能し、私の代わりに共通のネットワーク処理を実行します。 Source IPが Proxy入って来て。 Proxy通常、サービスを提供するサーバーの外に配置されています。 VPN(Virtual Private Network)それは私から始まった。まるで外に仮想コンピュータが存在するかのように。しかしこの仮想コンピュータはを通じて 目的地に向かっています。つまり、私は仮想マシンによって隠されています。複数の VPN ある会社があり、この会社を通じて VPNもし使用する場合 Source IPこれがこの企業の仮想マシンとなります。 SNI(Server Name Indication)は ISP(Internet Service Provider) は、企業がHostから情報をフィルタリングし、有害なサイトへのアクセスをブロックする手法です。韓国ではSKT, KT, LGに相当するISP企業が存在し、これは私たちのネットワーク履歴が一定の範囲で監視されていることを意味します。通常のユーザーが政府が指定した有害なサイトに、HTTP(ポート80)またはHTTPS(暗号化されたポート443)を介してアクセスしようとすると、アクセスがブロックされ、返されます。つまり、ルーターを通じて通常のネットワーク処理が行われる前に、監視されてブロックされます。Source IPの場合、それは私自身です。


※有害なサイトにアクセスしないでください(または…)。



レビュー

今日は、基本トレーニングの最終週が始まりました。モバイルの基礎から始めるのは楽しいですが、教材の量が増えていくのが心配です。明日は、実践的な授業がいくつかあり、追いつけないかと心配ですが、その一方で、とても楽しみです😁