月別アーカイブ: 2019年2月

Android で動く Linux 環境 UserLAnd が XServer XSDL に対応

root 無しで簡単に Linux を起動できる UserLAndXSDL (X11 Server) との連携に対応しました。SSH, VNC 同様メニューから選べるようになったので試してみました。スマートフォンは ZenFone AR (ZS571KL) Android 7.0 を使っています。

Google Play ストアから UserLAnd をインストール。起動すると Linux Distribution を選択できます。今回の手順は Debian を選択しています。

UserLAnd

Distribution を選択すると共有ストレージへのパーミッションを求めてきますが、これは /sdcard をマウントするため。

ユーザー名とパスワードの設定をします。

UserLAnd

新しく XSDL が選択できるようになっています。

UserLAnd

XServer XSDL をインストールしていない場合はここで Play Store に飛びます。先にインストールしておいた方が良いかもしれません。Bluetooth Keyboard と Bluetooth Mouse も先にペアリングしておくことをお勧めします。

インストールしたらもう一度 UserLAnd から Debian を選択。XSDL が起動し、一瞬切り替わったあと↓この画面で止まったように見えますがそのまま待ってください。

XSDL

暫く待つと起動が終わり、左上に小さいターミナルウィンドウが出ます。止まったように見えたのは背景画像が残ってしまっているため。

XSDL

xterm のウィンドウが小さいのは Native 解像度 (上の例は 2560×1440) で起動しているからです。

● XSDL の解像度変更方法

解像度の変更は XSDL 起動時の下記の画面で、カウントダウン中に画面をタップします。

null

↓選択画面になるので 1280×720 あたりを選択。

null

↓次にフォントスケールの選択。潰れて読めないけど X0.7~X0.4 あたりを選択。いろいろ試して見やすいように調整してください。

null

↓ウィンドウが大きくなりました。

null

● lxde を使う方法

UserLAnd から起動すると twm + xterm の最小限で立ち上がります。Desktop を使うには Script の書き換えが必要でした。

Desktop lxde の install 手順

一旦 SSH でログインしておきます。(Distribution 名長押し→ App Stop → App Info)

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install lxde

下記のファイルを編集します。

/support/startXSDLServer.sh

元の内容

#! /bin/bash

if [[ -z "${DISPLAY}" ]]; then
  DISPLAY=:4721
fi

if [[ -z "${PULSE_SERVER}" ]]; then
  PULSE_SERVER=localhost:4721
fi

if [[ -z "${INITIAL_USERNAME}" ]]; then
  INITIAL_USERNAME="user"
fi

until env DISPLAY=:4721 ; do sleep 1 ; done

nohup twm & echo $! > /tmp/xsdl.pidfile

while [ ! -f /tmp/xsdl.pidfile ]
do
  sleep 1
done

su $INITIAL_USERNAME -c 'xterm -geometry 80x24+0+0 -e /bin/bash --login &'

下記のように書き換える

#! /bin/bash

if [[ -z "${DISPLAY}" ]]; then
  DISPLAY=:4721
fi

if [[ -z "${PULSE_SERVER}" ]]; then
  PULSE_SERVER=localhost:4721
fi

if [[ -z "${INITIAL_USERNAME}" ]]; then
  INITIAL_USERNAME="user"
fi

until env DISPLAY=:4721 ; do sleep 1 ; done

# ここから下を改変
sleep 20

su $INITIAL_USERNAME -c 'startlxde &'
su $INITIAL_USERNAME -c 'xterm -geometry 80x24+0+0 -e /bin/bash --login &'

sleep の部分は適当に調節してください。これで XSDL に切り替えて起動すると、しばらく待ったあとに青い画面から下記のような desktop 画面になります。起動は気長に待ってください。

null

日本語化等の情報はこちらを参照してください。

Hyperでんち: UserLAnd

●いくつかの問題点

・XSDL が Android 9 で動かない。
・lxde 起動には script 書き換えが必要
・Android で物理キーボードのレイアウトに日本語配列を選択していると一部のキーが入力できない

Android 9 Pie では XSDL が restart を繰り返してしまい起動しないので、UserLAnd 上でも選択できないようになっています。

関連ページ
Android の上の開発環境: UserLAnd

関連エントリ
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた

前回 Oculus Go で UserLAnd を呼び出せるアプリを作ったのですが、せっかくなので何でも呼び出せるように普通のランチャーアプリも作ってみました。Oculus Go 上で様々な Android アプリが動きます。

TVLauncherGo TVLauncherGo

任意の Android アプリを apk で直接 Install するだけで↑のようにランチャー画面にアイコンが並びます。

