Android デベロッパー Codelab

世界で最も広くインストールされているオペレーティング システムの開発を、デベロッパーの皆さんの手でサポートできます。ここから、Android プラットフォームのエンジニアになるための第一歩を踏み出すことができます。

その道は険しいですが、Android チームではリリースごとに、そうした道のりの簡素化に努めています。また、Android オープンソース プロジェクト(AOSP)での直接的な取り組みを通じて、日々改善を行っています。

それではターミナルを起動し、開発の旅に出発しましょう。

目標

このコードラボの目的は次の 2 つです。

  1. この Codelab では、プラットフォーム(オペレーティング システム)の開発に取り組む Android エンジニアのデベロッパー ワークフローとはどのようなものかを簡単に紹介します。
  2. この Codelab には、プラットフォームの開発をゼロから始めるデベロッパーから、Android のツール、ドキュメント、デベロッパー ワークフローに関するフィードバックを集める役割もあります。

要件

この Codelab の要件の全リストは以下のとおりです。この要件は、一般的なプラットフォーム(AOSP)開発向けの要件をベースとしています。

この Codelab を受講するには、以下の設定が必要です。

環境

通常、ユーザーはワークステーション上で直接ビルドと開発を行います。さまざまなターミナルで作業する可能性があること、および使用するコマンドの多くはターミナル固有であることから、それぞれのターミナル セッションでそうしたコマンドの再実行が必要となります。具体的には、source build/envsetup.sh コマンドや lunch コマンドを使用します。

ワークステーションの設定

  1. ワークステーションに必要なパッケージをインストールします。
  2. 引き続き、ターミナルで Repo をインストールし、すべての Git リポジトリにアクセスするための認証情報を取得します。

コードの初期化と同期

  1. ホームディレクトリに移動します。

    cd ~
        
  2. ローカルの作業用サブディレクトリを作成します。

    mkdir aosp
        
  3. そのディレクトリに移動します。

    cd aosp
        
  4. AOSP リポジトリのソースコードの master ブランチ(デフォルト)を初期化します。

    repo init -u https://android.googlesource.com/platform/manifest
        
  5. Git の認証情報(名前、メールアドレス)を入力するか、受け入れます。

  6. ソースコードを同期します。

    repo sync -j16
        

初回の同期には 1 時間以上かかることがあります。待っている間、関連する詳細情報について、ダウンロード手順をご覧ください。

各 Repo チェックアウトは、それぞれ 1 つのマニフェスト ファイルで示されます。各 Repo チェックアウトをそれぞれ個別のディレクトリ内に配置している場合に限り、一度に複数の Repo チェックアウトを持つことができます。ただし、各チェックアウトとビルドの合計は 300 GB 以上になることもあるため、チェックアウトを 2 つまでに制限するか、システムにセカンダリ ドライブを増設するようにしてください。

ヒント: 空き容量を増やすには、ブランチのディレクトリを削除して、ディレクトリの作成から新たに開始します。

rm -rf aosp2
    

コードのビルド

Android をビルドするには、lunch コマンドで、ビルドするターゲット デバイスのタイプを選択する必要があります。ターゲットとは、機種やフォーム ファクタ別の対象デバイスです。

下記で指定されているデバイス ターゲット(aosp_cf_x86_phone-userdebug)の場合、実機なしでテストを行うための Cuttlefish 仮想 Android デバイスをビルドできます。

実機のビルドや更新を行う場合は、それに対応した別のターゲットを選択します。手順については、デバイスをフラッシュするをご覧ください。

  1. Android デバイスのビルド環境をセットアップするには、ソースコード チェックアウトのルートから、以下のコマンドを実行します。

    source build/envsetup.sh
        
  2. ビルド ターゲットを次のように lunch コマンドに指定します。

    lunch aosp_cf_x86_phone-userdebug
        
  3. チェックアウト内の任意の場所から、以下のコマンドを使用してコードをビルドします。

    m
        

初回のビルドが完了するまでには時間がかかります。その後のビルドでは、所要時間は大幅に短縮されます。

Acloud インスタンスの作成

Acloud は AOSP 内のコマンドライン ツールで、ユーザーによる仮想 Android デバイス(この例では Cuttlefish)の作成を支援します。

