Chrome OS FlexにAndroid環境を構築する

前回、ROG Ally上にSteamOSをインストールし、さらにその上で動作するWaydroidと呼ばれるAndroidエミュレータを見事動作させることができるようになりました。これができるなら、Chrome OS Flexでも使えるのでは?ということで調べてみるとできるらしい。

そうなればAndroid環境のないChrome OS Flexに大きなアドバンテージを加えることができます。そこで今回は、ChromeOSに対して、Waydroidをインストールし実行してみようと思います。

今回利用するツール等

但しこの手法が使えるのは、対象のPCのCPUがNested Virtualizationに対応していて、仮想環境上で仮想環境を実行できる必要があります。今回は手持ちのC436FAをChromebookをFlexに見立てて実行しています。事前にLinuxコンテナをインストールしておき、その状態から色々と作業が必要なので、事前に調査しておきましょう。

GPDWINの時のように、Brunchを使って本物のChromeOS入れるというものと比較すると難易度は低いです。

SteamOSにてAndroidエミュレーターを動かしてみた

Chrome OS Flexで古いPCを蘇らせる

GPDWIN2に別のOSを入れて第二の余生を送る

事前準備

今回は、こちらのガイドを利用して進めていますが、このガイドかなりいい加減で手順がいくつか抜けていますので注意が必要です。

GPUサポートを有効化する

ChromeOSにおいて、LinuxコンテナのGPUサポートを有効化する必要があります。以下の手順でオンにしておきましょう。

  1. Chromeを起動する
  2. chrome://flags#crostini-gpu-supportを開く
  3. Crostini GPU SupportをEnableにする

図:CrostiniのGPUサポートは有効化しておく

Binder IPC対応のVMを構築する

対応カーネルを自前でビルドする

ChromeOSのLinux環境のKernelはWaydroidを動かすために必要なBinder IPCというサポートがKernelに入っていません。そこでまずはそのサポートを追加したLinuxコンテナにするべく、以下の作業を行います。

  1. Linuxターミナルを起動する
  2. 以下のコマンドを実行して、ビルドに必要なツールを入れておく
    sudo apt update && sudo apt install build-essential bc flex bison libelf-dev git 
    sudo apt install lsb-release
    sudo apt-get install software-properties-common
    
  3. LLVMツールを追加する為、以下のコマンドを実行する
    LLVM_VERSION=18
    curl -L https://apt.llvm.org/llvm.sh | sudo bash -s "${LLVM_VERSION}" 
    
    for f in clang clang++ ld.lld llvm-objdump llvm-ar llvm-nm llvm-strip llvm-objcopy llvm-readelf; do 
      sudo ln -sf $f-$LLVM_VERSION /usr/bin/$f 
    done
  4. GoogleからCrostiniのソースを取得する為、以下のコマンドを実行する
    git clone https://chromium.googlesource.com/chromiumos/third_party/kernel cros-kernel -b chromeos-6.6 --depth=1
  5. 次に、以下のコマンドを実行してカーネル構成を準備する
    cd cros-kernel 
    CHROMEOS_KERNEL_FAMILY=termina ./chromeos/scripts/prepareconfig container-vm-x86_64 
    make LLVM=1 LLVM_IAS=1 olddefconfig
    
    make LLVM=1 LLVM_IAS=1 menuconfig
  6. ターミナル内で設定ツールが起動するので、以下のような手順で進めます。
    1. Device Driversという項目があるので選択する
    2. 次の画面のかなり下の方にAndroidという項目があるので選択する
    3. Android Binder IPC Driverというのが出てるので、スペースキーで選択する
    4. Android Binderfs filesystemというのが出てくるので、スペースキーで選択する
    5. 右方向キーを押して、SAVEを選択しEnterキーを押す
    6. あとはEnterキーで確定して下の画面に戻ってきたら、今度はExitを選択Enterを実行する
    7. 他の画面でもExitを実行して下のターミナル画面まで戻す
  7. 次に以下のコマンドを実行してコンパイルを開始します
    make LLVM=1 LLVM_IAS=1 bzImage -j$(nproc)
  8. 結構な時間待ちます。終了したら、ビルドしたカーネルをホームディレクトリにコピーする
    cp arch/x86/boot/bzImage ~/
  9. とりあえずカーネルは用意できました。

図:設定ツールが出てくる

図:IPCサポートをオンにする

図:ビルド中の様子

ビルドしたカーネルでVM構築

現在使ってるLinuxコンテナとは別に、ビルドしたカーネルを使ったLinuxコンテナを実行させます。この作業はターミナルではなく、Croshを利用するので注意が必要です。

  1. ファイルアプリを起動して、Linuxファイルを開く
  2. 直下に前述でコピーしたbzImageファイルがいるのでこのファイルを掴んで、ダウンロードフォルダにコピーします
  3. Ctrl+Alt+TでCroshを起動します。
  4. 一旦以下のコマンドでLinuxコンテナをシャットダウンします
    vmc stop termina
  5. ダウンロードフォルダに配置したKernelを使って実行します
    vmc start termina --enable-gpu --kernel /home/chronos/user/MyFiles/Downloads/bzImage

Crosh画面は閉じずに次のWaydroidインストールの作業を実行します。

図:ビルドしたカーネルを配置する

Waydroidのインストール

スクリプトで本体をインストールする

SteamOSの場合にも便利なインストールスクリプトが用意されていましたが、ChromeOS Flex用にも用意されています。前述のCroshの画面の中でターミナルが起動してるのでそのまま続けて作業します。