もちろん前回の TVWrapperUL 同様 UserLAnd や VNC Viewer、Android 設定画面も呼び出せます。(前回の記事はこちら「Oculus Go を文章書き&開発マシンにする」)

↓Firefox

Firefox

↓AnyDesk で Windows 10 にログインしてさらに VMWare で Ubuntu

AnyDesk

↓Kindle も動きましたがテキストタイプの書籍はフォントサイズが大きすぎます。ページを画像データとして持つ雑誌や漫画のような本は大丈夫そう。サイズ調節が難点。

Kindle

Amazon App Store が動きました。ただし事前に提供元不明アプリのインストールを許可しておく必要があります。(詳細はあとで)

Amazon App Store

●TVLauncherGo Install 方法

Oculus TV 上で動くランチャーです。下記からダウンロードした TVLauncherGo の apk を install してください。Oculus TV の中から起動します。

GitHub: TVLauncherGo1.0.apk

例えば adb を使って install するなら

1. Oculus Go を Developer Mode にする
2. Android SDK を install する (adb.exe にパスを通しておく)
3. PC と USB で接続する (必要なら adb ドライバを入れる)
4. adb install で apk をインストールする

adb install TVLauncherGo1.0.apk

TVLauncherGo が入れば、あとは設定画面や内蔵ファイラーが呼び出せるので Oculus Go 本体でアプリインストールもできるようになります。

●使い方

1. Oculus ストアから “Oculus TV” をインストールしておく
2. Oculus TV を起動
3. 画面の下の方にある “TVLauncherGo” を起動する (↓の赤枠)

TVLauncherGo

起動するとインストールされている一般 Android アプリのアイコンが並ぶのでクリックで起動できます。アイコン長押しでアプリの詳細画面に飛ぶのでアンインストールもできます。

●注意点

事前に Bluetooth Keyboard をペアリングしておくことをお勧めします。ペアリングは Oculus TV → TVLauncherGo → 設定 → Bluetooth から行ってください。

TVLauncherGo 経由ではなく、アプリが直接他のアプリを呼び出してしまう場合があります。VR 空間ではなく 2D でアプリやダイアログが表示されると Controller では操作できなくなるので注意が必要です。Keyboard があれば [ESC] や [Enter] キーで脱出できるかもしれません。

●一般の Android Apk をインストールする方法

さまざまな方法が使えます。

・adb で PC 経由で install
・Dropbox などオンラインストレージ経由で転送して、内蔵ファイラーでインストール
・Amazon などストアアプリ経由のインストール

など。

ブラウザで直接ダウンロードできる場合もありますが apk のインストールに関しては自己責任でお願いします。

●adb を使った PC 経由の install

Oculus Go が adb でつながっているなら PC から install するのが簡単です。TVLauncherGo.apk と同じように

adb install  アプリ.apk

でできます。

●オンラインストレージ経由での apk 転送

Dropbox のようなオンラインストレージを経由して apk ファイルを転送することもできます。Dropbox 上で apk を直接開かないようにしてください。ダイアログが 2D 描画されてしまい操作できなくなります。

メニューからエクスポートを使って一旦ローカルストレージに保存します。その後内蔵ファイラーを使ってインストールしてください。

●内蔵ファイラーを使ったインストール方法

Oculus Go 上に転送した apk をインストールするには下記の手順に従ってください。

1. インストールを許可

 Oculus TV → TVLauncherGo → 設定 → セキュリティ → 提供元不明アプリのインストールを許可する

2. 内蔵ファイラーを起動する

 Oculus TV → TVLauncherGo → 設定 → ストレージ → 外部メディア

3. apk のインストール

 ファイラーが起動したら、本体ストレージ(Pacific) を選択します。例えば Download フォルダにあるなら Pacific → Download を開きます。apk file をクリックすると install できます。

●ストアアプリ経由のインストール

Amazon App Store を使ったインストールもできます。ただしいくつか注意が必要です。

インストール許可の設定画面が 2D 描画になるので、必ず先に「TVLauncherGo → 設定 → セキュリティ → 提供元不明アプリのインストールを許可する」で許可しておいてください。

Amazon App Store の「インストールしますか」のダイアログが左右の目で矛盾した描画になりますが操作はできます。片目で操作してください。

インストールしたアプリはストアから直接開かないで、一旦戻って TVLauncherGo から起動してください。

●apk ファイルを入手するには

手持ちの Android スマートフォンから install してある apk file を取り出すことができます。apk を取り出す script を作ってみました。

GitHub: apk_get.py

