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

Android

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 を文章書き&開発マシンにする

Huawei P30 Lite/Fire HD 10(2019) のコンパイル速度と UserLAnd

Huawei P30 Lite と Fire HD 10 (2019年新型) のコンパイル時間を調べてみました。P30 Lite は電源設定をパフォーマンスモードにしています。いずれも Android 9.0 で Termux clang 9.0 を使用しています。

Device SoC CPU Clock core RAM time
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 4GB 71
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 2GB 83

・time はコンパイル時間で単位は秒、値が小さい方が高速です。
・clock は GHz

CPU はどちらも Cortex-A73 + Cortex-A53 の big.LITTLE 8 core ですが RAM 容量に差があります。

↓UserLAnd + Ubuntu 18.04 でも比較してみました。clang は 8.0 になります。

Device SoC CPU Clock core RAM time
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 4GB 85
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 2GB 86

思ったほど Termux と差がなくなっています。これなら Termux を併用せずに UserLAnd だけの利用で十分かもしれません。

他のデバイスも含めて比べてみました。

Device SoC CPU Clock core OS time
Google Pixel 3 Snapdragon 845 Kryo385 2.8+1.8 4+4 Termux 35
Essential Phone Snapdragon 835 Kryo280 2.5+1.9 4+4 Termux 40
Google Pixel 3 Snapdragon 845 Kryo385 2.8+1.8 4+4 UserLAnd 51
Essential Phone Snapdragon 835 Kryo280 2.5+1.9 4+4 UserLAnd 61
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 Termux 71
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 Termux 83
Huawei P30 Lite Kirin 710 A73+A53 2.2+1.7 4+4 UserLAnd 85
Fire HD 10 (2019) MT8183 A73+A53 2.0+2.0 4+4 UserLAnd 86
Jetson Nano Tegra X1 A57 1.43 4 Ubuntu 18.04 118
Raspberry Pi 4 BCM2711 A72 1.5 4 Raspbian 10 186
Raspberry Pi 3 BCM2837 A53 1.2 4 Raspbian 10 331

・time はコンパイル時間で単位は秒、値が小さい方が高速です。

この表↑では clang の Version に違いがあるのでより詳しいデータを見たい方は こちら を参照してください。

Pixel3 の UserLAnd でも新しい Filesystem / Session を作って Ubuntu をインストールし直したところ、メタファイルがなくなり以前よりもかなり速くなっていました。いつ更新されてのか把握していませんが、1年以上前から古いファイルシステムを使い続けている場合はインストールし直した方が良いかもしれません。

今日 Raspberry Pi 4 (4GB) が届いたので軽く調べています。とりあえずコンパイルは Raspberry Pi 4 より Jetson Nano の方が速いです。

関連ページ
HYPERでんち: Compile Benchmark

関連エントリ
Android: UserLAnd + Termux を Note PC 代わりに使う
Jetson Nano で TensorFlow の C 言語 API を使う
Jetson Nano / Clang の Version とコンパイル速度の比較
Oculus Quest も文章書き&開発マシンにする
Snapdragon 835 と 845 のコンパイル時間の比較&浮動小数点演算能力
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
ARM CPU 上の開発環境とコンパイル時間の比較

Android: UserLAnd + Termux を Note PC 代わりに使う

外出時のちょっとしたメモ取りやドキュメントのまとめ作業で Note PC の代わりに使っています。

UserLAnd + Termux

以前も触れていますが、UserLAnd 経由で Termux を使用しています。UserLAnd だけでなく Termux を併用している理由はいくつかあります。

◎Termux を使う理由

・proot オーバーヘッドが無いのでファイルアクセスが高速
・Mercurial が安定して動く (UserLAnd は HardLink を使うソフトで問題が出やすい)
・Termux 内のファイルを Android 側から直接アクセスできる

◎UserLand を使う理由

・mozc による日本語入力が可能
・Window (Desktop) 環境が使える
・Android 9 以降で Ctrl+SPACE を入力できない問題の回避 (xmodmap)

Termux で ssh サーバーを起動する方法

$ pkg up
$ pkg install openssh
$ passwd
  <ログインパスワードを設定>
