ここから本文です

この知恵ノートを「知恵コレクション」に追加しました。

追加した知恵ノートはMy知恵袋の「知恵コレクション」ページで確認できます。

知恵コレクション」に登録済みです。

再登録しました。

追加に失敗しました。

ノートに戻り、もう一度やり直してください。

すでに1,000件のノートが登録されています。

新しく追加したい場合は、My知恵袋の「知恵コレクション」ページで登録されているノートを削除してください。

追加できませんでした。

ノートは削除されました。

AndroidのOS本体をビルドしてみよう

ライターさん(最終更新日時:2014/1/14)投稿日:

  • ナイス!:

    3

  • 閲覧数:18335

印刷用のページを表示する

はじめに

Androidのソースファイル

Androidのソースファイルは、Android Open Source Project(通称AOSP)というプロジェクトで管理されており、ソースファイルは一般に公開されていて自由に入手することができます。端末メーカーは、基本的にここで公開されているソースコードに独自の機能などを加え、端末に実装して発売しています。


Androidのライセンス

Androidのライセンス条件は少々複雑です。土台にあたるOSのカーネル部分はLinuxを使用しています。Linuxはよく知られている通りGPLGeneral Public License)およびその系統のライセンスに基いて公開されているため、改変した部分のソースコードの公開も求められます。しかし、Androidフレームワークから上に当たる部分は、Apache License 2.0ライセンスとなっていて、この部分については改変を加えても公開の義務はありません。このようにAndroidのソースファイルを扱う場合は、ライセンス条件に注意を払う必要があります。


自分でAndroidソースファイルをビルドしてみる

これらのソースファイルは、個人でも比較的簡単な操作で入手することができます。その気になれば、自分でビルドしたシステムをお手持ちのスマートフォンに書き込んで稼働させることも可能です(もちろん、メーカー保証外になりますが・・・)。ここではその触りとして、入手したソースファイルを特に複雑な手順を踏むことなく普通にビルドして、Android仮想デバイス上で動作させることができるまでの手順を紹介します。


開発環境を整える

開発機のディストリビューション

Androidのソースファイルをビルドするには、デスクトップLinux環境が必要です。基本的にどのディストリビューションでもビルドは可能と思われますが、AOSPでは特にUbuntuを用いることを推奨しています。そこで、直近の長期サポートバージョンであるUbuntu 12.04 LTS(LTSは長期サポートバージョンの意味)の64bit版をクリーンインストールし、その状態からAndroidのソースファイルをビルドできる環境を作ってみます。


なお、このノートにおける作業は、keichahrsというユーザー名で行っています。実は、最初は投稿しているIDと同じくkeicha_hrsというユーザー名で作業をしたのですが、アンダーバーが入ったユーザー名ではAOSPに含まれるツールの動作に一部不都合があることが発覚したため、アンダーバーなしのユーザー名に改めて実証作業をしています。


環境としては、基本的なインストールを完了し、アップデートパッケージが全て適用された状態であることを前提とします。


JDKのインストール

AOSPでは、Oracleが提供するJDK 6でなければ受け付けないように設定されています。しかし、JDK 6はすでに更新終了されており、現在ではアーカイブサイトでのみ配布されています。ここからダウンロードを行うには、Oracleのユーザーアカウントを作成してサインインする必要があります。 

18.png


アカウント作成自体は無償なので、個人情報入力に抵抗がなければ作成してLinux版のJDK 6をダウンロードすれば良いのですが、ここではLinuxで利用可能なJavaのオープンソース実装であるOpenJDKを利用することにします。次のコマンドで、Java SE 6に相当するOpenJDK 6をインストールします。


$ sudo apt-get install openjdk-6-jdk java-common


java-commonパッケージは、システムで利用するJavaを切り替えるためのコマンドであるupdate-java-alternativesがインストールされます。環境によっては導入済みかもしれませんが、そうでなければここでインストールしておきましょう。


必要パッケージのインストール

AOSPをビルドするためには、様々な追加パッケージのインストールが必要です。私が確認している範囲で、まっさらな環境のUbuntuに追加する必要のあるパッケージを、次のようなコマンドで導入します。


$ sudo apt-get install build-essential gcc-multilib g++-multilib ia32-libs git flex bison gperf curl zlib1g-dev lib32ncurses5-dev x11proto-core-dev libx11-dev libxml2-utils lib32readline-gplv2-dev mingw32 tofrodos python-markdown uuid-dev libgl1-mesa-dev xsltproc lib32z1-dev