1. PC に Python 3.x を install しておきます。
2. スマートフォンを Developer Mode にして PC と adb と接続します。
3. python apk_get.py を実行します。

python apk_get.py

これでインストールされているアプリの apk file をすべて取り出すことができます。

●VR 空間での起動と Oculus TV での起動の違いについて

VR 空間で直接 Android アプリを起動してしまうと問題が生じることがあります。一度起動して Activity が残っていると、以後 Oculus TV から呼び出しても VR 空間のままになる場合があるので注意が必要です。

(1) 例えば設定画面の場合、↓が VR 空間に直接描画されている状態です。少々わかりにくいですが周囲が真っ暗で部屋がありません。

VR Space

↑この状態だと一部のダイアログで操作できなくなる場合があります。例えば Bluetooth のペアリング削除画面ではまります。また一部の画面で固まったり落ちたりします。アプリ一覧画面、レイアウト変更画面など。

(2) Oculus Go 起動直後に Oculus TV → TVLauncherGo → 設定 で呼び出すと ↓ のようになります。部屋の中にウィンドウが配置されています。

Oculus TV Space

↑こちらは普通の Android と同じ操作が可能でダイアログも問題が出ません。物理キーボードのレイアウト変更もできました。↓

Layout

もし (1) の状態なってしまった場合は、Activity を完全に終了させるために一旦 Oculus Go を再起動することをお勧めします。電源ボタンの長押しでできます。

また前回の記事で書いたような adb コマンドを使った設定画面呼び出しは確実に (1) の状態になるので注意してください。adb を使った起動はしないで Oculus TV (TVLauncherGo) 経由で設定を呼び出すことを強くお勧めします。

外部のアプリを呼び出すアプリにも注意が必要です。Dropbox や Amazon App Store など、外部アプリや設定画面が呼ばれると Oculus TV を経由せずに直接 VR 空間や 2D 描画されてしまう場合があります。

再起動しても画面が真っ暗で操作できなくなったら、近接センサーが中途半端な状態になっている場合があります。Oculus Go の HMD 内部、中央上部の近接センサーに触れてみてください。

関連エントリ
Oculus Go を文章書き&開発マシンにする
Gear VR のヘッドセットの種類のまとめ
Oculus Go は VR ができる新しい携帯ゲーム機

Oculus Go を文章書き&開発マシンにする

Oculus Go にも Bluetooth Keyboard が接続できて、さらに一般の Android アプリが動くらしいと今更ながら知ったので、先人の知恵をお借りしつつ UserLAnd を動かしてみました。どこでも Oculus Go をかぶって大画面で日本語文章書いたりプログラム書いたりできます。
Remote Desktop ではないので Network がなくても単体で使えます。

Oculus Go UserLAnd Oculus Go UserLAnd
↑ Oculus Go で動く Debian の Desktop。Oculus TV は残念ながら画面キャプチャできないので、Oculus Go を覗いたところを無理やり写真に撮っています。

参考にさせていただいた情報
Oculus Go Tips
KILINBOX: Oculus GoでAndroidアプリを動かす

調べてみたらすでに同じようなことを実践している方もいらっしゃるようです。
Oculus GoでスタンドアロンVR作業環境を作った

● Bluetooth Keyboard が使える

adb 経由で Settings 画面を呼び出せば Bluetooth 設定ができるようです。上の参考にさせていただいた Tips ページで直接 Bluetooth 画面を呼び出す方法が紹介されています。

下記のように設定画面の Top を呼び出すことも可能です。(追記 2019/02/06: この方法ではダイアログが操作できない場合があることがわかったので非推奨です。詳細はこちら)

adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings

毎回 PC 上で呼び出すのも大変なので、単独で使えるよう設定画面を呼び出すアプリを作成しました。(後述)

● 一般のアプリが動く

通常の Android apk を Oculus Go にそのまま install しても VR に対応していないためライブラリに表示されません。ところが公式アプリの Oculus TV を起動すると、一部のアプリが下の方に表示されていました。選択すると VR 空間の TV の中で実行できるようです。

特に Termux は何もしなくても表示されており、apk install だけでそのまま使うことができました。↓

Oculus Go Termux

どうやら Oculus TV には Android TV に対応したアプリが表示されるようです。AndroidManifest.xml に LEANBACK_LAUNCER を登録しておけば Oculus Go の上で実行できることになります。

Linux 環境を走らせるアプリ UserLAnd には LEANBACK_LAUNCER が入っていないので Oculus TV から見えませんでした。ダミーアプリを作って Intent で呼び出せば Oculus TV の上で実行できそうです。

