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 ソースコードの操作を可能にする複数のコマンド(この演習で使用したコマンドを含む)をインポートします。

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

hmm

ターゲットの選択

lunch

lunch でビルドするターゲットを選択します。lunch product_name-build_variantproduct_name をビルドする製品として選択し、build_variant をビルドするバリアントとして選択します。また、それらの選択を環境に保存して、後続の m などのコマンドの呼び出しで読み取れるようにします。

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

lunch aosp_arm-eng

引数なしで実行すると、lunch はプロンプトを出して、メニューからターゲットを選択するように促しますが、メニューにすべてのターゲットが含まれているわけではありません。AOSP でサポートされるすべてのデバイスのビルド構成については、デバイスビルドを選択するをご覧になるか、作業中のデバイスに適した lunch についてチームのメンバーと相談してください。

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

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

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

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

現在の lunch 設定を確認するには、次のコマンドを実行します。

echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"

実際のハードウェア向けのビルドと実行について詳しくは、デバイスのフラッシュをご覧ください。

tapas

tapas コマンドは、単体アプリのビルドを構成します。このコマンドによって、Android ビルドシステムでビルドされるアプリが選択されます。lunch とは異なり、tapas はデバイス用イメージのビルドはリクエストしません。

コマンドの詳細を確認するには、tapas help を実行してください。

コードをビルドする

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

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

m

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

  • droid - m droid は通常のビルドです。このターゲットは、デフォルトのターゲットに名前が必要であるために使われています。
  • all - m all は、m droid でビルドされるすべてのものに加え、droid タグのないすべてのものをビルドします。ビルドサーバーがこのコマンドを実行することにより、ツリー内にある、Android.mk ファイルを持つすべてが確実にビルドされるようになります。
  • m - ツリーの最上部からビルドを実行します。 これは、サブディレクトリ内から make を実行できるため、便利です。TOP 環境変数を設定している場合は、その値が使用されます。設定していない場合は、現在のディレクトリからツリーの最上部を検索します。引数を指定せずに m を実行してソースコード ツリー全体をビルドするか、名前を指定して特定のターゲットをビルドできます。
  • mma - 現在のディレクトリ内のすべてのモジュールと依存関係をビルドします。
  • mmma - 指定されたディレクトリ内のすべてのモジュールと依存関係をビルドします。
  • croot - cd を実行してツリーの最上部に移動します。
  • clean - m clean は、この構成の出力ファイルと中間ファイルをすべて削除します。これは rm -rf out/ と同じです。

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

ビルドを実行する

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

fastboot によるフラッシュ

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

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

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

emulator

ビルドのフィンガープリントについて

特定の Android ビルドに関連付けられている問題をトラッキングして報告するには、ビルドのフィンガープリントを理解することが重要です。ビルドのフィンガープリントは、各ビルドに発行されるメーカー情報を含む、人が読める形式の一意の文字列です。正確な構文については、Android 互換性定義ドキュメント(CDD)のビルド パラメータのセクションに記載されている FINGERPRINT の説明をご覧ください。

ビルドのフィンガープリントは、特定の Android の実装とリビジョンを表します。この一意のキーにより、アプリ デベロッパーやその他のユーザーは特定のファームウェア バージョンに関する問題を報告できます。Android の問題報告プロセスについては、バグの報告をご覧ください。

ビルドのフィンガープリントによって、Android の実装の詳細がすべてカプセル化されます。

  • API: Android API、ネイティブ API、ソフト API の動作
  • コア API と一部のシステム UI の動作
  • CDD で定義されている互換性とセキュリティの要件
  • 予想される要件を満たすデバイスをターゲットにするためにアプリで採用されている製品仕様と uses-feature 設定
  • ハードウェアおよびソフトウェア コンポーネントの実装

詳細については、CDD をご覧ください。また、まったく新しい Android デバイスを作成する手順については、新しいデバイスを追加するをご覧ください。

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

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 を削除します。

USB 権限がない

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

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