Android」カテゴリーアーカイブ

Android

Android 16 の Pixel 付属の機能で GPU 対応の Linux Desktop を使う

Google Pixel シリーズ用 Android 16 には試験機能として Linux のコマンドライン開発環境が入っています。2025年 12月の更新で Linux の GUI アプリケーションも実行できるようになっていたので試してみました。機種依存ですが GPU によるハードウェアアクセラレーションにも対応しているようです。

Android Developers Blog: Android 16 QPR2 is Released

↓ Pixel 10 Pro 上で Firefox, gimp, vscode を起動してみたところ。外部ディスプレイではなく Pixel の実機画面です。

Pixel 10 Pro 上で Firefox, gimp, vscode を起動してみたところ

↓ Pixel 10 Pro は GPU アクセラレーションに対応

Pixel 9a にはこの設定が無く、ソフトウエアレンダラが使われているようです。Linux の GUI アプリケーション自体は 9a でも実行できます。

Linux ターミナルのインストール

  1. 画面自動消灯の時間を 30分に変更
    • 設定 → ディスプレイとタップ → 画面自動消灯 → 30分を選択
    • ※ インストールが完了したら元の時間に戻しておいてください
  2. 開発者向けオプションを有効化
    • 設定 → デバイス情報 → ビルド番号 の欄を 7回タップ
  3. 開発者向けオプションから Linux ターミナルを有効化
    • 設定 → システム → 開発者向けオプション → Linux開発者環境 (試験運用版) を有効化
    • これで Pixel に「ターミナル」アプリが追加されます
  4. Linux のインストール
    • 「ターミナル」アプリを起動して「インストール」をタッチ
    • ホーム画面には自動的に追加されないので、アプリケーションドロワーから「ターミナル」のアイコンを探してください
  5. ターミナルが起動したら以下のコマンドを実行
sudo apt update
sudo apt upgrade -y
sudo apt install fonts-noto-cjk

これで Linux ターミナルが使えるようになります。GUI アプリケーションも利用可能です。

また以前のバージョンとは異なり、Linux 向けストレージの容量制限がなくなっていました。そのため設定からストレージサイズをいちいち拡張する必要はなく、そのまま利用することができます。

※ 画面の自動消灯時間を元に戻しておくのを忘れないようにしてください。

GUI アプリケーションの利用

ターミナルアプリの右上 (赤枠部分) に GUI アプリケーション用のボタンがあります。

最初は真っ黒で何も表示されていませんが、GUI アプリケーションを起動するとこのエリアに表示されます。CLI ターミナルとは別物で、ソフトキーボードの仕様も違います。Adnroid の「戻る」操作でターミナルに戻ります。

右端にマウスらしきアイコンがありますが、ソフトウエアマウスではないので注意。これは外部接続した Bluetooth / USB マウスを Linux 側でキャプチャするかどうかの切り替えです。

デフォルトでは Android 側のマウスカーソル(↓下の画像)が表示されます。この場合左ボタンしか反応せず、カーソルも Linux 画面外に移動可能で Android の操作ができます。

マウス切り替えのボタンをタッチすると Linux VM のマウスカーソル(↓下の画像)の直接操作になり、右ボタン、中ボタンが使えるようになります。カーソル移動範囲も Linux GUI 画面内に制限されます。GUI アプリケーションの操作時はこちらに切り替えておくことをお勧めします。

横全画面に切り替えた場合はソフトウエアキーボードが使えないので、Bluetooth / USB のキーボードやマウスが必要です。Android の「戻る」操作で元の画面に戻ります。

Linux 版 firefox を使ってみる例

ターミナル側で以下のコマンドを実行します。

sudo apt install firefox-esr -y
firefox-esr

これだけでは何も表示されないので右上のアイコンから GUI アプリケーション画面を開きます。以下のように起動できていることがわかります。

画面タッチでも使えますがマウスがないと細かい操作ができません。GUI 画面上で Firefox のウィンドウを閉じられない場合は、ターミナル側から Ctrl + C で止めてください。

Linux Desktop を試す

例にあげた firefox のように、そのまま起動すると全画面になります。複数のアプリケーションを実行できるように設定を変えてみます。

(1) /etc/systemd/user/weston.service を編集

「ExecStart=」の行があるので、--shell= 以降行末までを desktop に置き換えます。