こちらで紹介されていた TvAppRepo というアプリがまさにそれで、Android TV 用のダミーアプリを実機上で作ることができます。

● UserLAnd を呼び出すだけのアプリを作る

実際にアプリを作ってみます。AndroidStudio で Android TV 向けの空 Project を作ります。Tempalte で Android TV Activity を選択しておき、Activity 起動直後に UserLAnd を呼び出します。

// MainActivity.java
import  android.app.Activity;
import  android.content.ActivityNotFoundException;
import  android.os.Bundle;
import  android.content.pm.PackageManager;
import  android.content.Intent;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PackageManager manager= getPackageManager();
        Intent it= manager.getLaunchIntentForPackage( "tech.ula" );
        it.addCategory( Intent.CATEGORY_LAUNCHER );
        startActivity( it );
    }
}

これだけでうまくいきました。apk 作ってを Oculus Go に install すると Oculus TV にアイコンが並びます。起動すると Oculus TV の上で UserLAnd が動きました。

Bluetooth Keyboard があれば任意の Linux Distribution を使うことができます。これでテキストエディタ、日本語入力、開発用言語など、様々なものが動きます。

この UserLAnd を呼び出すだけの簡単なアプリをこちらで公開してみました。ついでに Real VNC Viewer と設定画面も呼び出せるようにしています。

GitHub: TVWrapperUL 1.0

● VNC を起動する

LuserLAnd が内部で呼び出している bVNC Free は残念ながら Oculus Go で動きませんでした。VR を無視して全画面表示になってしまいます。代わりに Real VNC Viewer (com.realvnc.viewer.android) が動いたのでこちらを使います。UserLAnd と全く同じように Wrapper アプリで呼び出せるので TVWrapperUL に追加しました。

UserLAnd で動いている tightvncserver の port は 5951 です。VNC Server のアドレスには “127.0.0.1:5951” を指定してください。

● 手順の詳細

(1) Oculus Go を Develoepr mode にして PC と adb で接続します。

(2) TVWrapperUL の apk を Oculus Go に install してください。

adb install TVWrapperUL1.0.apk

(3) Oculus TV から TVWrapperUL を起動。Settings → Bluetooh で Bluetooth Keyboard をペアリングしておきます。

(4) UserLAnd (tech.ula) と RealVNC Viewer (com.realvnc.viewer.android) の APK を adb で Oculus Go に install します

(5) Oculus TV → TVWrapperUL → UserLAnd で起動します。

(6) 任意の Linux Distributon を選択します

 Keyboard を使って Username, password, VNC password を入力。ここでは SSH を選びます

日本語化を行えば、そのまま Console で文章書き環境として利用可能です。

UserLAnd の日本語化や日本語入力環境の解説

↓Ubuntu の Console で日本語入力
null

Desktop (lxde 等) 環境も VNC 経由で使うことができます。

● VNC 接続手順

(1) Oculus TV → TVWrapperUL → UserLAnd

(2) Linux Distributon を選択。User を作って VNC を選択

  すでに SSH で作ってある場合は下記の手順で VNC 切り替えます。

  1. 長押しして Stop App
  2. もう一度長押しして App Info → VNC に切り替え
  3. Distribution 名をクリックすると起動

(3) Client アプリがないと言われるので一旦 OK して、Controller のメニュー(←) ボタンを何度か押して戻る

(4) Oculus TV → TVWrapperUL → RealVNC を選択

(5) 右下の + ボタンを押して New Connection 画面から設定を追加。Address は “127.0.0.1:5951” 名前は任意

(6) (5) で作った設定を選んで CONNECT を押す。User 作成時に決めた VNC Password を入れると繋がります。

Desktop の install 手順、VNC 解像度指定方法などはこちらを参照してください。

● 課題など

Android 設定画面から物理キーボードのレイアウト変更ができませんでした。設定画面が落ちるため。(追記: X11 desktop なら xmodmap による変更は可能) (追記 2019/02/06: Oculus TV + TVLauncherGo から設定を呼び出せばできることがわかりました)

Oculus Go Controller を使ったマウス操作が難しいかもしれません。

Oculus TV 上で起動したアプリは画面キャプチャが禁止されているらしく、画面を保存できなくなっています。ミラーリングも真っ黒な画面です。

(追記 2019/02/06: UserLAnd 以外も呼び出せるランチャーを作りました。詳細はこちら「Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた」)

関連ページ
Android の上の開発環境: UserLAnd

関連エントリ
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
Gear VR のヘッドセットの種類のまとめ
Oculus Go は VR ができる新しい携帯ゲーム機