$ sshd

UserLAnd から Termux にログインする方法

$ ssh localhost -p 8022
  <ログインパスワードを入力>

UserLAnd に日本語入力環境を構築する方法や Ctrl+SPACE 問題については下記を参照してください。なお Android 10 (Q) も Android 9 (Pie) 同様 Ctrl + SPACE の入力ができませんでした。

HYPERでんち: LserLAnd
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用

●PC との同期

データの管理に git や mercurial のリポジトリを使用しているので、PC からも直接同期することができます。

Termux で持ち運べるモバイルリポジトリを作る Mercurial/Git

sshd を起動しておけば PC 側から「git ssh://~」や「hg ssh://~」で直接同期できます。

同期のタイミングでは UserLAnd 不要で Termux 上で sshd が動いていれば OK です。ファイルの転送だけなら scp (WinSCP 等) も使えます。

●クラウドへの転送

PC を経由せずに他のスマートフォンやタブレットにファイルを転送する場合は、Android の「ファイル」アプリが使えます。Termux 内のファイルが見えるので、直接 Google Drive や One Drive 等への転送ができます。

File App

「ファイル」アプリを使う場合は特に sshd が動いている必要はありません。

●共有ストレージの扱い

Android 10 から共有ストレージの仕様が変更されています。”/sdcard” (という名の内部共有ストレージ) は以前のような無制限なアクセスができなくなっています。代わりに「ファイル」アプリを使って、それぞれアプリケーション毎の個別領域にアクセスすることができます。

UserLAnd の場合は少々特殊で、ファイル毎のメタ情報があるので proot を通さずにファイル操作を行うと関連付けが壊れる可能性があります。そのため「ファイル」アプリから共有可能な別の領域「/storage/internal」が用意されています。ここは proot の管理対象外です。必要なデータを /storage/~ に転送しておけば「ファイル」アプリから見えますし、逆に Android から UserLAnd への転送にも使えます。

UserLAnd: Importing and exporting files in UserLAnd

termux の場合特に問題がないので、「ファイル」アプリから Home ディレクトリがそのまま見えるようになっています。

●UserLAnd でブラウザ

UserLAnd の Ubuntu 上でも Firefox が動くようになっています。以前は真っ暗な画面のままでした。下記ページの手順に従い firefox-esr を install します。

FAQ: Installing Firefox on Ubuntu

●Termux で Mercurial

若干パッケージに変更があったようで python2-dev が不要となりました。下記の手順で install できます。

$ pkg up
$ pkg install python2 clang
$ pip2 install mercurial

No more -dev packages

●実際に使用して速度面など

コンパイル速度の比較を見てわかるように、ハイエンドスマートフォンは基礎的な性能面で Note PC と殆ど変わらなくなっています。Atom 系や旧型 PC よりパフォーマンスは上です。

ただし UserLAnd 上では性能を体感できなくなっており、快適度では PC に大きく劣ります。

・proot のオーバーヘッドで数倍遅い
・GPU 非対応なので Desktop などの GUI は全体的に描画が遅い

機種ごとの差も結構あります。以前テストしたミドルクラスのスマートフォンで SoC のスペック通りのパフォーマンスが出ないことがありました。Android 上では動作も軽く何の問題もないのですが、CPU のピーク clock が抑えられているのか Termux 上でのコンパイルに予想の数倍時間がかかりました。

また速度面ではありませんが、OS がカスタマイズされており物理キーボードのキーマップが変更できないものもあります。

お勧めはできるだけカスタマイズされていないハイエンド系となります。Snapdragon 835, 845, 855 など。

良い点は荷物が増えないこと。(Bluetooth キーボードやマウスは別として) またスマートフォンなので Sleep や復帰が安定しており信頼できる点が魅力です。

関連ページ
HYPERでんち: LserLAnd
HYPERでんち: Termux

関連エントリ
Oculus Quest も文章書き&開発マシンにする
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用
Termux で持ち運べるモバイルリポジトリを作る Mercurial/Git

Snapdragon 845 ARMv8.2A 新しい Atomic/メモリバリア命令