ExecStart=/usr/bin/weston --modules=systemd-notify.so --xwayland --shell=kiosk-shell.so --continue-without-input

↓以下のように変更

ExecStart=/usr/bin/weston --modules=systemd-notify.so --xwayland --shell=desktop

(2) ~/.config/weston.ini を以下の内容で作成

[shell]
locking=false
panel-position=bottom
panel-height=32
fullscreen=false

panel の位置を下に移動したのは、一部のアプリケーションでタイトルバーに重なってウィンドウ操作ができなくなるためです。

(3) 一旦ターミナルアプリを終了します

すべてのターミナルで exit を実行して Linux ターミナルアプリを閉じます。Android の通知領域に以下のように「ターミナルを閉じています」と表示されている場合は、この通知が消えるまで待ってください。

(4) ターミナルアプリを再起動します

通知が消えて完全に終了したことを確認したら、再びターミナルを起動して GPU アプリケーション画面を開きます。しばらくすると weston のシンプルな Linux デスクトップ画面が表示されています。

  • 最初画面が真っ暗で何も表示されていない場合はしばらく待ってみてください。
  • それでも表示されない場合は画面のタッチ、外部接続マウスの操作やマウス切り替えボタンのタッチ、横全画面に切り替えてから「戻る」などの操作を行ってみてください。一定時間操作が無いために画面が暗転していることがあります。

画面が表示されたら、以下のようにタスクバー左端のアイコンから GUI 版ターミナルを開くことができます。

これで Linux の GUI アプリケーションをウィンドウモードで起動することができるようになります。

気がついたことなど

「GPU アクセラレーテッド レンダラ」の場合、アプリケーションによっては表示が崩れることがあります。Firefox など。「ソフトウエアレンダラ」に切り替えると安定します。

ソフトウエアレンダラの場合は Linux 側のマウスカーソルの追従が悪くなるようです。少々操作しづらいですが、ウィンドウの移動や範囲のドラッグなどマウス左ボタン押しながらの操作はスムーズなので描画が遅いわけではないようです。

ストレージ容量の制限はなくなりましたが、Linux VM 側で利用可能な RAM は以前と変わらず 4GB のままのようです。Pixel 10 Pro (RAM 16GB) でも Pixel 9a (RAM 8GB) でも同じ 4GB でした。

GUI アプリケーション側のソフトキーボードは、ターミナル側と操作方法が若干違います。Ctrl などの修飾キーがロックされずに同時押しです。

以下は Pixel 9a で firefox, gimp, vscode, blender を起動してみたところです。(ソフトウエアレンダラ)

Pixel 9a で firefox, gimp, vscode, blender を起動してみたところ

まだ不安定な部分もありますが、今後いろいろと改良されていくものと思われます。使用できるアプリケーションも増えますし、Pixel スマートフォン単体だけで PC のように使えるのは魅力的です。

Pixel 9a Tensor G4 の浮動小数点演算能力と Linux ターミナル

Pixel 9a で vfpbench を走らせてみました。vfpbench は CPU の浮動小数点演算能力の理論的なピーク値に焦点を当てたベンチマークです。

以下の表は Pixel 8/8a との比較のための抜粋です。動作クロックが上がっている分だけシングル性能は高いはずですが、1コア減っているためマルチスレッドでは差がつきません。Pixel 8 比では全体的に低い値になっています。Pixel 8a の Single (Cortex-X3) の値が極端に低いですが、おそらく測定時に発熱で制限(サーマルスロットリング)がかかり、クロックが上がらなかったためと思われます。

fp32 SingleFP32 MULTIFP64 SINGLEFP64 MULTI
Pixel 869.7 GFLOPS281.9 GFLOPS28.0 GFLOPS139.6 GFLOPS
Pixel 8a37.7 GFLOPS245.1 GFLOPS18.8 GFLOPS122.2 GFLOPS
Pixel 9a67.9 GFLOPS256.5 GFLOPS33.8 GFLOPS127.4 GFLOPS
SINGLE = Single Thread、MULTI = Multi Thread

全部のデータはこちらで参照できます。

個々の命令の特性を見ると、クロックあたりのピークの浮動小数点演算能力はほぼ同等で特性もかなり似通ったものになっていることがわかります。

Tensor G4 自体は G3 と比べると CPU コアの世代が上がっています。以下は CPU コアの比較表です。

