Android のビルド

Android をビルドする手順は以下のとおりです。

環境を設定する

envsetup.sh スクリプトを使用して環境を初期化します。

source build/envsetup.sh

または

. build/envsetup.sh

関連コマンド(デバイス ターゲットを選択する際に使用する lunch、単体アプリ(リファレンス TV アプリなど)をビルドする際に使用する tapas など)の説明については、platform/build/envsetup.sh のスクリプトをご覧ください。

スクリプトの変更を取得するために、repo sync の後に毎回このコマンドを実行する必要があります。source.(ドット 1 つ)に置き換えることで、全体の文字数を減らすことができます。ドキュメントでは、短い形式のほうがよく使用されます。

envsetup.sh スクリプトは Android ソースコードの操作を可能にする複数のコマンド(この演習で使用したコマンドを含む)をインポートします。以下は、重要なコマンドの例です。

  • lunch - lunch product_name-build_variant は、product_name をビルドする製品として、build_variant をビルドするバリアントとして選択します。また、それらの選択を環境に保存して、後続の m などのコマンドの呼び出しで読み取れるようにします。
  • m - ツリーの最上部からビルドを実行します。 これは、サブディレクトリ内から make を実行できるため、有用です。TOP 環境変数を設定している場合は、その値が使用されます。設定していない場合は、現在のディレクトリからツリーの最上部を検索します。引数を指定せずに m を実行してソースコード ツリー全体をビルドするか、名前を指定して特定のターゲットをビルドできます。
  • mma - 現在のディレクトリ内のすべてのモジュールと依存関係をビルドします。
  • mmma - 指定されたディレクトリ内のすべてのモジュールと依存関係をビルドします。
  • croot - cd を実行してツリーの最上部に移動します。

使用可能なコマンドの全リストを表示するには、次のコマンドを実行します。

hmm

ターゲットを選択する

lunch でビルドするターゲットを選択します。正確な設定は、引数として渡すことができます。たとえば以下のコマンドは、すべてのデバッグを有効にした状態でエミュレータの完全なビルドを参照します。

lunch aosp_arm-eng

引数なしで実行すると、lunch はプロンプトを出して、メニューからターゲットを選択するように促します。すべての既存のデバイスのビルド構成については、デバイスのビルドを選択するをご覧ください。

すべてのビルド ターゲットは BUILD-BUILDTYPE の形式になります。この場合、BUILD は特定の機能の組み合わせを参照するコードネームです。BUILDTYPE は次のいずれかです。

ビルドタイプ 用途
user アクセス制限あり、本番環境向け
userdebug user に似ているが、ルートアクセス権限とデバッグ機能がある、デバッグ向け
eng 開発向けの構成、追加のデバッグツールを使用可能

userdebug ビルドは user ビルドと同じように動作し、追加のデバッグを有効にする機能(通常はプラットフォームのセキュリティ モデルに違反する)を備えています。このため、ユーザーテストには、診断機能が強化された userdebug ビルドが向いています。userdebug ビルドを使用して開発を行う場合は、userdebug のガイドラインに従ってください。

eng ビルドは、プラットフォームで作業するエンジニアのエンジニアリング生産性を優先したものです。eng ビルドでは、ユーザー エクスペリエンス向上のためのさまざまな最適化がオフになります。それ以外では、eng ビルドは user および userdebug ビルドと同様に動作します。そのためデバイスのデベロッパーが、目的の環境でコードがどのように動作するかを確認できます。

実際のハードウェア向けにビルドと実行を行う際の詳細については、ビルドの実行を参照してください。

コードをビルドする

このセクションは、設定が完了したことを確認するための概要です。

すべてを m でビルドします。m は、-jN 引数を使用して並列タスクを処理できます。-j 引数を指定しない場合、ビルドシステムはシステムに最適と思われる並列タスク数を自動的に選択します。

m

前述のように、m コマンドラインに名前を指定することで、デバイス イメージ全体ではなく、特定のモジュールをビルドできます。さらに、m には特別な目的のための擬似ターゲットがいくつかあります。以下に例を示します。

  • droid - m droid は通常のビルドです。このターゲットは、デフォルトのターゲットに名前が必要であるために使われています。
  • all - m all は、m droid でビルドされるすべてのものに加え、droid タグのないすべてのものをビルドします。ビルドサーバーがこのコマンドを実行することにより、ツリー内にある、Android.mk ファイルを持つすべてが確実にビルドされるようになります。
  • clean - m clean は、この構成の出力ファイルと中間ファイルをすべて削除します。これは rm -rf out/ と同じです。

m が提供する他の擬似ターゲットを確認するには、m help を実行します。

実行する

ビルドは、エミュレータで実行するか、デバイス上でフラッシュできます。 すでに lunch でビルド ターゲットを選択済みのため、それ以外のターゲットで実行する可能性はあまりありません。

fastboot によるフラッシュ

デバイスをフラッシュさせるには、fastboot を使用します。これは成功したビルドのパスに含まれています。手順については、デバイスのフラッシュを参照してください。

Android デバイスのエミュレーション

エミュレータは、ビルドプロセスによって自動的にパスに追加されます。エミュレータを実行するには、次のように入力します。

emulator

一般的なビルドエラーのトラブルシューティング

Java のバージョンが正しくない

ビルドしようとする Android のバージョンが Java のバージョンと矛盾する場合、make は以下のようなメッセージを表示して中断します。

************************************************************
You are attempting to build with the incorrect version
of java.

Your version is: WRONG_VERSION.
The correct version is: RIGHT_VERSION.

Please follow the machine setup instructions at
    https://source.android.com/source/initializing.html
************************************************************

考えられる原因と解決策は次のとおりです。

  • JDK 要件で指定されている正しい JDK のインストールに失敗している場合、環境の設定ターゲットの選択が、正しい手順に従っていることを確認します。
  • 以前インストールした別の JDK がパスに表示される場合、正しい JDK をパスの先頭に追加するか、問題のある JDK を削除します。

Python バージョン 3

Repo は Python 2.x の特定の機能に基づいてビルドされており、Python 3 とは互換性がありません。Repo を使用するには、Python 2.x をインストールします。

apt-get install python

大文字と小文字を区別しないファイル システム

macOS の HFS ファイル システム上でビルドする場合、次のようなエラーが発生することがあります。

************************************************************
You are building on a case-insensitive filesystem.
Please move your source tree to a case-sensitive filesystem.
************************************************************

大文字と小文字を区別するディスク イメージの作成の手順に従ってください。

USB 権限がない

ほとんどの Linux システムでは、権限のないユーザーはデフォルトで USB ポートにアクセスできません。 権限の拒否エラーが表示されたら、USB アクセスの設定の手順に従ってください。

adb がすでに実行されていて、ルールを設定してもデバイスに接続できない場合は、adb kill-server で adb を停止できます。このコマンドを実行すると、adb を新しい構成で再起動できます。