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

Android

Android 17 版 Pixel の Linux ターミナル

Android 17 にアップグレードしたところ、ターミナル機能 (Linux 開発環境) でメモリ容量を選べるようになっていました。前はスマートフォン本体の RAM 容量にかかわらず 4GB 固定だったので使いやすくなってます。下の画面は Android 17 に更新した Pixel 10 Pro です。10.9 GB まで増やせるようです。

RAM が 8GB しかない Pixel 9a ↓でも 5.2 GB まで選べるようになっていました。

スマートフォンSoCGPU物理 RAM 容量Linuxの最大容量
Pixel 10 ProTensor G516GB10.9 GB
Pixel 9aTensor G48GB5.2 GB

Linux ターミナル機能とは

Pixel スマートフォンに搭載されている Linux 仮想マシンです。CLI だけでなく GUI にも対応しており、開発環境を構築したり Linux のアプリケーションを走らせる事ができます。

Linux ターミナル の有効化方法

有効化方法 (インストール方法) はこれまでと同じです。Android の設定の「システム」→「開発者向けオプション」から「Linux 開発環境」を有効化します。これでアプリケーションドロワーに「ターミナル」アプリが追加されます。もし開発者向けオプションが見つからない場合は、設定の「デバイス情報」→「ビルド番号」を 7回以上タップしてください。

GUI 画面でマウスカーソルが表示されない場合は以下のコマンドを実行してください。

sudo apt update
sudo apt upgrade -y
sudo apt install xcursor-themes

タッチアイコンが ON の場合は、タッチパッドのようにマウスカーソルを操作できます。ダブルタップのあとドラッグするとウィンドウの移動やリサイズできます。Bluetooth マウスやキーボードも利用できます。

メモリを増やして大きなアプリケーションを動かせますし、逆に RAM が少ない機種の場合は減らして安定動作優先にするのも良いかもしれません。

関連ページ

Arm CPU の INT8 TOPS 値も計測してみる

前回の x64 VNNI 命令の TOPS 計測に続いて ARM CPU の TOPS 値も求めてみました。vfpbench による実測です。

結果

SoCarchCore数命令INT8 tops
Snapdragon 8s Gen 4v8.2A X4 A720 A720 A7201+2+3+2I8MM4.200 TOPS
Tensor G5 (Pixel 10 Pro)v9.2A X4 A725 A5201+5+2I8MM3.173 TOPS
Snapragon 7+ Gen 3v8.2A X4 A720 A5201+4+3I8MM2.400 TOPS
Tensor G4 (Pixel 9a)V9.2A X4 A720 A5201+3+4I8MM2.202 TOPS
Snapdragon 6 Gen 1V8.2A A78 A554+4 DotProd0.789 TOPS

INT8 TOPS で最も演算能力が高かったのは Snapdragon 8s Gen4 で、CPU だけでも 4.2 TOPS 出ています。同じ 8 core でも Snapdragon 8s Gen4 はすべて big Core なので、その分演算能力が高くなっています。

前回の x64 CPU の結果と比べると以下のとおり。SIMD 幅が 128bt の Mobile Arm CPU でも INT8 演算能力は Desktop CPU と比べて遜色ないレベルに見えます。これは Arm CPU が VNNI のような内積命令だけでなく、Matrix の乗算命令 I8MM を持っているためです。

CPUArchCore数命令INT8 TOPS
Ryzen AI Max+ 395Zen516C 32TAVX512-VNNI20.482 TOPS
Ryzen 7 9700XZen58C 16TAVX512-VNNI10.699 TOPS
Core i7-13700RaptorCove16C 24TAVX-VNNI5.456 TOPS
Ryzen 7 7840HSZen48C 16TAVX512-VNNI4.713 TOPS
Snapdragon 8s Gen 4X4 A7208C 8TI8MM4.200 TOPS⭐️
Ryzen 7 5700XZen38C 16TAVX23.547 TOPS
Ryzen 9 3950XZen216C 32TAVX23.178 TOPS
Tensor G5 (Pixel 10 Pro)X4 A725 A5208C 8TI8MM3.173 TOPS⭐️
Snapdragon 7+ Gen 3X4 A720 A5208C 8TI8MM2.400 TOPS⭐️
Tensor G4 (Pixel 9a)X4 A720 A5208C 8TI8MM2.202 TOPS⭐️
Ryzen 7 4750GZen28C 16TAVX21.629 TOPS
Snapragon 6 Gen 1A78 A558C 8TDotProd0.789 TOPS⭐️
Intel N97Gracemont4C 4TAVX-VNNI0.366 TOPS