TENSOR G1TENSOR G2TENSOR G3TENSOR G4
PrimeX1 (x2)X1 (x2)X3 (x1)X4 (x1)
BigA76 (x2)A78 (x2)A715 (x4)A720 (x3)
LittleA55 (x4)A55 (x4)A510 (x4)A520 (x4)

Tensor G3 で唯一 32bit 命令2対応していた A510 が無くなり、Tensor G4 では完全に 64bit 命令のみ対応の CPU コアに置き換わりました。Tensor G4 では ARM の 32bit 命令のプログラムは動きません。ARM の各 CPU コアの 32bit 命令対応についてはこちらの記事を参照してください。

もっとも、OS としては Pixel 7 の Tensor G2 世代から 32bit アプリケーションには非対応となっており、すでに完全に 64bit に置き換わっています。そのため 32bit 対応コアがなくなっても影響はありませんのでご安心ください。

vfpbench の話しに戻ります。Tensor G4 の LITTLE コア A520 は 4個搭載されていますが、シングル時の浮動小数点演算性能に対して、4コアマルチスレッドでも 4倍ではなく 2倍にしかなっていません。 以下は LITTLE コアだけの比較になります。

FP32 SINGLEFP32 MULTIFP64 SINGLEFP64 MULTI
Pixel 7a (A55)14.0 GFLOPS54.7 GFLOPS7.0 GFLOPS27.8 GFLOPS
Pixel 8 (A510)27.1 GFLOPS61.3 GFLOPS13.5 GFLOPS29.1 GFLOPS
Pixel 8a (A510)27.0 GFLOPS56.6 GFLOPS13.5 GFLOPS28.0 GFLOPS
Pixel 9a (A520)30.9 GFLOPS62.7 GFLOPS15.4 GFLOPS31.7 GFLOPS
SINGLE = Single Thread、MULTI = Multi Thread

例えば Pixel 9a (A520) の FP32 SINGLE は 30.9 GFLOPS ですが、FP32 MULLTI でも約 2倍の 62.7 GFLOPS しかありません。これは A520 が A510 と同じように 2コアで浮動小数点演算ユニットを共有しているためだと考えられます。

A55 時代の Pixel 7a (Tensor G2) では Multi 時のスコアに対して Single の値が 1/4 になっています。つまり A510/A520 は A55 と比べて Single 時の性能が 2倍になっているわけです。

また LITTLE コアだけの比較では Pixel 8/8a の G3 よりも Pixel 9a の G4 の方が速度が上がっています。それぞれクロック差の影響がきちんとスコアに反映されています。同様に同じ G3 を搭載した Pixel 8 と 8a のパフォーマンスも同等です。LITTLE コアは電力効率が良いためにサーマルスロットリングの影響を受けなかったのだと思われます。

A510 におけるコアの共有についてはこちらで解説しています。

Linux 開発環境 (ターミナル) が 9a で使えないことについて

Pixel 9a を実際に使ってみて少々予想外だった点は、Linux 開発環境 (ターミナル) 機能が使えなかったことです。

「Linux 開発環境」は Pixel の OS に標準で含まれている Linux のコマンドラインの動作環境です。ChromeOS の同名の機能、もしくは Windows の WSL に相当します。Linux 開発環境 (ターミナル) 機能については以下の記事で解説しています。

おそらく使えないのは発売当初だけで、将来の OS 更新によって Pixel 9a でもサポートするのではないかと思われます。

幸いなことに、発売したばかりの Pixel 9a も Android 16 のベータプログラムに含まれていることがわかりました。Pixel 9a でも Android 16 Beta 4 をインストールすると、開発者向けオプショにから Linux 開発環境を有効にすることができました。

どうしても今すぐ Pixel 9a で Linux を使いたいという場合はベータプログラムを利用するのも一つの手かもしれません。もちろんメインのスマートフォンとして使用している場合はお勧めしません。

Android 上で動く Linux 開発環境 (ターミナル)

スマートフォン Pixel の新しい OS 更新 (Android 15 2025/03/05 BPA1A.250305.019) で Linux 開発環境 (ターミナル) が使えるようになりました。まだ試験運用版 (Experimental) なので制限もありますが、普通のスマートフォン上で Debian の仮想マシンが動いています。Chromebook (ChromeOS) の Linux 開発環境や Windows の WSL2 と同じように Linux 向けのアプリケーションをそのまま走らせることができます。