Snapdragon 845 の CPU Kryo 385 は ARMv8.2 対応の Cortex-A75 がベースとなっています。前回新しく追加された半精度浮動小数点演算命令を使用してみましたが、他にもいろいろと生成コードに違いがあることがわかりました。そのひとつが atomic 命令です。実際に生成されたコードを比べてみました。

● Atomic 演算

まずは fetch_add() の場合。下記コードのコンパイル結果です。

std::atomic  val( 0 );
val.fetch_add( 10, std::memory_order::memory_order_seq_cst );

x86/x64 では lock prefix 付きの xadd が使われています。

; x64
    lock xaddl  %esi, 8%(rsp)

ARMv7-A の場合 LL/SC 型なので複数の命令に分解されます。ldrex, strex が LL/SC です。途中で同一メモリにアクセスがあると Atomic 操作は失敗するので、失敗していたら loop からやり直します。またメモリアクセスの順序付けが必要な場合はメモリバリア命令 dmb が挿入されます。

; armv7a
loop:
    ldrex  r0, [r4]
    add    r2, r0, #10
    strex  r2, r0, [r4]
    cmp    r2, #0
    bne    loop
    dmb    ish

ARMv8.0 (AArch64) も同様ですが、命令体型はほぼ別ものです。またメモリバリアが命令に組み込まれているので命令数は減っています。ldaxr は ldxr(LL) + acquire に相当し、同じように stlxr は stxr(SC) + release を意味しています。これだけで memory_order_acq_rel な Atomic 操作になります。

; armv8.0a
loop:
    ldaxr   w9, [x8]
    add     w1, w9, #10
    stlxr   w9, w1, [x8]
    cbnz    w9, loop

ARMv8.1 (AArch64) では命令が拡張されており x64 同様 1命令で済むようになっています。ldaddal の最後の al が acq_rel を意味しており、他に relaxed, acquire, release があるので 4通りです。さらにサイズも 8, 16, 32, 64bit から選べるので ldadd だけでも 16 種類あることになります。

; armv8.1a
    ldaddal w23, w8, [x22]

ARMv8.1 は add 以外の atomic 演算にも対応しています。

例えば x64 の場合 xadd 以外の演算命令がないので fetch_xor( 7 ) は load + xor + CAS に展開されています。

; x64
loop:
    movl  8(%rsp), %ecx
    movl  %ecx, %edx
    xorl  $7, %edx
    movl  %ecx, %eax
    lock  cmpxchgl  %edx, 8(%rsp)
    jne   loop

ARMv8.1 ではこれも 1命令です。他にも and, or 相当の ldclr/ldset があります。

; armv8.1a
    ldeoral w8, w1, [x19]

● compare_exchange (CAS) の weak/strong の違い

ARMv7/ARMv8.0 では compare_exchange_weak() と compare_exchange_strong() で違いがあります。strong は LL/SC の失敗時に再実行しますが weak はそのまま抜けます。SpinLock など CAS の戻り値によって繰り返し呼び出す用途では、判定が二度手間になるため weak で十分なことになります。

; armv8.0a  cas-weak (0 -> 3)
    ldaxr  w2, [x19]
    cbnz   w2, lbb18
    orr    w8, wzr, #0x3
    stlxr  w9, w8, [x19]
    b      lbb19
lbb18:
    clrex
lbb19:

strong では再実行あり。

; armv8.0a  cas-strong (3 -> 0)
loop:
    ldaxr  r2, [x19]
    cmp    w2, #3
    b.ne   lbb24
    stlxr  w8, wzr, [x19]
    cbnz   w8, loop
    orr    w1, wzr, #0x1
    b      lbb25
lbb24:
    clrex
lbb25:

x64 と ARMv8.1A はそれぞれ weak/strong の違いがなく 1命令です。

; x64
    lock  cmpxchgl  %ebx, 8(%rsp)

; armv8.1a
    casal    w2, w3, [x22]

casal は Compare and Swap (CAS) + acq_rel。

● memory_order の違い

load/store それぞれの memory_order 指定による違いは下記の通り。まずは load の場合。

; armv7a

