AndroidをPCでブートさせる手順書の検証2009年06月30日 03時34分42秒

lenovoでのAndroid起動後画面とブートに使用したものと同じタイプのMicroSD+リーダ

AndroidはLinuxカーネルベースのJavaプラットフォームなので、当然、X86なPCで動作させることは可能です。

ネットを検索するといくつか手順書が見つけられるのですが、そのままの手順でうまくいくとは限りません。 なぜ、うまくいかないのかというとその説明を書いた人間の環境依存、ソースコードなどの更新により状況が変化したことにより不整合が発生するのでしょう。 

したがって、手順を整理する時には以下の情報は必要です。

  • 日付
  • 開発環境の記述

さて、いくつか見つけられる手順書を試してみましょう。

ちなみに、私が試すのは以前の記事で構築したubuntu Linux 9.04の環境です。日付はこの記事の投稿の日付と考えてもそう間違ってはいません。 

日本Androidの会の手順書

日本での本家本元のような感じの手順書はこちらです。 きちんとpdfファイルにまとめてありますので、正しければいいドキュメントと言えます。

しかし、結論から先に言うと、この手順書ではビルドが正常完了しません。正常完了しない報告はこちらなどが一つの例です。

残念なことに、このドキュメントには日付がありません。

なお、環境変数を設定する部分で以下のようJAVAのバージョンに依存したディレクトリ名を指定している部分があります。

$ echo 'export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.07' >>/etc/bash.bashrc

これは当該ディレクトリの同列の階層を見れば分かるのですがシンボリックリンクが存在します。これによりバージョンに依存しない名前を指定できますので、以下のように、シンボリックリンクの方の名前を使うべきでしょう。

$ echo 'export JAVA_HOME=/usr/lib/jvm/java-6-sun' >>/etc/bash.bashrc

実際、私の環境ではバージョンが異なるため、ディレクトリ名も異なっています。

それでは手順について順次確認してみましょう。

手順どおりに進めて最初にエラーとなるのは以下です。

build/target/board/Android.mk:35: *** Please rename "vendor/asus/eee_701/Android.mk" to "vendor/asus/eee_701/AndroidBoard.mk".  中止.

これはメッセージのとおり、ファイル名の変更を行えばOKです。

次のエラーは以下。

make: *** `out/target/product/eee_701/system/etc/permissions/com.google.android.maps.xml' に必要なターゲット `vendor/google/frameworks/maps/com.google.android.maps.xml' を make するルールがありません.  中止.
make: *** 未完了のジョブを待っています....

これに関しては、「vendor/asus/eee_701/eee_701.mk」ファイル中の"generic_with_google.mk"という文字列を"generic.mk"に変更することで対応可能。これについてはこちらを参考にしています。

次にエラーとなるのは、ビルド済みのファイルをコピーする部分です。

Copying installer base files...
Copy: out/target/product/eee_701/obj/lib/libdiskconfig.so -> out/target/product/eee_701/installer/root/system/lib/libdiskconfig.so
Copy:  -> 
dirname: オペランドがありません
詳しくは `dirname --help' を実行して下さい。
mkdir: オペランドがありません
詳しくは `mkdir --help' を実行して下さい。
cp: ファイルオペランドがありません
詳しくは `cp --help' を実行して下さい。

この部分の処理をしているファイルは「bootable/diskinstaller/config.mk」です。コピー元とコピー先の指定が空白文字列になっているための不具合です。このmakeファイルに問題があるのではなく、何らかの前提条件に問題があるのでしょう。

この問題の対策は「external/e2fsprogs/Android.mk」の2行目の#によるコメントアウトをとって"include $(call all-subdir-makefiles)"の部分を有効にします。

ITproの手順書

ミラクルリナックスの方がまとめておられる手順書はこちらになります。

この手順書と最初に紹介した日本Androidの会の手順書の大きな違いはブートイメージの扱いです。前者はインストーラのイメージをUSBメモリにddコマンドで物理的に書いた後、そのUSBメモリで起動するのは「インストーラ」だということです。一度インストーラを起動させてEeePCの内蔵SSDにAndroidをインストールすることを目的に書かれています。

これに対してITProの手順書ではUSBメモリへのパーティション作成、ブートローダ(GRUB)の設定、ファイルのコピー、init.rcの作成などについて手動で行うという手順で、USBメモリからブートさせることを目的としています。私個人としてもこちらの方が望ましいと思います。

こちらの手順書の内容にも日本Androidの会の手順書と同様に以下の部分の修正は必要です。

  • vendor/asus/eee_701/AndroidBoard.mkへのファイル名変更
  • vendor/asus/eee_701/eee_701.mkの修正
  • external/e2fsprogs/Android.mkの修正

なお、カーネルの環境構築の「make menuconfig」での指定について一部誤りがあります。

Device Drivers --->

[*]  Networking support --->
  Device Drivers --->

再び日本Androidの会の手順書

再び日本Androidの会のこちらの情報がほぼ総合的に使用できるでしょう。以下の点は指摘されていません。

  • external/e2fsprogs/Android.mkの修正

その他、私が指摘した誤りも参考に。

ITProの手順書では述べられていないパッチについても書かれています。なお、上記ではパッチの当て方について書かれていないので、以下に追記しておきます。patchファイルはログインユーザのホームディレクトリにあるものとします。<buildbase>は「repo sync」させたディレクトリです。

$ cd <buildbase>/frameworks/base
$ patch -p1 < frameworks_v2.patch
$ cd <buildbase>/vendor/asus/eee_701
$ patch -p1 < boot_able_img_v2.patch

HDDの容量不足に注意

ビルドの終盤で以下のエラーが発生する場合があります。 これはubuntuのファイルシステムの空き容量が足りない場合に出ます。ソースコードとビルドにより生成されるバイナリファイルによって、約8GBを消費するからです。

E/diskutils( 8099): Error (28) while writing to 'out/target/product/eee_701/installer.img'
Could not write images after editing label.
make: *** [out/target/product/eee_701/installer.img] エラー 1
make: *** ファイル `out/target/product/eee_701/installer.img' を削除します