うまく行かない場合は一旦Croshを閉じて、vmc stop terminaの後に前述の5.を実行してからチャレンジしましょう。

  1. 以下のコマンドを実行する
    curl -L https://github.com/supechicken/ChromeOS-Waydroid-Installer/raw/refs/heads/main/installer/01-setup_lxd.sh | bash -eu
  2. 自動的にVMに対して、Waydroidがインストールされます。
  3. しばらくするとターミナルに「Select an Android version to install:」という表示が出るので、今回はオフィシャルイメージの1を選択して、Android11環境をダウンロードします。
  4. 完了したら一旦ChromeOSを再起動します。
  5. 再起動後に、Croshを起動してもう一度カスタムカーネル指定をしてVMを起動します。
  6. この時点でアプリランチャーのLinuxアプリの中にWaydroidやAndroidアプリ類が登録されています。
  7. ターミナルを別に起動して、「start-waydroid」が起動コマンドです。すると、Android VMが起動しますが、まだこの時点では起動しません。

図:Waydroid自動インストールスクリプト

Google Play対応させる

対応イメージのダウンロード

この時点のVMイメージは実はGoogle Play Storeが入っていないイメージです。そこで、新規に起動したターミナルにて以下のコマンドを実行します。

sudo waydroid init -s GAPPS -f

すると、OpenGAPPS対応のイメージがダウンロード開始されます。実はこの作業はLinuxアプリに登録されたWaydroidアプリ自体を起動して設定することもできますので、ターミナルが嫌いな人はそちらからでも良いかと。

Android TypeをVanillaからGAPPSに変えるだけです。

Android IDの登録をする

実はこのままではGoogle Play Storeが端末を弾いて起動ができません。そこで以下の作業を行って、Android ID登録という作業を行います。

  1. まずは普通に以下のコマンドでWaydroidを起動してAndroidを起動する
    waydroid show-full-ui
  2. 通知がバンバン飛んできますが気にしません。
  3. 別途ターミナルを一個起動して以下のコマンドを実行します。
    sudo waydroid shell
  4. 続けてこちらのサイトにあるようなコマンドを入れて実行するとAndroid IDが得られます。
    ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"
  5. 取得したAndroid IDをコピーしてこちらのサイトを開く
  6. 出てきた画面の下部に入力欄があるので、ここにAndroid IDを入れて、reCaptchaをチェックして登録を実行
  7. しばらく待ったらしたら、Waydroidを再起動してみる
  8. するとバンバンきていた通知が来なくなる。

これで、Google Play Serviceが使えるようになったので、アプリを追加することができるようになります。

図:Android IDの取得

図:出てきた警告画面

図:Android ID登録画面

ARMトランスレーション対応

この状態のVMでもAndroid運用は可能なのですが、x86_64のイメージである為、ARM向けのアプリは動作しません(例:ウマ娘)。よって、アプリの幅が狭まってしまいます。そこで、違うAndroid Emulatorで配布されているlibhoudiniを取り出して、このVMに追加するというテクニックでARM対応させることが可能という話。

しかし、Ubuntuなどではこのテクニック使えるのですが、ChromeOS上のLinuxコンテナで動かそうとした時に、ループデバイスのマウントで失敗する。この件はChromiumのサイトにも書いており、ChromeOSはループデバイスを許可していないので、WaydroidのARMトランスレーションインストールは対応できないということです。

カスタムカーネルで自動起動

Chrome拡張機能を追加する

しかしこの時点では、毎回ターミナルを起動するのにカスタムカーネルを指定してみたいなことをやらなければなりません。そこでこれを自動で行うように自動スタートする仕掛けを行います。

ChromeOS Autostartというものをインストールします。

  1. ChromeOS Autostartにあるthe latest release of this extension (in zip) というリンクをクリック
  2. ZIPがダウンロードされるので解凍する
  3. 中に入ってるフォルダをダウンロードフォルダ直下に移動させる
  4. Chromeでchrome://extensionsを開く
  5. パッケージ化されていない拡張機能を読み込むをクリックする
  6. 3.のフォルダを指定する
  7. ダイアログが出るのでtest runをクリックする。
  8. ダイアログを閉じる

図:Autostartの拡張機能を入れておく

Autostartの設定

Autostartの拡張機能のオプションを開いて以下の作業を行う

  1. Manage Entriesをクリックする
  2. Add a new entryをクリックする
  3. Croshを選択してる状態で、Commandsに以下の内容を記述する
    vmc start termina --enable-gpu --kernel /home/chronos/user/MyFiles/Downloads/bzImage
  4. SAVEをクリックする
  5. もう一度add a new entryをクリックする
  6. 今度は、crosvmを選択してる状態で、Commandsに以下の内容を記述する
    start-waydroid
  7. SAVEをクリックする

これで、ChromeOSを再起動する度に、Chrome起動時に上記のコマンドが裏で自動実行されて、Waydroidが起動できる状態になります。

図:Croshの自動実行設定

起動してみた

Gboardとか初期のアプリが入っていないので、この辺りはいれておいたほうが良いでしょう。キーボードも英語キーボードですし、タイムゾーンや言語も英語。この辺りの初期セットアップを完了すると見事にAndroidの単一VM実行環境としてChromeOS上で動作します。

Chromebookのようなネイティブでホスト側とシームレスというわけにはいかないですが、少なくともAndroid実行環境は用意できるのでChrome OS Flexに大きな武器となるでしょう。

VM内のサウンドの音量が低いのでマックスまで上げておくことも忘れずに。他にも細かい設定類がWaydroidに対してあったりしますが、お好みで設定すれば良いでしょう。

図:Play Storeからアプリ追加

図:ねこあつめを起動してみた

関連動画

Demo: Installing Waydroid (Android 13) on ChromeOS Flex

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)