I8MM 命令

x64 の VNNI に相当する命令は Arm にも搭載されており DotProd (udot/sdot) です。DotProd は 32bit 単位で 4要素同士の内積を行います。128bit で 32 iops になります。

I8MM 命令 (smmla/ummla/usmmla) は 2×8と 8×2 のマトリクス乗算が可能で、それぞれ各 8bit 値が 2回ずつ利用されます。64bit 単位、8要素の内積を 4組実行します。128bit で 32個の積和演算が可能で、命令あたりの演算回数は 64 iops となります。レジスタへの再転送なしに DotProd と比較して 2倍の演算ができるわけです。

また結果を見ると Cortex-X4 の場合 DotProd/I8MM は同時に 4命令実行可能であることがわかります。以下は Google Tensor G5 (Pixel 10 Pro) の Cortex-X4 の結果からの抜粋です。

Cortex-X4                             TIME(s)   MFLOPS      MOPS     IOP   IPC
NEON smmla.4s  (int8 x16) n12     :    0.272   799709.3    12495.5  ( 64.0 3.3)
NEON ummla.4s  (int8 x16) n12     :    0.227   959218.0    14987.8  ( 64.0 4.0) ⭐️
NEON usmmla.4s (int8 x16) n12     :    0.225   966448.1    15100.8  ( 64.0 4.0) ⭐️
NEON sdot.4s   (int8 x16) n12     :    0.225   483251.9    15101.6  ( 32.0 4.0)
NEON udot.4s   (int8 x16) n12     :    0.225   483342.0    15104.4  ( 32.0 4.0)

よって CPU Core あたり最大 256 iops となり、これは AMD Ryzen Zen5 の AVX512-VNNI に匹敵します。

ただしこれだけ強力なのは Prime Core の X4 だけで、Mobile SoC の場合は大抵 1~2 core しか搭載されていません。Cortex-A725/A720 の場合は半分の同時 2命令、LITTEL Core (E-Core) の Cortex-A520 の場合は 2 Pipe が 2 CPU で共有されているため実質 1 命令です。

下の表は CPU Core 毎の INT8 演算能力の比較です。

CPU Core対応命令bit幅clockあたりCORE あたりの演算数
Cortex-X4I8NN128bitx4256 iops
Cortex-A725/A720I8NN128bitx2128 iops
Cortex-A520I8NN128bitx1 (実質)64 iops
Zen5AVX512-VNNI512bitx 2256 iops
Zen4AVX512-VNNI512bitx 1128 iops
RaptorLake (RaptorCove) P-CoreAVX-VNNI256bitx 2128 iops
AlderLake-N (Gracemont) E-CoreAVX-VNNI256bitx 0.532 iops

BF16 命令

TOPS とは直接関係ないのですが、AI 向けの演算命令として bfloat16 命令があります。bfloat16 は 16bit の浮動小数点フォーマットの一種で、一般的な fp16 の s10e5 ではなく s7e8 になります。仮数部の精度は 8bit しかありませんが、その代わり指数部のレンジも 8bit あり fp32 と同等です。

Arm CPU には I8MM 同様 bfloat16 にも 2×4 と 4×2 のマトリクス乗算命令 bfmmla があります。結果は fp32 です。fp16 には同等の命令がないので、16bit のピーク FLOPS 値は fp16 よりも bfloat16 の方が高くなっています。

単純に考えると bit 数が倍なので 8bit I8MM の半分のレートになるように見えますが、結果を見ると 8bit int の 1/4 となっています。以下は Tensor G5 の Cortex-X4 の結果の抜粋です。INT8 が 966 TOPS なのに対して BF16 はおよそ 1/4 の 230~250 FLOPS となっています。

