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 プロセスを入力します。