Android 開発を試す

このチュートリアルは、Android オペレーティング システムの開発に初めて挑戦する方に向けたものです。

Android 開発のセットアップ

Android ソースの main ブランチをダウンロードしてビルドする前に、お使いのハードウェアが要件を満たしており、必要なソフトウェアが適切にインストールされていることを確認してください。以下の用語についても知っておく必要があります。

Git
Git は、無料で利用できるオープンソースの分散型バージョン管理システムです。Android では、ブランチ作成、コミット、差分の取得、編集などのローカル操作に Git を使用します。Git について詳しくは、Git のドキュメントをご覧ください。
Repo
Repo は、Git の Python ラッパーで、複数の Git リポジトリにまたがる複雑な処理を簡略化するために使用します。ただし、あくまで複雑な Git 処理をより簡単に実現するためのもので、Git のすべてのバージョン管理処理を代替できるわけではありません。Repo はマニフェスト ファイルを使用して、Git プロジェクトを Android スーパープロジェクトに集約します。
マニフェスト ファイル
マニフェスト ファイルとは、Android ソースのさまざまな Git プロジェクトを AOSP ソースツリー内のどこに置くかを指定する XML ファイルです。

ハードウェア要件を確認する

開発ワークステーションは、以下のハードウェア要件を満たす必要があります。

  • 64 ビット x86 システム。

  • コードのチェックアウトとビルド用に 400 GB 以上の空きディスク容量が必要です(チェックアウト用 250 GB + ビルド用 150 GB)。

  • 64 GB 以上の RAM。Google での Android のビルドには、64 GB の RAM を搭載した 72 コアマシンを使用しています。このハードウェア構成で、Android のフルビルドに 40 分ほどかかります。増分ビルドであれば数分で完了します。一方、64 GB の RAM を搭載した 6 コアマシンではフルビルドに 6 時間ほどかかります。

オペレーティング システムの要件を確認する

開発ワークステーションは、GNU C ライブラリ(glibc)2.17 以降を実装する 64 ビットの Linux ディストリビューションを搭載している必要があります。

必要なパッケージをインストールする

Ubuntu 18.04 以降に必要なパッケージをインストールするには、次のコマンドを実行します。

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

必要なソフトウェアをインストールする

AOSP を使用するには、その前に OpenJDK、Make、Python 3、および Repo をインストールする必要があります。Android の AOSP main ブランチには、OpenJDK、Make、および Python 3 のビルド済みバージョンが用意されているため、追加のインストールは必要ありません。次のセクションでは、Repo をインストールする手順について説明します。

Repo をインストールする

Repo をインストールする手順は次のとおりです。

  1. 次のコマンドを実行して、現在のパッケージ情報をダウンロードします。

    sudo apt-get update
  2. 次のコマンドを実行して、Repo ランチャーをインストールします。

    sudo apt-get install repo

    Repo ランチャーには、チェックアウトを初期化してフル Repo ツールをダウンロードするための Python スクリプトが用意されています。

    正常に完了したらステップ 4 に進みます。

  3. (省略可)Repo を手動でインストールするには、以下の一連のコマンドを使用します。

    export REPO=$(mktemp /tmp/repo.XXXXXXXXX)
    curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo
    gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
    curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo

    最初の 3 つのコマンドにより一時ファイルがセットアップされ、そのファイルに Repo がダウンロードされます。さらに、指定した鍵が必要な鍵と一致するかどうかが確認されます。これらのコマンドが正常に完了したら、最後のコマンドを実行して Repo ランチャーをインストールします。

  4. 次のコマンドを実行して、Repo ランチャーのバージョンを確認します。

    repo version

    次に、バージョンが 2.4 以降になっていることを示す出力の例を示します。

    repo launcher version 2.45

Android ソースのダウンロード

Android ソースは、Google がホストする Git リポジトリのコレクションにあります。各 Git リポジトリには、ソースの変更点や変更日時など、Android ソースの履歴全体が格納されています。次の手順で Android ソースをダウンロードします。

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

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

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

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

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

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

    repo sync -c -j8

    ダウンロード中に問題が発生した場合は、同期の問題のトラブルシューティングと解決を参照してください。

コードをビルドする

コードをビルドするには:

  1. 作業ディレクトリ内から、envsetup.sh スクリプトをソースとしてビルド環境を設定します。

    source build/envsetup.sh
  2. lunch コマンドで、ビルドするターゲット デバイスのタイプを選択します。ターゲットとは、特定のモデルやフォーム ファクタなど、特定のバージョンのデバイスです。このターゲットを指定します。

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug

    ターゲットとビルド環境の概要が表示されます。

    ============================================
    PLATFORM_VERSION_CODENAME=VanillaIceCream
    PLATFORM_VERSION=VanillaIceCream
    PRODUCT_INCLUDE_TAGS=com.android.mainline
    TARGET_PRODUCT=aosp_arm
    TARGET_BUILD_VARIANT=eng
    TARGET_ARCH=arm
    TARGET_ARCH_VARIANT=armv7-a-neon
    TARGET_CPU_VARIANT=generic
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
    HOST_CROSS_OS=windows
    BUILD_ID=AOSP.MAIN
    OUT_DIR=out
    ============================================
    
  3. ターゲットをビルドします。

    m

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

