この記事では、プログラミング言語Javaとオペレーティング システムAndroidのアプリケーション プログラミング インターフェース(API) と仮想マシン(VM) を比較します。
ほとんどの Android アプリケーションは Java のような言語で記述されていますが、Java API と Android API にはいくつかの違いがあり、Android は従来のJava 仮想マシン(JVM)でJava バイトコードを実行しません。代わりに、古いバージョンの Android ではDalvik仮想マシン、新しいバージョンではAndroid ランタイム(ART) によって実行され、Dalvik が実行するのと同じコードを、マシン コードを含む実行可能およびリンク可能形式(ELF) 実行ファイルにコンパイルします。
Java アーカイブ ( JAR ) ファイル内の Java バイトコードは、Android デバイスでは実行されません。代わりに、Java クラスは Android バイトコード (dex バイトコード) 形式にコンパイルされ、Android 用に設計された特殊な仮想マシン (VM) であるDalvik (または新しい ART でコンパイルされたバージョン) で実行されます。スタック マシン(スタック ベースのアーキテクチャ)である Java VM とは異なり、Dalvik VM はレジスタ マシン(レジスタ ベースのアーキテクチャ) です。
Dalvikには他の標準的なVMとは異なる特徴がいくつかあります。[1]
- VM はより少ないスペースを使用するように設計されています。
- インタープリタを簡素化するために、定数プールは32 ビットのインデックスのみを使用するように変更されました。
- 標準の Java バイトコードは 8 ビット スタック命令を実行します。ローカル変数は、別の命令によってオペランド スタックにコピーするか、オペランド スタックからコピーする必要があります。代わりに、Dalvik はローカル変数に直接作用する独自の 16 ビット命令セットを使用します。ローカル変数は通常、4 ビットの仮想レジスタフィールドによって選択されます。
Dalvik仮想マシンによってロードされるバイトコードはJavaバイトコードではなく、Dalvikがクラスをロードする方法のため、ライブラリパッケージをjarファイルとしてロードすることはできません。Androidライブラリをロードするには、別の手順を使用する必要があります。この手順では、基礎となるファイルの内容を、dexロードする前にアプリケーションのプライベート内部ストレージ領域にコピーする必要があります。[2]
システムプロパティ
Java SEクラスの場合と同様にSystem、AndroidSystemクラスではシステム プロパティを取得できます。ただし、Java 仮想マシンで定義された一部の必須プロパティは、Android では意味を持たないか、異なる意味を持ちます。例:
java.versionこのプロパティは Android では使用されていないため 0 を返します。java.specification.version使用されている Android のバージョンに関係なく、常に 0.9 を返します。java.class.version使用されている Android のバージョンに関係なく、常に 50 を返します。user.dirAndroidでは意味が異なります。user.homeAndroid にはプロパティuser.nameが存在しません。
クラスライブラリ
Androidの現在のバージョンでは、古いバージョンで使用されていたApache Harmony Java実装ではなく、最新のJava言語とそのライブラリ(完全なグラフィカルユーザーインターフェース(GUI)フレームワークではない)が使用されています。最新バージョンのAndroidで動作するJava 8ソースコードは、古いバージョンのAndroidでも動作するようにすることができます。[3]
java.lang パッケージ
デフォルトでは、デフォルトの出力ストリームSystem.outはSystem.err何も出力しません。[4]Log開発者はLogCatツールで文字列を記録するクラスを使用することが推奨されています。 [5]これは少なくともHoneyCombから変更されており、ログコンソールにも出力されるようになりました。
グラフィックスとウィジェットライブラリ
Android は、 Abstract Window ToolkitもSwingライブラリも使用しません。ユーザー インターフェースはView オブジェクトを使用して構築されます。Android は、Viewではなく に基づく、Swing に似たフレームワークを使用します。ただし、Android ウィジェットはJavaBeansJComponentではありません。ウィジェットの作成時に、Android アプリケーションをウィジェットに提供する必要があります。
Context
見た目と感触
Androidウィジェットライブラリは、プラグ可能なルックアンドフィールアーキテクチャをサポートしていません。Androidウィジェットのルックアンドフィールはウィジェットに埋め込まれている必要があります。ただし、アプリケーションのスタイルとテーマを設定する機能は限られています。[6]
レイアウトマネージャー
レイアウトマネージャを任意のコンテナウィジェットに適用できるSwingとは異なり、Androidのレイアウト動作はコンテナ内にエンコードされます。[7]
java.beans パッケージ
Android には、パッケージの小さなサブセットjava.beans(PropertyChangeEventおよび関連クラス) のみが含まれています。
参照
参考文献
- ^ Rose, John (2008-05-31). 「Android と Dalvik について Google I/O で」。2008-06-04 時点のオリジナルよりアーカイブ。2008-06-08に閲覧。
- ^ Fred Chung (2011-07-28). 「Dalvik でのカスタムクラスの読み込み」。Google 。2014-02-18にオリジナルからアーカイブ。2011-11-27に取得。
- ^ 「Java 8 言語機能と API を使用する」。Android Developers 。2021 年 1 月 23 日閲覧。
- ^ 「Android Debug Bridge」。Google 。 2009年5月31日閲覧。
デフォルトでは、Androidシステムはstdoutとstderr(System.outとSystem.err)出力を/dev/nullに送信します。
- ^ 「ログの読み取りと書き込み」。Google。2011年11月22日時点のオリジナルよりアーカイブ。2011年11月27日閲覧。
- ^ 「スタイルとテーマの適用」。Google。2014年3月28日時点のオリジナルよりアーカイブ。2011年9月3日閲覧。
- ^ 「Common Layout Objects」。Google 。2011年 9 月 3 日閲覧。