コードのビルドと同じターミナル セッションの場合は、そのまま手順を進めてください。それ以外の場合は、まず、envsetup.sh スクリプトと、コードのビルドで使用したのと同じ lunch コマンドを再実行してください。その後の操作は次のとおりです。

  1. 次のコマンドを実行して Acloud ローカル インスタンスを作成します。

    acloud create --local-image --local-instance
        
  2. 必須パッケージの更新を受け入れます。

  3. プロンプトが表示されたら、すべての変更内容を有効化するために、ワークステーションを再起動します。

  4. Cuttlefish デバイスを選択します。

Android デバイスを含んだ VNC セッションの初期画面が表示されます。

ワークステーションでマウスやキーボードを使用して、仮想デバイスを操作できます。次のように、Android Debug Bridge(adb)の logcat コマンドを使用して、デバイスの使用中にログ内のアクティビティを追跡することもできます。

adb logcat
    

変更を加える

このサンプルの変更リストに沿って、ソースコードを更新します。

  1. チェックアウトのルート(aosp/ ディレクトリ)から frameworks/native Git プロジェクトに移動します。

    cd frameworks/native
        
  2. 次のコマンドを実行して、一時的なプロジェクトを開始します。

    repo start <some-name> .
        
  3. 次の場所にある SurfaceFlinger.cpp を編集して、変更リストにある更新を含めます。

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
        
  4. コードをビルドします。

    m
        
  5. デバイス上のビルドを更新します。

    adb root
        adb remount
        adb sync
        adb reboot
        acloud reconnect
        

デバイスで色の変化が表示されます。

コードのテスト

Codelab のこのパートでは、サンプルのテストを実行します。このテストはソースツリー内にあり、すでに失敗しています。ローカルでテストを実行するために、Atest を使用してコードをテストします。

テストを使用するには:

  1. 次のコマンドを実行します。

    atest DevCodelabTest
        
  2. テストは失敗します。コードを修正していきましょう。失敗したテストのソースコードを見つけます。

    atest --info android.test.example.devcodelab.DevCodelabTest#testHelloWorld
        
  3. 次に、以下の中を調べます。

    platform_testing/tests/example/devcodelab
        
  4. 編集するファイルについては、テストの名前の ./ に置き換えます。置き換える前の名前は以下のようになっています。

    android.test.example.devcodelab.DevCodelabTest
        

    置き換えると次のようになります。

    src/android/test/example/devcodelab/DevCodelabTest.java
        
  5. したがって、次のファイルを編集します。

    platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
        

    以下の箇所を編集します。

    Assert.assertTrue(false)
        

    上記を以下のように置き換えます。

    Assert.assertTrue(true)
        
  6. テストをもう一度実行して、修正されたことを確認します。

    atest DevCodelabTest
        

レビュー用にコードをアップロードする

Repo は、git clone などのコマンドをバンドルして一度に数多くの Git リポジトリ(またはプロジェクト)にわたって処理を実行することにより、Git の使用を簡素化します。

Git と Repo の概要と、Android ソースコードの作業に関する詳細なドキュメントへのリンクについては、ソース管理ツールをご覧ください。Git プロジェクト、個別プロジェクト(パス)、各プロジェクトの関連ブランチについては、AOSP リポジトリをご覧ください。

Git 内のプロジェクトを対象としたウェブベースのコードレビュー システムである Gerrit を使用します。

  1. たとえば、frameworks/native プロジェクト内で変更を加えた場合は、次のコマンドを実行して変更をアップロードします。

    cd frameworks/native
        repo start codelab .
        git add .
        git commit
        
  2. コミット メッセージを次のように入力します。

    Android codelab change
        Test: manual atest
        
  3. 変更をアップロードします。

    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 startgit commitrepo upload は実行しなかったので、次のコマンドを実行して単にファイル自体をリセットできます(次のコマンドでは現在位置が aosp/platform_testing directory であると想定しています)。

git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    git checkout .
    

これで完了です。お疲れさまでした。

ヘルプ

この Codelab でエラーが発生した場合は、各ページの下部にあるサイトのフィードバックリンクを使用して報告してください。サポートを受けるには、android-building グループに質問をお送りください。