以下の手順や注意事項は 2025/03 (試験運用) 版のものです。今後更新によっていろいろ変わる可能性があります。

有効化手順

  1. 作業中はスリープしないように、先に自動消灯時間を変更しておくことをお勧めします
    • 設定 → ディスプレイとタップ → 画面自動消灯 → 30分に変更
    • インストールや初期設定が終わったら元に戻してください
  2. もしまだ「開発者向けオプション」が有効になっていない場合以下の手順で有効化します
    • 設定 → デバイス情報 →「ビルド番号」を何度か(7回)タップして「開発者向けオプション」を有効化
  3. Linux 開発環境を有効化します
    • 設定 → 開発者向けオプション → Linux 開発環境 →「Android で Linux ターミナルを実行する」を On
  4. これでアプリ一覧 (アプリドロワー) に「ターミナル」アプリが追加されるので「ターミナル」アプリを起動します
  5. 初回は「インストール」をタップして 565MB のデータをダウンロードします
    • ダウンロードに時間がかかりますが、そのまま画面を切り替えないようにしてください
    • インストールが終わり「ターミナルを準備しています」の画面が始まったらコンソール画面になるまでしばらく待ちます
    • ターミナルが起動して Debian のコンソール画面になります
  6. ストレージサイズの変更 (オプション)
    1. デフォルトでは 5.9GB しか割り当てられていないので、先にストレージサイズを増やしておくことをお勧めします。不要な場合はスキップして構いません。
    2. ターミナルで以下のコマンドを実行
      • sudo halt
    3. 「Press ↲ to Recoonect」と表示されたらターミナルの右上の設定アイコン(歯車)をタップ
    4. 「ディスクサイズを変更」を選択し、5.9 GB から最大の 16GB まで増やして「適用」
    5. 自動的にターミナルが終了します
    6. もう一度ターミナルアプリを起動します
      • もしここで「修復不可能なエラー」と表示されてもリカバリしないでください
      • 一旦ターミナルアプリをタスク管理画面で終了させてから起動し直すと正常に繋がります
  7. 以下のコマンドを入力して OS の更新をします
    • sudo apt update ; sudo apt upgrade -y
    • 時間がかかりますが、終わるまでスリープさせずそのままの画面を維持しておいてください
  8. 更新が終わったら 1. で行った画面の自動消灯時間設定を元に戻します。

あとはそのまま Linux 環境として使えます。Docker も使えますので様々なアプリケーションを走らせることが可能です。Bluetooth キーボードがあると便利かもしれません。

※ 画面の自動消灯時間設定を元に戻すのを忘れないようにしてください。

トラブル対策など

ターミナルアプリと VM は別のプロセスですが連動もしています。おそらくターミナル起動時に VM が立ち上がり、終了すると VM も終了するようになっているようです。ただし VM が先に終了してターミナルだけ起動している状態になると Reconnecting 表示のまま進まなくなります。この場合はターミナルを起動し直してください。

修復不可能エラー画面が表示されても、よほどのケースでない限りリストアは不要なようです。リストアしても、同じ手順を行うと結局同じ状態になってしまうので、まずはターミナルの再起動を優先してください。

初期ストレージサイズが 5.9GB しかないため、大きなアプリケーションをインストールしようとすると途中でストレージがあふれてしまうことがあります。いろいろインストールを考えている場合は先に最大の 16GB まで拡張しておくことをお勧めします。

メモリ (RAM) を多く消費している状態で他のアプリに切り替えたりバックグラウンドに移行すると、VM のプロセス自体が kill されてしまうことがあります。インストール途中で強制切断されると中途半端な状態になってしまうので、初回のインストールや更新中は画面を切り替えないようにしてください。

その他気がついたこと、制限など

本体ストレージへのアクセス

/mnt/shared で本体ストレージの Downloads にアクセスできるようです。Android 側のブラウザでダウンロードしたファイルにアクセスすることができます。

また VM のストレージサイズが 16GB に制限されているので、大きなデータファイルをこちらに置いておくと容量を節約できるかもしれません。

RAM 容量

