AndroidでASP.NET Coreを動かす

# はじめに

AndroidにはTermuxというLinuxのターミナルエミュレーターがあります。
今回はこの子にPRoot経由でUbuntuをインストールして、そのうえでASP.NET Coreを動かしてみようと思います。

# Termux と F-Droid

[最新版のTermux](https://f-droid.org/packages/com.termux/)は[F-Droid](https://f-droid.org/)で配信されています。
PlayストアでもTermuxは配布されていますが、2020年ごろに更新が停止され現在は一部機能が動作していません。
F-Droidは非公式ストアになるため、不明なアプリのインストールに許可する必要があるので注意してください。

インストールが完了すると次のようなターミナルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/736a9edf-002f-5a8a-1b16-a7d875bb34ff.png)

# PRoot と proot-distro

次にproot-distro経由でUbuntuをインストールしていきたいのですが、このままだと`dotnet build`を実行したときに`error MSB6006: "csc.dll" exited with code 139`というアドレス違反でビルドが異常終了します。
PRootした時の初期アドレスに間違いがあるらしく、redditの下記のスレッドでパッチを提供している方がいるのでこれを利用します。

https://www.reddit.com/r/termux/comments/r9jsvv/comment/ho59bvd/?utm_source=share&utm_medium=web2x&context=3

パッチは次のGoogle Driveからダウンロードできます。個人のGoogle DriveからPRootのパッチ済みパッケージをダウンロードするのは怖いという方は↑のスレッドにパッチの仕方やビルド方法が書いてあるので試してみてください。

https://drive.google.com/file/d/1J9euzuGB5w6WGLVNVxTFVnrauTEzISAV/view

ダウンロードしたらTermuxにパッケージを転送し、インストールします。

```
$ pkg update -y
$ pkg install -y proot
$ dpkg -i downloads/proot_5.1.107-52_aarch64.deb
$ pkg install -y proot-distro
```

場合によってパッケージが不足している場合は指示に従って`apt --fix-broken install`すると解消しました。
続けてUbuntuをインストールしてログインします。

```
$ proot-distro install ubuntu
$ proot-distro login ubuntu
```

残念ながらARM64版のUbuntuにdotnetのaptは提供されていないので手動でインストールしていきます。

```
# apt update
# apt upgrade -y 
# apt install -y libicu70 wget vim
# wget https://download.visualstudio.microsoft.com/download/pr/67ca3f83-3769-4cd8-882a-27ab0c191784/bf631a0229827de92f5c026055218cc0/dotnet-sdk-6.0.403-linux-arm64.tar.gz
# mkdir -p $HOME/dotnet
# tar zxf dotnet-sdk-6.0.403-linux-arm64.tar.gz -C $HOME/dotnet
# export DOTNET_ROOT=$HOME/dotnet
# export PATH=$PATH:$HOME/dotnet
# echo 'export DOTNET_ROOT=$HOME/dotnet' >> ~/.bashrc
# echo 'export PATH=$PATH:$HOME/dotnet' >> ~/.bashrc
```

インストールが終わったので動作を確かめてみましょう。

```
# dotnet --version
6.0.403
$ dotnet new mvc -o App
$ cd App
$ dotnet run
Building...
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {4fccf8d4-466d-4c48-aa11-1a9173579896} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7036
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5124
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /root/App/
```

無事起動出来たら、ウェブブラウザーで`https://localhost:7036`に接続すると結果を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/77e96445-52dc-3a13-206f-4c0c2a37c606.png)

インストールが確認出来たら、TARボールは削除しておきましょう。

```
# rm dotnet-sdk-6.0.100-linux-arm64.tar.gz
```

# CodeServer のインストール

続けてAndroid単体でコードを修正しやすくするためにCodeServerをインストールしていきます。
CodeServerを動作させるにはnodeが必要です。直にインストールしてもよいのですが念のためnvm経由にしておきましょう。
インストールしたら一度Ubuntuからログアウトして、再度ログイン後にnodeをインストールします。

```
# wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
# exit
$ proot-distro login ubuntu
# nvm install 14
# nvm use 14
```

CodeServer をインストールして起動して、ウェブブラウザーで`http://localhost:8080`を表示するとCodeServerのログイン画面が表示されます。

```
curl -fsSL https://code-server.dev/install.sh | sh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/44ebc109-4b27-f702-9e01-8bdc4b6a43b3.png)
パスワードが不要な場合は、一度コンソールにもどり`Ctrl+C`でCodeServerを停止した後に`~/.config/code-server/config.yaml`を次のように修正します。

```diff_yaml:~/.config/code-server/config.yaml
bind-addr: 127.0.0.1:8080
-auth: password
+auth: none
password: xxxxx
cert: false
```

設定変更後CodeServerを起動すればパスワードなしでログインできます。

```
# code-server
```

ここまでくれば、コードを修正したりターミナルで処理を実行したりと通常の開発作業ができるようになりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/a92b8654-a5c0-49fd-d03e-8c723bf4696a.png)

# おわりに
やってみると意外と簡単に構築できました。
まぁ、ビルドの時間など気になることはありますけれど、Androidで.NETがビルドできることに比べれば大したことは無いですね！