WSLでAndroid CTSを動かす

WSLでもAndroid [CTS](https://source.android.com/compatibility/cts) を動かせるかテストしてみた。結論としてはそこそこ動く。

# はじめに
試してみた背景・・。
CTSはLinux環境の実行が想定されているが、実行用のラッパーとなるシェルスクリプトから先はjavaが多く使われていて、
過去にはCTSツール内のシェルスクリプト相当のバッチファイルを用意してあげればWindowsでもそこそこ動いていた。
制約のある環境は使うべきではないと考えて完全にLinuxで実行するようにしていたが、
ふとWSLを使えばバッチファイルよりは手軽にWindowsから実行する環境が作れるのではと思い試してみた。
そこそこ動くが、WSL性質上Linuxと異なるところでfailしたりうまく動かない箇所が想定されるため、Linux環境があればあえてWSL使うべきではない。

以下はWindows10ホスト側にはadbインストール済み。
WSLもインストール済みの環境を使用している。WSL自体のインストール手順は割愛。
WSL環境にopenjdk、adb、aaptをインストール、CTSをダウンロード展開・実行する手順として記載。

# 確認環境
* Windows10
* WSL Ubuntu 18.04 (WSL)
* openjdk 1.8.0_222
* adb (1.0.41)
 ※ホストのWindows側のadb.exeのデーモンを介して動作させる必要があるため、ホストにも別途adbが必要。
* aapt (v0.2-5747142)
* テスト用のAndroid端末(MO-01K Android 8.0)

# WSL環境にて必要なツールをインストール

## java 1.8実行環境(openjdk8)
```shell
sudo apt install openjdk-8-jre-headless
sudo apt install p7zip-full
```

## sdk-tools、adb、aaptをインストール
adbはplatform-toolsのzipをダウンロード展開するだけで良いが、
aaptはAndroidのSDKマネージャーを介してダウンロードする必要がある。
今回の環境はWSLであり、Android StudioのGUIは使えないため、sdkmanagerのコマンドラインツールでインストールを実施。

```shell
# sdk-toolsを"~/android-sdk"に展開
mkdir ~/android-sdk
cd android-sdk
# sdk-tools, platform-toolsをダウンロード
wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
7z x ./sdk-tools-linux-4333796.zip
7z x ./platform-tools-latest-linux.zip

# aaptインストール
cd tools
./bin/sdkmanager --install "build-tools;29.0.2"
# ⇒"~/android-sdk/build-tools/29.0.2"にインストール展開される。

# adb(platform-tools)、aapt(build-tools/<version>)にパスを通す。
# 必要に応じて ~/.bashrc にも記載しておくこと。
export PATH=~/android-sdk/platform-tools:$PATH
export PATH=~/android-sdk/build-tools/29.0.2:$PATH

# adb、aaptにパスが通っているかバージョンを表示して確認。
adb version
aapt version
```

## WSL側のadbで端末が認識することを確認
WSL側のadbを動作させる際、ホストのWindows側のadb.exeのデーモンを介して動作させる必要がある。
Windows側で先に`adb devices`でAndroid端末が認識していることを確認すること。
先にWSL側のadbデーモンを動かしてしまった場合、ホスト側(コマンドプロンプトから)とWSL側のadbデーモンを`adb kill-server`で止めてから、ホスト側で`adb devices`でAndroid端末が認識することを確認する。

# CTSツールをダウンロード、実行
今回はAndroid8.0の端末にて実行したため8.0のツールをダウンロード。
ツールはこちらに公開されている。
https://source.android.com/compatibility/cts/downloads

## CTSツールダウンロード、展開
```shell
# CTSダウンロード
mkdir work
cd work
wget https://dl.google.com/dl/android/cts/android-cts-8.0_r21-linux_x86-arm.zip
7z x android-cts-8.0_r21-linux_x86-arm.zip -oandroid-cts-8.0_r21-linux_x86-arm
cd android-cts-8.0_r21-linux_x86-arm/android-cts/tools
```

## CTSモジュール単体実行
適当にモジュールのテストを1つ選んで実行。

```
./cts-tradefed
cts-tf > run cts -m CtsAadbHostTestCases --skip-device-info --skip-preconditions --skip-all-system-status-check --abi arm64-v8a 
```

```
11-24 15:51:27 I/ResultReporter: Invocation finished in 2m 55s. PASSED: 11, FAILED: 0, MODULES: 1 of 1
```

# 制限事項
Linuxに近い実行環境のWSLといっても、WSLの性質上、やはりLinuxではないため一部動作しないテストがある。
見つけたものでは、CtsUsbTestsはlsusbが動作しないWSLではpassできない。

# 補足
WSL環境での内容として記載しているが、
通常のUbuntu Linuxホスト環境でもほぼ同じ手順で実施できるはず。

# 参考URL
[CTSについて]https://source.android.com/compatibility/cts
[android sdk-toolsダウンロード先]https://developer.android.com/studio/index.html
[andorid platform-toolsダウンロード先]https://developer.android.com/studio/releases/platform-tools
[CTSダウンロード先]https://source.android.com/compatibility/cts/downloads
[sdkmanagerの使い方]https://developer.android.com/studio/command-line/sdkmanager