Pixel 8 (VRAM 8GB) を使用していますが、Linux VM 側で使用可能なメモリは 4GB 固定でした。そのためメモリを大量に使うコマンドは、Termux 上では動作するものの Linux VM (Linux 開発環境) ではメモリ不足で実行できない場合があります。

実際に Termux 上では ollama を使って LLM の gemma3:4b (6.4GB) を起動できますが VM 側 (Linux 開発環境) ではメモリ不足で読み込めませんでした。qwen2.5:3b (2.6GB) は動きます。

もしかしたら RAM を 12GB/16GB 搭載している他のデバイスではメモリ割り当てが異なってるかもしれません。

CPU は Tensor G3 の 9 コア全部有効になっています。

ターミナル

ターミナルはブラウザ上で動いているようです。

ターミナルを複数画面開くことはできませんが、sshd を起動して Android の ssh Terminal アプリや Termux を使えば複数のコンソール画面を使い分けることができます。なお ssh 接続する場合はデフォルトユーザーの droid にパスワードを設定しておく必要があります。

  1. sudo apt install openssh-server
  2. sudo passwd droid

自分の環境では VM に 192.168.0.2 が割り当てられていました。ssh Terminal アプリなどから droid@192.168.0.2 でログインできます。Termux の場合「ssh 192.168.0.2 -l droid」です。

リモート接続

VM にはプライベート IP が割り当てられているためスマートフォンの 外部からはそのままでは繋がりません。PC 等から ssh 接続したい場合は Termux を踏み台にしたり、VM 側から ssh でトンネルを作る必要があります。

VM 側
$ ssh -l <PCUSER> -R 9022:127.0.0.1:22 <PCIPADDR>

PC 側
$ ssh -p 9022 -l droid 127.0.0.1

私は VM 側 (Linux 開発環境) に Linux 版 Tailscale をインストールして接続しています。

対応機種

現時点では Google Pixel (Android 15) のみとなっているようです。

OS 標準の Linux 環境なので、特別なアプリをインストールしたり複雑な設定なしに使えるのは非常に便利です。まだ不安定な部分はありますが、利用できるアプリケーションの幅がだいぶ広がりました。スマートフォンには高性能な端末も多いので、Pixel 以外の対応も待ち遠しいです。

ARM CPU の 64bit/32bit 命令対応

最近の ARM CPU Core は 32bit 命令への対応が徐々に無くなりつつあり 64bit 命令のみ動作するようになっています。

Apple はすでに iOS11 の段階で 64bit に完全移行しており 32bit のアプリが動作しません。同時にプロセッサも 32bit 命令が廃止されており、Apple A11 (iPhone8/X) 以降は AArch32(ARMv7) 命令非対応となっています。

同じように ARM の CPU Core も完全な 64bit 化が進んでいます。ARM Core の世代と 32bit/64bit への対応状況をまとめてみました。

ARMv8 世代の CPU までは 32bit/64bit 両方の命令に対応していますが、ARMv9 世代になってからは段階的に 32bit 命令が廃止されてきていることがわかります。

Apple の watchOS のように、ILP32 で 32bit OS ながら対応命令が 64bit (AArch64) のみとなっているものもあります。(詳しくはこちら「Apple Watch Series 6 と CPU 性能の測定」)

関連エントリ

Android UserLAnd の日本語環境

Debian が Buster になっているので、1年前と比べて mozc の install が簡単になりました。Ubuntu と同じ手順でインストールできます。Wiki の手順を更新しました。

SSH + uim-mozc
VNC + fcitx-mozc

UserLAnd は Android 端末内に Linux 環境を構築するためのアプリです。Chromebook (ChromeOS) が Linux アプリに対応したり Windows 10 が WSL をサポートするのと同じように、共存しながら Android 上で Linux のソフトが走るようになります。

GitHub: UserLAnd

● lxde + VNC で mozc の環境を作る

◎ 1. UserLAnd を起動したら Debian または Ubuntu を選択。

◎ 2. Username, Password, VNC Password を入力して SSH を選択する

◎ 3. Terminal にログインして下記のスクリプトを実行

#!/bin/sh
. /etc/os-release

if [ "$ID" = "ubuntu" ];then
sudo apt update
sudo apt -y upgrade
sudo apt -y install lxde
sudo apt -y install language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8
sudo apt -y install fcitx-mozc
sudo dpkg-reconfigure tzdata
fi