なお、すでに運用中のUbuntuに導入する場合、インストール済みのパッケージもあるかもしれませんが、それを重複指定しても特に弊害はありません。ただし、パッケージの依存関係の設定の問題で、一度特定のパッケージをアンインストールしてからでないと追加できないパッケージが存在する可能性はあります。


Gitとrepoの準備

Androidのソースファイルの管理には、Git(ギットと読む)というバージョン管理システムが用いられています。GitはLinuxの創始者であるリーナス・トーバルズ氏が開発したもので、Linuxのソースファイル管理にも使用されており、近年利用が広まっています。ですから、Androidのソースファイルを取得するのにもGitクライアントを使用するわけですが、Gitのコマンドそのものを使用するのではなく、Androidのソースファイルを取得するのに特化したrepoというスクリプトを使用します。repoのファイルを取得し、実行権限を与えてPATHが通っている場所に移動させるために、次のように操作します。


$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > repo

$ chmod a+x repo

$ sudo mv repo /usr/local/bin/


注意

  • (2014/01/14追記)
  • repoの入手先が以前と変化したため、上記のURLも修正しています。今後も突然変化する可能性もあるので、注意が必要です。


また、Gitリポジトリにアクセスする場合、その利用者となるユーザー名とメールアドレスを求められます。次のようなコマンドで、予めそれらを設定しておくことができます。


$ git config --global user.email "<メールアドレス>"

$ git config --global user.name "<名前>"


リポジトリにファイルをコミット(改変したファイルをリポジトリに反映させること)する場合にはこれらの情報が用いられるわけですが、今回はファイルを取得するだけなので、これらのメールアドレスや名前が外部に流出することはありません。


シンボリックリンクの作成

エミュレーター向けビルドをするときに、OpenGLという3DアクセラレーションAPIのライブラリを参照するため、それがエラーにならないようにシンボリックリンクを作成します。


$ sudo ln -s libGL.so.1 /usr/lib/i386-linux-gnu/mesa/libGL.so

$ sudo ln -s mesa/libGL.so /usr/lib/i386-linux-gnu/libGL.so


ファイルの取得

Androidリポジトリのブランチ

バージョン管理システムでは、プロジェクトの本線のことをトランク、トランクから分岐させたものをブランチと呼んでいます。Androidのように複数のバージョンの開発を並行しているプロジェクトの場合は、バージョンごとにブランチを作成して管理しています。このブランチを指定することで、任意のバージョンのソースファイルを得ることができます。AndroidのGitリポジトリでどのようなブランチがあるかは、次のサイトで閲覧することができます。


https://android.googlesource.com/platform/manifest/ 

3.png


ここで、Branchesの下にあるMore...というリンクをクリックすることで、詳細を確認することができます。下図はその一部です。 

4.png


同じバージョンの中でも、細かくリビジョンが管理されていることがわかります。


ソースファイルの取得

それでは、いよいよAndroidのソースファイルを取得しましょう。ここでは、ホームディレクトリーの下にaospというディレクトリーを作成し、そこで作業をすることとします。


$ cd

$ mkdir aosp

$ cd aosp


次に、repoコマンドでファイルの取得を開始します。ここでは、このノート作成時点での最新版のブランチであるandroid-4.2.2_r1.2bを取得してみます。


$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.2.2_r1.2b


initは初期化を、-uは取得するリポジトリのマニフェストファイルのURLを、-bはブランチの指定を意味します。一つのAndroidシステムのファイルは多くのプロジェクトの集合体となっており、マニフェストファイルにはそれらのパスなどが記されています。このコマンドを初めて実行したとき、下図のような問い合わせが表示されます。これは、端末が色分けに対応しているかの確認なので、yを入力しておきましょう。なお、Your identity isの行には、先ほど設定した名前とメールアドレスが表示されているはずです。 

5.png


続いて、次のコマンドを実行します。


$ repo sync


Gitでは、リポジトリのクローンをローカルPCにダウンロードする仕組みである点が特徴です。syncとは、本家のリポジトリと同期させることを意味しています。そのため、単にソースファイル一式をダウンロードするだけではないため、大変時間がかかります。インターネット環境にもよりますが、1時間程度では終わらないものと考えた方が良いでしょう。下図のように、Syncing work treeという表示が100%になっていれば、完全に同期が完了したことを意味します。 

6.png

 

注意

  • 所詮、無償公開のサーバーのため予告なく止まることもあるようで、一向にダウンロードが進まなかったり、エラー終了してしまうこともあります。そのようなときは、あきらめて日を改めるくらいの気持ちは必要です。


ビルド

CCACHEの利用