Cortex-X4
Group 2:  Thread=1  Clock=3.782000 GHz  (mask:80)
  SingleThread HP   max:   181.306 GFLOPS     INT8  3/16
  SingleThread SP   max:    90.649 GFLOPS     INT8  3/32
  SingleThread DP   max:    45.310 GFLOPS     INT8  3/64
  SingleThread BF16 max:   253.620 GFLOPS     INT8  1/4
  SingleThread INT8 max:   966.281 GOPS       INT8
  MultiThread  HP   max:   138.243 GFLOPS
  MultiThread  SP   max:    67.191 GFLOPS
  MultiThread  DP   max:    45.303 GFLOPS
  MultiThread  BF16 max:   229.727 GFLOPS
  MultiThread  INT8 max:   966.448 GOPS

Cortex-X4 の bfmmla 命令は I8MM の smmla/ummla/usmmla とは異なり同時に 2命令しか実行できないことが原因です。以下は Cortex-X4 の bfmmla 命令の抜粋です。

Cortex-X4                             TIME(s)   MFLOPS      MOPS     FOP   IPC
NEON bfmmla.4s (bf16 x8) n12      :    0.429   253620.4     7925.6  ( 32.0 2.1) ⭐️
NEON bfdot.2s (bf16 x4) n12       :    0.451    60410.1     7551.3  (  8.0 2.0)
NEON bfdot.4s (bf16 x8) n12       :    0.368   148077.4     9254.8  ( 16.0 2.4)

ちなみに fp16 命令 (HP) は 181 GFLOPS と INT8 の 3/16 になっています。Cortex-X4 の浮動小数点積和命令は 3命令同時に実行できるため、4命令実行可能な I8MM と比べて (3/4) ✕ (16 iop / 64 iop) = 3/16 となります。

Cortex-A725/A720 の場合は INT8 も BF16 も同じ 2命令なので、BF16 はちょうど 1/2 となっています。また浮動小数点積和も 2命令で同じなので、fp16 (HP) もぴったり 1/4 です。

Cortex-A725
Group 1:  Thread=5  Clock=3.052000 GHz  (mask:7c)
  SingleThread HP   max:    97.521 GFLOPS
  SingleThread SP   max:    48.758 GFLOPS
  SingleThread DP   max:    24.377 GFLOPS
  SingleThread BF16 max:   194.937 GFLOPS
  SingleThread INT8 max:   390.017 GOPS
  MultiThread  HP   max:   487.591 GFLOPS     INT8  1/4
  MultiThread  SP   max:   243.788 GFLOPS     INT8  1/8
  MultiThread  DP   max:   121.888 GFLOPS     INT8  1/16
  MultiThread  BF16 max:   917.726 GFLOPS     INT8  1/2
  MultiThread  INT8 max:  1950.065 GOPS       INT8

Cortex-A520 の場合は bfmmla は一つの ALU を複数コアで共有しており、シングルスレッド時に 1命令、マルチスレッドでは 0.5 に半減します。実測値を見ると理論値よりも値が小さくなっていますが、おそらくレイテンシが大きいためだと思われます。

Cortex-A520                           TIME(s)   MFLOPS      MOPS     FOP   IPC
NEON bfmmla.4s (bf16 x8) n12      :    1.264    51177.2     1599.3  ( 32.0 0.7)
NEON bfdot.2s (bf16 x4) n12       :    0.929    17408.1     2176.0  (  8.0 1.0)
NEON bfdot.4s (bf16 x8) n12       :    0.927    34897.8     2181.1  ( 16.0 1.0)

Aarm A520 のマニュアルによると Exec Latency は 14~15 cycle となっており、また bfloat16 の演算は VMAC と VALU を両方占有する特殊な命令であることもわかります。

まとめ

Arm CPU も AI 向けの演算命令が強化されており、高い演算能力を持っていることがわかります。今後 SME/SME2 によってさらにマトリクス演算命令は強化されていくようです。Apple M4 以降や C1 ではすでにこれらの命令が搭載されているため、さらに高いスループットが得られるものと思われます。

計測データのリンク

関連ページ

vfpbench のカテゴリ一覧

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 以外の対応も待ち遠しいです。