AWS EC2使ってAndroidOSビルドしてみた！

# AOSPについて
皆さん、AOSP(AndroidOpenSourceProject)というのをご存知ですか？
普段、使ってるAndroidのソースコードって実は公開されているんです。
AOSPはAndroidを公開してあげるから皆で協力して盛り上げてこうね！みたいな感じで、様々な人が自分だけのカスタマイズAndroidを作ることが出来るんです！
※公式サイト↓
https://source.android.com/?hl=ja

# 課題点
AOSPめちゃくちゃ面白そうですよね。
ただ...、開発に必要なマシンの要求スペックがとんでもない。
以下はAndroid Devページから参照したやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/fc253bf8-8b63-37ab-6a8b-105b0663a869.png)

* 容量は最低400GB~
* RAM推奨64GB
* CPUの性能も欲しい

中々、いかつくないっすか。

CPU買い替えるとマザボも買い替える必要があるし、電源も見直す必要がある。
RAMとの相性もあるし単純にAOSPに興味がある！ってだけなのにかなり金がかかります。

# 課題に対するアプローチ
上記で説明したように非常にお金がかかります。
本当にAOSPにドハマりしたのならパーツ組みなおすでもいいですが、この記事を読んでいる方はおそらくそこまでではないのではないでしょうか。
そこで、思いついたのがAWS EC2。

AWS EC2は所謂クラウドコンピューティングですね。
ネットワーク経由で高性能マシンに接続して利用しよう！みたいなやつです。

# 注意
今回はあくまでEC2を用いてAOSPをビルドするのが趣旨の記事です。
そのため、AWS EC2の細かい設定方法や操作方法は割愛させていただきます。

# 環境

## AWS　インスタンス情報
* Amazonマシンイメージ
  - Ubuntu Server 22.04 LTS(HVM), SSD Volume Type

* アーキテクチャ
  - 64bit

* キーペア設定有
  - Teratermでアクセスする時に必要です

* SSH接続
  - 許可(これもTeratermから入る時必須です)

* インスタンスタイプ
  - 種類1: c5.12xlarge

* 容量(EBD形式)
  - 500GB(余裕見てます)

# 手順1. Teratermからインスタンスにアクセス
1. AWS EC2のインスタンスページより上記のスペックで用意したインスタンスを開始する
2. Teratermを開きインスタンスのパブリックIPv4アドレスをTeratermのホスト欄に入力する
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/b94793c5-1500-2228-3878-12ade1e3a807.png)
3. 各情報は以下の通り
  - ユーザー名: ubuntu
  - パスフレーズ: 空
  - 認証方式 > RSA/DSA/ECDSA/ED25519鍵を使う
  - 認証方式 > 秘密鍵: AWS側でキーペア時に作成したpemファイル指定 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/337fd276-3887-9c2a-e722-49ff3cc7c5db.png)

上手くいくと繋がってコンソール画面に入ります。

# 手順2. ワークスペースを作成する
今回は仮なので、/home/ubuntu内にaospというフォルダを作りました
cdコマンドでその中に入りましょう

# 手順3. apt-get update
入っているツールが古かったりするので一旦お約束のやつやりますか
```bash
sudo apt-get update
```

# 手順4. 必要なライブラリ関係をインストールする
```bash
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
```

あとはAOSPコード落とすときにrepoを使うのでrepoも入れときましょう。
```bash
sudo apt-get install repo
```

# 手順5. git ユーザー情報を設定しておく
repo内でgit使ってるので以下の情報を設定しておく
```bash
git config --global user.name gitのユーザー名
git config --global user.email gitのメアド
```

# 手順6. AOSPコードを落とす
```bash
repo init -u https://android.googlesource.com/platform/manifest -b xx
```
xxにはOSを流し込みたい機種によって変わります
以下参照↓
https://source.android.com/docs/setup/about/build-numbers?hl=ja#source-code-tags-and-builds

自分の場合はGoogle Pixel 4XLに流し込むつもりなので
```bash
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r31
```

そしたら以下のコマンドで落とす
```bash
repo sync -jn
```
nにはcpu数によります。
nprocコマンドで確認できます。
今回のインスタンスなら48となってるはずなので
```bash
repo sync -j48
```
とします。

もし、repo実行時、「pythonが見つかりません」的なエラーが出たら以下の記事を参考に解消することが出来る。
https://tsuyoshin.hatenablog.com/entry/20200930/1601424481

# 手順7. ドライバダウンロード
下記のサイトへ飛びドライバ一覧を確認する。
https://developers.google.com/android/drivers?hl=ja

こちらは流し込みたい機種のビルド番号によって変わります。
ビルド番号確認方法↓
https://support.google.com/android/answer/7680439?hl=ja

確認出来たら以下のようにコマンド実行する
```bash
curl -o tmp xx
tar -xzvf tmp
rm tmp
```
xxには各ドライバのurlが入ります。
自分の場合は以下です。
```bash
curl -o tmp https://dl.google.com/dl/android/aosp/google_devices-coral-tp1a.221005.002.b2-71cf297a.tgz?hl=ja
```
上記を実行すると` extract-google_devices-crosshatch.sh `というファイルが出来るため以下のコマンドで実行
```bash
./extract-google_devices-crosshatch.sh
```

ずらずらと規約が流れるので最後まで読んで"I ACCEPT"と打つとvendorディレクトリが生成される

# 手順8. ビルド実行
下記コマンドを実行
```bash
source build/envsetup.sh
lunch
```
すると、下記のようにすごい種類出てくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/3614853b-6952-a23b-d030-d52d9cb6bb31.png)

探したいのは、` aosp_xx-userdebug `というやつ。
xxには各機種のコードネームが入る。(Google Pixel 4XLはCoral)
対応表は以下を見てください。
https://source.android.com/docs/setup/build/running?hl=ja

見つけたらその番号を打つ。(画像でいえば20)
そしたら最後に
```bash
m -jn
```
nはnprocで出てきた数字。
今回の場合は多分48なので
```bash
m -j48
```
ビルドは1時間かからない位かな？
こんだけのスペックでも結構時間かかってるんだからほんとやばい。
これもう一種のベンチマークでしょ。

成功すると以下のような画像が出てくる
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/0c4e3004-5a00-10f4-8e2e-2c624a8c8745.png)

# 終わり
とりあえずビルドするところまでは出来ましたね！
次は作成したOSを流し込むところですね！