AOSPでは、コンパイルしたオブジェクトをキャッシュするCCACHEというツールがサポートされています。これを利用することで、違った構成のビルドをするときに重複するソースのオブジェクトをキャッシュから取り出すことができ、ビルド時間を大幅に短縮することができます。CCACHEを利用するには、まずキャッシュ用のディレクトリーを用意します。例えば、ホームディレクトリー直下に、


$ mkdir ~/.ccache


のように作ったとしましょう(.cacheという既存ディレクトリーがあるので、混同しないようにしましょう)。そして、次のような環境変数を設定します。


$ export USE_CCACHE=1

$ export CCACHE_DIR=~/.ccache


次に、キャッシュ領域のサイズを設定します。そのためのコマンドccacheは、取得したファイルの中にあります。


$ cd aosp

$ prebuilts/misc/linux-x86/ccache/ccache -M 50G


-Mオプションは、キャッシュ領域として使用するディスクサイズの指定です。この場合は50GBを指定したことになります。ハードディスク残量と相談になりますが、少なくとも10GB以上でなければ、あまり効果はないでしょう。


$ prebuilts/misc/linux-x86/ccache/ccache -s


とすることで、キャッシュの利用状況を確認することができます。また、


$ prebuilts/misc/linux-x86/ccache/ccache -c


で、キャッシュをすべて破棄することもできます。


これで準備完了です。以後は、USE_CCACHEとCCACHE_DIRの環境変数設定をすればCCACHEを機能させることができます。


OpenJDK 6でビルドできるように細工

AOSPのビルド開始時には、OracleのJDK6が利用可能な状態であるかをチェックされます。しかし、ここではOpenJDK 6を利用するのでそのチェックを回避しなくてはなりません。この処理を行っているファイルをエディターで編集します。


$ gedit build/core/main.mk


ブランチによって異なりますが、序盤(取得したブランチであれば125行目から)に下図のような記述があり、ここでJavaのバージョンをチェックしています。「Check for the correct」くらいまでで検索すればヒットするでしょう。  

19.png

OracleのJDK 6と判定されなかった場合は、上図の2箇所にある

$(error stop)

という記述によってビルドをエラー終了させるようになっています。この行を、

$(error stop)

とコメントアウトして無効化することで、チェックを回避します。編集したら保存しましょう。

環境変数の設定

ファイルの取得が完了したら、ビルドに移ります。ビルドに先立って、OpenJDK 6を利用可能にしておきます。まず、先に導入したupdate-java-alternativesコマンドで、現在システムに導入されているOpenJDKを調べてみます。


$ update-java-alternatives -l

java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64

java-1.7.0-openjdk-amd64 1051 /usr/lib/jvm/java-1.7.0-openjdk-amd64


これは私の環境の例ですが、OpenJDK 6とOpenJDK 7がリストに登録されています。ここで、OpenJDK 6に切り替えるには、


$ sudo update-java-alternatives -s java-1.6.0-openjdk-amd64


のように、-sオプションで使用するJavaを選択します。これでOpenJDK 6が利用可能になります。


続いて、ダウンロードしたファイルのうち、buildディレクトリーの下にあるenvsetup.shというファイルの内容をsourceコマンドで取り込みます。


$ source build/envsetup.sh


拡張子がshとなっていますが、これは実行用シェルスクリプトではなく、現在の端末のプロセスに環境変数の設定を反映させるためのものです。


ビルド構成の設定

次にビルド構成の設定をします。まず、次のコマンドを入力します。


$ lunch


というコマンドを実行すると、次のような画面が表示されます。 

7.png


これは、ビルド構成をピックアップされた中から選択するメニューです。ビルド構成はハイフンで区切られた2つのキーワードの組み合わせで成り立っており、前は製品種別、後ろはビルドの構成の方法を示しています。


製品種別は、構成方法とターゲットプロセッサまたはターゲットボードで表されています。fullというのは汎用的な構成、vboxは仮想化ソフトウェアのVirtualBoxのゲストOSとしての構成といった感じです。アンダーバーで区切られた後ろのx86、mips、armv7aなどはターゲットのCPUを、mako、maguro、toroなどは汎用のCPUボードを表しています。ちなみに、maguro、tuna、toroはGaraxy Nexus用の構成のコードネームです。エミュレーター用の構成はgoldfish(金魚)となっており、魚に纏わる名前をコードネームにする習慣があるようです。


末尾はこのリストには2種類しかありませんが、user、userdebug、eng、testsの4種類から選択できるようになっています。userは製品版ビルドで、testsに向かうに従って開発やデバッグのための様々な機能が加わった状態でビルドされることになります。