; (relaxed)
    ldr    r0, [r4]

; (acquire/consume/seq_cst)
    ldr    r0, [r4]
    dmb    ish

ARMv8.1 の違いは特になく 8.0 と同じでした。

; armv8.0a/armv8.1a

; (relaxed)
    ldr    w1, [x19]

; (acquire/consume/seq_cst)
    ldar   w1, [x19]

store の場合。

; armv7a

; (relaxed)
    str    r5, [r4]

; (release)
    dmb    ish
    str    r5, [r4]

; (seq_cst)
    dmb    ish
    str    r5, [r4]
    dmb    ish
; armv8.0a/armv8.1a

; (relaxed)
    str    w20, [x19]

; (release/seq_cst)
    stlr   w20, [x19]

x64 では store( seq_cst ) に xchg が使われている以外は全部 mov です。ARM では厳密に Memory Barrier が挿入されています。

Snapdragon 845 向けに ARMv8.2 バイナリを作ると思ったよりも生成コードに違いがあることがわかりました。iOS では従来の arm64 に加えて arm64e が追加されており、ARM v8.x 拡張命令に対応した新しいバイナリを区別しています。Android では特に区別がないですが、fp16 演算を使った最適化を行う場合は ARMv7 + NEON のときと同じように binary を分けてロードする必要があるかもしれません。

実際の出力などより詳しくは下記のページにまとめています。

CPU Atomic / Memory Barrier

関連ページ
CPU Atomic / Memory Barrier

関連エントリ
Snapdragon 845 ARMv8.2A 半精度 fp16 演算命令を使ってみる / Deep Learning 命令
スレッド同期命令の比較 C++11 とコンパイラ

Android UserLAnd の更新と VNC 画面設定

UserLAnd を使うと Android 上に簡単に Linux 環境を構築することができます。開発環境としてはすでに termux がありますが、UserLAnd の場合動作可能なソフトウエアが多いのが魅力です。日本語入力環境も構築できるので、termux を補う意味でも併用がおすすめ。

前回までの記事はこちら

結構こまめに更新されているので、修正された部分などいくつか。

●画面サイズの自動認識

以前は VNC を選択すると 1024×768 の固定サイズになっていました。大半のスマートフォンはアスペクト比が異なるので、画面いっぱいに広げるには自分で設定ファイルに解像度を書き込んでおく必要があります。

新しい UserLAnd では自動的にスマートフォンの画面に合わせたサイズが選ばれるようになっています。設定をいじらなくても全画面です。

ただしハイエンド機種はピクセル密度が高いので、そのままだと文字が読めないほどウィンドウが小さくなってしまう場合があります。(5.5inch で 2560×1440 dot など) 必要に応じて .vncrc を修正してください。

●VNC 画面サイズの設定方法

従来は Linux Distribution 毎に設定ファイルが異なっていました。例えば Debian は ~/.vncrc で行い、Ubuntu は ~/.vnc/tightvncserver.conf、Arch Linux は ~/.vnc/config とばらばらです。

新しい UserLAnd では ~/.vncrc に統一されています。proot 外のスクリプトによって VNC Server 起動時に $HOME/.vncrc を読み取って起動時のコマンドオプションに指定しているようです。Debian は問題ありませんが、Ubuntu や Arch の場合以前の設定が無効化されているので注意。

●Desktop 環境のインストール

UserLAnd のアプリケーションメニューに Desktop が追加されたので、コマンドを打たなくてもデスクトップ環境を install できるようになっています。Lxde, Xfce の選択ができます。ただしインストールされるのは Debian になります。

UserLAnd Xfce

以前は VNC を選択してもデフォルトの twm + xterm のみで、Desktop 環境は自分でインストールする必要がありました。

●その他細かいこと

Alpine Linux が追加されているので Alpine, Arch, Debian, Kali, Ubuntu の 5種類から選択できるようになっています。

Filesystem のバックアップが可能になっています。Filesystem タブから個別に Export, Import できるようです。


関連エントリ
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用
Android 9.0 と Bluetooth Keyboard による日本語入力
Android で動く Linux 環境 UserLAnd が XServer XSDL に対応
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd