android-sdk を ubuntu22.04 で【Flutterビルド用にCLIだけ入れる】

## 入れ方めっちゃあるやんけ

Flutter楽しいですよねー！ 高パフォーマンスなアプリが iOS/Android 用にサクサク作れます。

僕らのチームの場合「開発初期は殆ど iPhone」で進めて、
「リリースが近づくと Android もテストを始める」感じです。

で、いつも問題になるのが android-sdk のインストール法...いつも忘れちゃう

出来れば Mac に重たい AndroidStudio を入れなく無いので、ビルドだけサーバに回そうと思ったのですが、「CLI のみのインストール」にとにかく罠が多いのです。
ここでは僕らのチームの最適解として、なるべく最小の手間で使えるようにしたいと思います。
CI/CD関連の方にも参考にして頂けるのかなと思います。
(flutter そのものの入れ方は割愛します。 fvm でも snap でもお好みの方法でどうぞ)

## ubuntu の apt レポは神
```bash
sudo apt update && sudo apt install android-sdk openjdk-17-jdk
```

いきなりですが、まずコレを。
公式のガイドは「CLIのみ」の人を全く相手にしていません。
解説読むだけ混乱しますので ubuntu を信じましょう


## インストールされたものを `${HOME}` に
デフォルトでは、`/usr/lib/android-sdk/cmdline-tools` にインストールされるのですが、
ここに置いてあると `sudo` しないと触れなくなってしまいます。
(`flutter doctor --android-licenses` などのコマンドが `sudo` 必要な状態になっちゃう)

flutterコマンドは sudo しない事が推奨されていますので、サクッとコピーor移動して、権限も書き換えておきます

```bash
sudo cp -rf /usr/lib/android-sdk ~/
sudo chown -R $(id -u):$(id -g) ~/android-sdk 
```

## ここでやっと `cmdline-tools` を入れる
色んなサイトで「ここから入れろ」と言われるページです。CLIユーザの事は何も考えてません。
https://developer.android.com/studio
一番下の Linux のzipを選択、クリックしてライセンス画面を表示、
ライセンスに同意すると下のボタンがクリッカブルになりますので、右クリックしてこんな感じのURLを取得します
`https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip`

これをサーバ機の`~`にでも wget します
`wget https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip`

## ここでハマった！！！！
unzip して、 `~/android-sdk`に放り込み... と最近のsdkではディレクトリ名でバージョン管理をするんだそうで。
```
unzip commandlinetools-linux-10406996_latest.zip
mkdir -p ~/android-sdk/cmdline-tools/latest
mv ~/cmdline-tools/* ~/android-sdk/cmdline-tools/latest/
```
が正しい位置となります。あちこちのサイトに `/latest/` 部分が抜けたガイドがありますのでご注意下さい。


## .zshrc/.bashrc に環境変数を設定
ビルドには `javac` が必要です。一緒に設定しておきます
いろんなガイドで `$ANDROID_SDK_ROOT` という変数名も出てくるのですが、これは要らないみたい。

```
# JDK
JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH

# android sdk
export ANDROID_HOME=${HOME}/android-sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools/bin
```
上記を `.zshrc/.bashrc` の最後に追記したら、
`. ~/.zshrc`などとして再読み込みします


## あとは `sdkmanager` がやってくれるはず
これで標準的なcliツール群が使えるようになりました。このようにして必要な最低APIレベルのプラットフォームツールをインストールします
```
sdkmanager "platform-tools" "platforms;android-29" "build-tools;29.0.3"
```

もし下記のエラーが出た方、`$ANDROID_SDK_ROOT` や `PATH` が通っているか確認してください
```
❯ sdkmanager "platform-tools" "platforms;android-29" "build-tools;29.0.3"
Error: Could not determine SDK root.
Error: Either specify it explicitly with --sdk_root= or move this package into its expected location: <sdk>/cmdline-tools/latest/
```


## Flutter ドクター
最終的に下記の状態になればOKです。
ヘッドレスサーバなので、chromeなどはインストールしていません。
`flutter pub get && flutter build apk` などとして、ビルドが通ることを確認しましょう！
```
❯ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.16.0, on Ubuntu 22.04.3 LTS 6.2.0-36-generic, locale en_US.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✗] Chrome - develop for the web (Cannot find Chrome executable at google-chrome)
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
[✓] Linux toolchain - develop for Linux desktop
[!] Android Studio (not installed)
[✓] Connected device (1 available)
[✓] Network resources
```

終わりです
他にもっと楽なやり方ありそうな気がしますが、
とりあえず動きましたので一旦忘れようと思います。
最後まで読んでいただいてありがとうございました！