Cuttlefish を起動する

Cuttlefish は、ビルドのテストに使用する Android エミュレータです。

  1. 次のコマンドを実行して、ホスト Debian パッケージをダウンロード、ビルド、インストールします。

    sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
    git clone https://github.com/google/android-cuttlefish
    cd android-cuttlefish
    for dir in base frontend; do
    pushd $dir
    # Install build dependencies
    sudo mk-build-deps -i
    dpkg-buildpackage -uc -us
    popd
    done
    sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
    sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
    sudo usermod -aG kvm,cvdnetwork,render $USER
    sudo reboot

    再起動すると、その他のカーネル モジュールのインストールがトリガーされ、udev のルールが適用されます。

  2. Cuttlefish を起動します。

    launch_cvd --daemon
    
  3. ウェブブラウザで https://localhost:8443 にアクセスして、Cuttlefish デバイスに接続します。仮想 Android 搭載デバイスが表示されます。

変更を加える

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

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

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

    repo start <some-name> .
  3. エディタを使って、次の場所にある SurfaceFlinger.cpp を編集します。

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. 次に示す行を探します。

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. updateColorMatrixLocked() の先頭にこの行を追加します。

    mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f},
                              vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
    
  6. コードをビルドします。

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

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. 選択したデバイスの色が変化したことを確認します(図 1 のように表示されます)。

    成功した場合の色の変化の例

    図 1. 成功した場合の画面上の色の変化

テストを修正する

Codelab のこのパートでは、サンプルのテストを利用します。このテストはソースツリー内にあり、すでに失敗しています。

次の手順に沿ってテストを実行、デバッグ、修正します。

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

    atest DevCodelabTest

    テストが失敗します。

  2. 失敗したテストのスタック トレースを確認します。

    STACKTRACE:
    java.lang.AssertionError
     at org.junit.Assert.fail(Assert.java:87)
     at org.junit.Assert.assertTrue(Assert.java:42)
     at org.junit.Assert.assertTrue(Assert.java:53)
     at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)

    スタック トレースの最終行に失敗したテスト(testHelloWorld)が表示されます。このテストは DevCodelabTest.java というファイルにあります。

  3. 修正すべきテストの場所を特定するには、スタック トレースの最終行に、WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/ をテストファイルの名前まで含めて追加します。つまり、android.test.example.devcodelab.DevCodelabTestWORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java となります。

  4. platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java を編集し、Assert.assertTrue(false)Assert.assertTrue(true) に置き換えます

  5. テストをもう一度実行して、問題が修正されたことを確認します。

    atest DevCodelabTest

レビューを受けるためにコードをアップロードする

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

Git でプロジェクトのコードレビューを行うには、ウェブベースのコードレビュー システム Gerrit を使用します。

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

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
  2. Commit メッセージでは、次のように入力します。

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

    repo upload

    アップロードが成功すると、次のようなメッセージが表示されます。

    Upload project frameworks/native/ to remote branch main:
     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/main
    

Gerrit で変更を確認する

Gerrit で変更を確認するには、ターミナルのリンク出力に移動します。リンクは次のようなものです。

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

変更を元に戻す

通常は、テストの後にレビューと承認を受けたら、Gerrit で変更を送信してリポジトリにマージします。この Codelab は学習を目的としたものであるため、その代わりに作業を元に戻します。

  1. Gerrit で [Abandon] をクリックします。

  2. frameworks/native プロジェクト ディレクトリ(またはそのサブディレクトリ)内にある、関連する一時的なブランチを破棄します。

    repo abandon codelab .
  3. テストファイルに対する変更を元に戻します。テストの変更について repo startgit commitrepo upload を実行していないので、ファイル自体をリセットできます。現行ディレクトリが aosp/platform_testing directory の場合は、次のコマンドを使用してファイルをリセットします。

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

Android プラットフォーム開発向けの Codelab はこれで完了です。

サポートを受ける

この Codelab でエラーが発生した場合は、ページの下部にある Issue Tracker のリンクを使用して報告してください。質問がある場合は、android-building グループに投稿してください。

ps -A | grep crosvm を入力して、crosvm がすでに実行されているか確認します。crossvm が実行されている場合は、プロセス PID で stop_cvd || true または kill crosvm プロセスを入力します。