AndroidOS
Androidのアプリを作るのにOSを読む必要はありません!
しかし、Linuxベースであればどうなっているのか見たくなりました。
Sourceを読んでも得にどうしたって訳ではありませんので暇な方だけ見てください。
1.AndroidOSの構造
AndroidOSの構造は下図のようになっているようです。
AndroidNDK
apps<- JNI -> AndroidSDK
appsNative code Dalvik runtime Android app framework Standerd libraries Linux kernel + Android extensions H/W (携帯・PDA・・)
興味深かったのは、各ベンダーはLinux kernelやAndroid extensionsに手を加えるのではなくAndroidNDKやAndroidSDKを使って固有のH/Wにアクセスする事である。
こうなている理由は、こうしておく事でベンダーのSourceに触れる事なくAndroidOSのUpdateが簡単に実現できると言う事らしい。
そうなるとAndroidOSがサポートしていないH/Wはどうなるのかな?NDK使えば出来るのかな?
2.AndroidOSをパソコンで試す
Androidは実機で動かすとどんな物か、MIRACLE(日経)のダウンロードサイトにAndrioidのUSBブートイメージが有りましたので試す事にしました。
( http://www.miraclelinux.com/embedded/android_dl.html )
同サイトにはLinux等から”$ sudo dd if=android-usb.img of=/dev/sdb”を実行して書き込むように書かれていましたが面倒なので Image writer for windows のホームページからバイナリーZIPをダウンロードして使用する事にしました。
( https://launchpad.net/win32-image-writer )
ダウンロードした Image writer for windows のZIPファイルを解凍しドキュメントに従って実行します。
書き込み先にUSBメモリのドライブ名を設定してMIRACLEからダウンロードしたAndroidのIMGを書き込めば完了です。
※ パソコンのBIOS設定でUSBメモリからBOOT出来ない場合は起動できません。
3.AndroidOSビルドの準備
ITPro(http://itpro.nikkeibp.co.jp/article/COLUMN/20090219/325052/)を参考にしUbuntu10.10ーRemixを準備して試しました。
使用するディスク容量はUbuntuで3.5GB程度AndroidOSのSourceとアプリケーションに3GB程度で7.0GB程度は必要になります。
・必要なパッケージのインストール
ビルドには、”git-core”・”gnupg”・”sun-java6-jdk”・”flex”・”bison”・”gperf”
”libsdl-dev”・”libesd0-dev”・”libwxgtk2.6-dev”・”build-essential”・”zip”・”curl”
”libncurses5-dev”・”zlib1g-dev”・”valgrind”・”g++”が必要になります。
Ubuntuソフトウェアセンターの開発ツールからインストール可能ですが”sun-java6-jdk”は標準設定でインストール不能となっているのでUbuntuソフトウェアセンターの編集のソフトウェアソースから他のソフトウェアのタブを選び”Canonicalのパートナー”にチェックを入れて有効にする必要が有りました。
”Canonicalのパートナー”を有効にした後、端末から以下のコマンドで一度にインストールします。
$ sudo apt-get update
$ sudo apt-get -y install git-core gnupg sun-java6-jdk flex bison gperf
libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev
zlib1g-dev valgrind g++
・Androidプロジェクト管理ツールのインストール
AndroidOSのSource取得や管理は全てrepoから行うのでrepoをインストールします。
インストール先はどこでも問題ありませんがHOMEディレクトリにbinと言うディレクトリを作成して以下のようにコマンドでインストールしました。
$ mkdir bin
$ curl http://android.git.kernel.org/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
・環境変数の設定
repoやJava6を使う為、以下のように環境変数を設定しました。
以降ビルド等を行う時にも必要になりますのでこの環境変数は常に必要になります。
$ export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.22
$ export PATH=$PATH:~/bin
・AndroidOSのSource取得
Sourceのダウンロード先は任意でかまいませんがITProに従いcupcakeよ言うディレクトリをHOMEに作成してダウンロードしました。
$ mkdir cupcake
$ cd cupcake
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
$ repo sync
4.AndroidOSのビルド
ビルドの作業は全てSource取得で作成したディレクトリcuocakeで行います。
・プラットフォームの選択
プラットフォームの選択ではH/W固有に準備されたパッチをあてるような作業になり、x86ベース用には”asus/eee_701”しか無くx86なパソコンで使うには全てeee_701で良いようです。以下のように”~/cupcake/.repo/”に”local_manifest.xml”と言う名称で以下の内容にファイルを作成します。
<manifest>
<project name="platform/vendor/asus/eee_701" path="vendor/asus/eee_701"/>
</manifest>
他にはどんなベンダーが有るのか気になりましたので調べてみるとhttp://android.git.kernel.org/platform/vendor/に有りました。
日立とかシャープは見つかりません!どうなっているのかな?標準なのかな?
だとしたらHTCは特別なのかな?!
・プラットフォーム用の差分取得
作成したmanifestを使って差分を以下のようなコマンドでSyncします。
$ repo sync
・Android extensions のビルド
manifestに定義したターゲットをビルドするには以下のように環境変数が必要です。
$ export TARGET_ARCH=x86
$ export TARGET_PRODUCT=eee_701
$ export DISABLE_DEXPREOPT=true
以下のコマンドでビルドを実行します。
make installer_img
・Linux kernel のビルド
Linux kernel をビルドする前に何を組み込むかを以下のようにコマンドで行い、表示された質問に対して設定入力を行います。
$ cd kernel
$ make i386_defconfig
$ make menuconfig
設定が終了したらビルドします。
$ make
エラーが出なければビルドの終了です。
構造を読む為に行った作業なので端折りますが、インストールする場合には対象とするUSBメモリ等にパーテーションを作成しフォーマットしroot・system・kernelをコピーしてgrubをインストールします。
Sourceに編集を加えた場合には、”make clean”でビルドした内容を消去しAndroid extensionsのビルドから行えば良いと思います。ターゲットを変更する場合はプラットフォームの選択から行えば良いと思います。