lunchコマンドでは、これらのキーワードを組み合わせて、


$ lunch full_x86-userdebug


といった先ほどのリストに存在しない組み合わせを、引数として直接していすることもできます。


ここでは、full_x86-engの構成でビルドすることとしましょう。先ほどのリストから2番を選択します。すると、下図のようにビルドで使用するための環境変数の設定値一覧が表示されます。 

8.png


ビルドの実行

これでビルドの準備が整ったので、ビルドを開始します。


$ make -j4


のようにコマンドを入力することでビルドが始まります。-j4というのは4つのスレッドで並列ビルドすることを表しています。概ね、CPU数に合わせるのが良いとされます。この作業も大変時間がかかります。筆者のCore i7-3770(4コア+HT、3.4GHz)メモリ8GBのPCで-j8でビルドをして、45分ほどかかりました。


並列ビルドは時間短縮ができる一方で、あるスレッドでエラーが発生した場合に他のスレッドの完了を待ってから終了するため、プロンプト状態に戻ったときの画面の状態で正常終了したか判断しづらくなっています。


この作業で最終的に生成されるファイルは、ramdisk.img、system.img、userdata.imgという3つです。下図を参考にこれらが生成されているかを確認してみましょう。(out/target/product/generic_x86の下)

9.png


 動かしてみよう

まずはLinux上で動かす

3つのimgファイルが正常に作られていることが確認できたら、とりあえず動かしてみましょう。ビルドが完了した状態から端末を閉じずに次のコマンドを実行します。


$ emulator


すると、たった今ビルドしたimgファイルを使ってエミュレーターが立ち上がります。 

10.png


スキンの指定など何もしていないので画面も小さく、また右側のパネルがAndroid SDK r20以前の旧型になっています。先ほど実行したemulatorコマンドも、今回のビルド作業でコンパイルされたものです。そのソースファイルにおいては、パネルはまだ旧型のままということです。


メニューのsettingからAbout phoneを選択してBuild numberを見てみると、 選択したビルド構成であるfull_x86-engと、ビルドしたユーザーであるkeichahrsの文字が確認できます。

11.png


Windows上で動かす

次に、先ほどの3つのファイルを何かしらのメディアにコピーし、Android開発環境が構築してあるWindows PCに移します。ここで、このビルドしたイメージを動かしてみたいと思います。


まずは、Windows側のSDKマネージャーで、Android 4.2.2のIntel x86 Atom System Imageをインストールしてある状態にしてください。

16.png


すると、SDKのインストールフォルダーの下に、system-images\android-17\x86というフォルダーが存在していて、その中に3つのimgファイルがあるはずです。この3つのimgファイルをどこかに退避しておき、替わりにLinuxでビルドした3つのimgファイルを置きます。


そして、仮想デバイスマネージャーでターゲットをAndroid 4.2.2、CPU/ABIをx86に設定した仮想デバイスを作成します。 

17.png


これを実行し、About phoneでステータスを見てみると、先ほどと同じようにユーザーkeichahrsによって作成されたイメージであることが確認できるでしょう。 

12.png


これで、今回目標としていた作業は完了です(Windows側でコピーしたimgファイルは、退避させておいたオリジナルに戻しておきましょう)。


終わりに

今回は入手したソースファイルをそのままビルドしただけなので、何かしら変わったことは何もありません。しかし、「自分でビルド」することができるようになったことで、様々な可能性が生まれます。これを足がかりに、Androidのソースファイル構成を学び、Androidそのものの構成をカスタマイズできるようになれば、Androidの世界はさらに広がることでしょう。


改版履歴

(2013/06/17)初版

(2013/06/18)本題から離れすぎているため下準備節除去、同期完了の画像追加

(2014/01/14)repoの入手先変更、OpenJDK 6利用に修正、初歩的な説明を除去


このノートに関するQ&A

このノートに関するQ&Aは、まだありません。

このノートについて質問する

このノートについてライターの方に質問できます。

※ライターの方から必ず回答をいただけるとは限りません

※別ウィンドウで開きます

この知恵ノートのライター

アップロード写真

グレード知恵ノートのグレード:3-3

カテゴリマスター

keicha_hrsさん

ピックアップ

【iPhone】修理交換の申込方法...
 ※追記※2015/1/30現在iPhone6及び6+が発売されたのを受け、情...
お尻や足の贅肉にさよなら、「...
本にできない「正しい」下半身ダイエットなぜ「本にできない...
耳鼻科の先生に聞いた、しゃっ...
  皆さん、しゃっくりってわずらわしいですよね  ある時急に...
本文はここまでです このページの先頭へ