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_variant
は product_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 ビルドと同様に動作します。そのためデバイスのデベロッパーが、目的の環境でコードがどのように動作するかを確認できます。
実際のハードウェア向けのビルドと実行について詳しくは、デバイスのフラッシュをご覧ください。
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 を新しい構成で再起動できます。