世界で最も広くインストールされているオペレーティング システムの開発を、デベロッパーの皆さんの手でサポートできます。ここから、Android プラットフォームのエンジニアになるための第一歩を踏み出すことができます。
その道は険しいですが、Android チームではリリースごとに、そうした道のりの簡素化に努めています。また、Android オープンソース プロジェクト(AOSP)での直接的な取り組みを通じて、日々改善を行っています。
それではターミナルを起動し、開発の旅に出発しましょう。
目標
このコードラボの目的は次の 2 つです。
- この Codelab では、プラットフォーム(オペレーティング システム)の開発に取り組む Android エンジニアのデベロッパー ワークフローとはどのようなものかを簡単に紹介します。
- この Codelab には、プラットフォームの開発をゼロから始めるデベロッパーから、Android のツール、ドキュメント、デベロッパー ワークフローに関するフィードバックを集める役割もあります。
前提条件
この Codelab の要件の全リストは以下のとおりです。この要件は、一般的なプラットフォーム(AOSP)開発向けの要件をベースとしています。
この Codelab を受講するには、以下の設定が必要です。
- すべての要件を満たした物理的な Linux ワークステーション
- Android コードベースの編集に必要な Repo および Git の設定
環境
通常、ユーザーはワークステーション上で直接ビルドと開発を行います。さまざまなターミナルで作業する可能性があること、および使用するコマンドの多くはターミナル固有であることから、それぞれのターミナル セッションでそうしたコマンドの再実行が必要となります。具体的には、source build/envsetup.sh
コマンドや lunch
コマンドを使用します。
ワークステーションの設定
- ワークステーションに必要なパッケージをインストールします。
- 引き続き、ターミナルで Repo をインストールし、すべての Git リポジトリにアクセスするための認証情報を取得します。
コードの初期化と同期
ホームディレクトリに移動します。
cd ~
ローカルの作業用サブディレクトリを作成します。
mkdir aosp
そのディレクトリに移動します。
cd aosp
AOSP リポジトリのソースコードの master ブランチ(デフォルト)を初期化します。
repo init -u https://android.googlesource.com/platform/manifest
Git の認証情報(名前、メールアドレス)を入力するか、受け入れます。
ソースコードを同期します。
repo sync -j16
初回の同期には 1 時間以上かかることがあります。待っている間、関連する詳細情報についてダウンロード手順をご覧ください。
各 Repo チェックアウトは、それぞれ 1 つのマニフェスト ファイルで示されます。各 Repo チェックアウトをそれぞれ個別のディレクトリ内に配置している場合に限り、一度に複数の Repo チェックアウトを持つことができます。ただし、各チェックアウトとビルドの合計は 300 GB 以上になることもあるため、チェックアウトを 2 つまでに制限するか、システムにセカンダリ ドライブを増設するようにしてください。
ヒント: 空き容量を増やすには、ブランチのディレクトリを削除して、ディレクトリの作成から新たに開始します。
rm -rf aosp2
コードのビルド
Android をビルドするには、lunch
コマンドで、ビルドするターゲット デバイスのタイプを選択する必要があります。ターゲットとは、機種やフォーム ファクタ別の対象デバイスです。
下記で指定されているデバイス ターゲット(aosp_cf_x86_phone-userdebug
)の場合、実機なしでテストを行うための Cuttlefish 仮想 Android デバイスをビルドできます。
実機のビルドや更新を行う場合は、それに対応した別のターゲットを選択します。手順については、デバイスをフラッシュするをご覧ください。
Android デバイスのビルド環境をセットアップするには、ソースコード チェックアウトのルートから、以下のコマンドを実行します。
source build/envsetup.sh
ビルド ターゲットを次のように lunch コマンドに指定します。
lunch aosp_cf_x86_phone-userdebug
チェックアウト内の任意の場所から、以下のコマンドを使用してコードをビルドします。
m
初回のビルドが完了するまでには時間がかかります。その後のビルドでは、所要時間は大幅に短縮されます。
Acloud インスタンスの作成
Acloud は AOSP 内のコマンドライン ツールで、ユーザーによる仮想 Android デバイス(この例では Cuttlefish)の作成を支援します。
コードのビルドと同じターミナル セッションの場合は、そのまま手順を進めてください。それ以外の場合は、まず、envsetup.sh
スクリプトと、コードのビルドで使用したのと同じ lunch コマンドを再実行してください。その後の操作は次のとおりです。
次のコマンドを実行して Acloud ローカル インスタンスを作成します。
acloud create --local-image --local-instance
必須パッケージの更新を受け入れます。
プロンプトが表示されたら、すべての変更内容を有効化するために、ワークステーションを再起動します。
Cuttlefish デバイスを選択します。
Android デバイスを含んだ VNC セッションの初期画面が表示されます。
ワークステーションでマウスやキーボードを使用して、仮想デバイスを操作できます。次のように、Android Debug Bridge(adb)の logcat
コマンドを使用して、デバイスの使用中にログ内のアクティビティを追跡することもできます。
adb logcat
変更
このサンプルの変更リストに沿って、ソースコードを更新します。
チェックアウトのルート(
aosp/
ディレクトリ)からframeworks/native
Git プロジェクトに移動します。cd frameworks/native
次のコマンドを実行して、一時的なプロジェクトを開始します。
repo start <some-name> .
次の場所にある
SurfaceFlinger.cpp
を編集して、変更リストにある更新を含めます。aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
コードをビルドします。
m
デバイス上のビルドを更新します。
adb root adb remount adb sync adb reboot acloud reconnect
デバイスで色の変化が表示されます。
コードのテスト
Codelab のこのパートでは、サンプルのテストを実行します。このテストはソースツリー内にあり、すでに失敗しています。ローカルでテストを実行するために、Atest を使用してコードをテストします。
テストを使用するには:
次のコマンドを実行します。
atest DevCodelabTest
テストは失敗します。コードを修正していきましょう。失敗したテストのソースコードを見つけます。
atest --info android.test.example.devcodelab.DevCodelabTest#testHelloWorld
次に、以下の中を調べます。
platform_testing/tests/example/devcodelab
編集するファイルについては、テストの名前の
.
を/
に置き換えます。置き換える前の名前は以下のようになっています。android.test.example.devcodelab.DevCodelabTest
置き換えると次のようになります。
src/android/test/example/devcodelab/DevCodelabTest.java
したがって、次のファイルを編集します。
platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
以下の箇所を編集します。
Assert.assertTrue(false)
上記を以下のように置き換えます。
Assert.assertTrue(true)
テストをもう一度実行して、修正されたことを確認します。
atest DevCodelabTest
レビュー用にコードをアップロードする
Repo は、git clone
などのコマンドをバンドルして一度に数多くの Git リポジトリ(またはプロジェクト)にわたって処理を実行することにより、Git の使用を簡素化します。
Git と Repo の概要と、Android ソースコードの作業に関する詳細なドキュメントへのリンクについては、ソース管理ツールをご覧ください。Git プロジェクト、個別プロジェクト(パス)、各プロジェクトの関連ブランチについては、AOSP リポジトリをご覧ください。
Git 内のプロジェクトを対象としたウェブベースのコードレビュー システムである Gerrit を使用します。
たとえば、
frameworks/native
プロジェクト内で変更を加えた場合は、次のコマンドを実行して変更をアップロードします。cd frameworks/native repo start codelab . git add . git commit
コミット メッセージを次のように入力します。
Android codelab change Test: manual atest
変更をアップロードします。
repo upload
正常にアップロードされると、次のようなメッセージが表示されます。
Upload project frameworks/native/ to remote branch master:
branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700):
ff46b36d android codelab change
to https://android-review.googlesource.com/ (y/N)? y
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote: https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android codelab change [NEW]
remote:
To https://android-review.googlesource.com/platform/frameworks/native
* [new branch] codelab -> refs/for/master
Gerrit での変更の表示
ターミナルに表示される次のようなリンク先に移動します。
https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432
Android プラットフォーム開発向けの最初の Codelab はこれで完了です。Android 開発の詳細については、パッチを提出するをご覧ください。
変更を元に戻す
通常は、テストの後にレビューと承認を受けたら、Gerrit で変更を送信してリポジトリにマージします。
この Codelab は学習を目的としたものであるため、その代わりに Gerrit で [Abandon] をクリックして自分の変更リストを元に戻します。
次に、frameworks/native プロジェクト ディレクトリ(またはそのサブディレクトリ)内にある、関連する一時的なブランチを破棄します。
repo abandon codelab .
テストファイルに対する変更も、忘れずに元に戻します。変更の repo start
、git commit
、repo upload
は実行しなかったので、次のコマンドを実行して単にファイル自体をリセットできます(次のコマンドでは現在位置が aosp/platform_testing directory
であると想定しています)。
git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
git checkout .
これで完了です。お疲れさまでした。
ヘルプ
この Codelab でエラーが発生した場合は、各ページの下部にあるサイト フィードバック リンクを使用して報告してください。質問がある場合は、android-building グループにお送りください。