if [ "$ID" = "debian" ];then
sudo apt update
sudo apt -y upgrade
sudo apt -y install lxde
sudo apt -y install task-japanese
sudo apt -y install task-japanese-desktop
sudo dpkg-reconfigure locales
. /etc/default/locale
sudo apt -y install fcitx-mozc
sudo apt -y install dbus-x11
sudo dpkg-reconfigure tzdata
fi

if [ "$GTK_IM_MODULE" = "" ]; then
cat >> $HOME/.profile <
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
END
fi

ファイルに保存してから下記のように実行する。時間がかかります。

$ sh ./userland_fcitx.sh

◎ 4. 途中でいくつか選択肢あり

・Debian か Ubuntu かによって若干違います。選択例は Debian の場合です。

・[More] が出たら Enter (改行) キーで進めてください。

・以下選択例です。必ずしも下記の通りでなく環境に合わせて選んでください。(番号が異なっている場合があります)

Keyboard layout: 21  (Other)
 ↓
Country of origin for the keyboard: 55  (Japanese)
 ↓
Keyboard layout: 6  (Japanese - OADG 109A)

Users to add to the netdev group: 1

Locales to be generated: 285  (ja_JP.UTF-8 UTF-8)
 ↓
Default locale for the system environment: 3  (ja_JP.UTF-8)

地理的領域: 6  (アジア)
 ↓
時間帯: 79  (東京)

◎ 5. 解像度を選択します。

~/.vncrc に解像度が書き込んであるので任意の値に変更してください。

ハイエンドスマートフォンの場合、デフォルトだと文字が小さすぎる場合があるので最初に変更しておくことをおすすめします。

$geometry = "1280x720";

◎ 6. 一旦 exit

終了して UserLAnd のメイン画面に戻ります。

$ exit

◎ 7. SSH から VNC に変更して起動し直します。

 ・UserLAnd のメイン画面に戻ったら、Debian (または Ubuntu) を長押しして「Stop App」

 ・もう一度同じ場所を長押しして「App Info」を選択し、VNC を選択 (SSH → VNC)

 ・UserLAnd のメイン画面から Debian (または Ubuntu) を起動

◎ 8. bVNC Free をまだインストールしていない場合はストアに飛ぶのでインストール

 インストール完了したらもう一度 UserLAnd から起動する

◎ 9. VNC が起動するが lxde のデスクトップにならない場合は一旦手動で起動する

 コンソールから lxsession を実行する。

$ lxsession &

エラーダイアログが1つ出ますが無視して構いません。

また下記の内容で ~/.xsessionrc を作っておく。

. ~/.profile
lxsession &

◎ 10. メニューから LXTerminal を開く

 左下のアプリケーションメニューから「システムツール」→「LXTerminal」

◎ 11. LXTerminal 内で fcitx-autostart を実行

$ fcitx-autostart

◎ 12. fcitx の設定の確認

・左下のアプリケーションメニューから「設定」→「Fcitx 設定」

・「全体の設定」タブ→「入力メソッドのオンオフ」で任意のキーを選択する

・Android 9.0 以降は CTRL + SPACE が使えないので注意。

・切り替えキーが正しく反応するかどうかは LXTerminal 上で確認できます。

●その他

もし fcitx が自動で立ち上がらない場合 (毎回手動で fcitx-autostart を呼び出さないと日本語が入力できない場合) は、自動起動に登録してください。

・左下のアプリケーションメニューから「設定」→「LXSession のデフォルトアプリケーション」
・「自動立ち上げ」タブ→ 「+Add」の欄に “fcitx-autostart” を入れてから [+Add]

細かいメニューボタンの選択は、bVNC Free の「入力モード」→「タッチパッドシミュレーション」が便利です。

関連ページ
HYPERでんち: UserLAnd

関連エントリ
Android UserLAnd で PyTorch を使う。C++ API
Huawei P30 Lite/Fire HD 10(2019) のコンパイル速度と UserLAnd
Android: UserLAnd + Termux を Note PC 代わりに使う
Oculus Quest も文章書き&開発マシンにする
Android UserLAnd の更新と VNC 画面設定
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用
Android 9.0 と Bluetooth Keyboard による日本語入力
Android で動く Linux 環境 UserLAnd が XServer XSDL に対応
Oculus Go を文章書き&開発マシンにする