Archives

February 2013 の記事

Nexus 7 の MultiROM が Ubuntu touch 対応となっています。

xda: [WiFi&3G] MultiROM v8 (new recovery for Ubuntu Touch)

TWRP の新しいバージョン (2013/02/22以降) で

xda: Ubuntu touch preview

この手順に従い install 可能となりました。
Android, Ubuntu Desktop, Ubuntu Touch を共存させて
起動時に選択することができます。

これでタブレットの利用には Android を、
単体でのプログラミングなら Ubuntu Desktop を、
Ubuntu Touch UI やアプリのテスト時に Desktop Preview を起動できます。

Ubuntu Touch Developer preview は adb 経由で chroot することからもわかるように、
Android 上に install した chroot 版 Linux に近い構造となっているようです。
HW アクセラレート対応の UI が乗っており、
Android SDK の AVD のようにアプリケーションの動作確認に利用することができます。

Ubuntu をベースとした Tablet/Phone 向け OS なので、
Android のようにタッチによる操作がしやすくなっています。
ただし Touch UI 上で Linux アプリがそのまま使えるわけではないので、
新しいプラットフォームと考えた方が良いでしょう。
UI 上で Linux らしさを期待するなら、今のところは Desktop 版との使い分けが
ベストだと思います。


関連エントリ
Nexus 7 Ubuntu Touch Developer Preview
Nexus 7 上に開発環境をつくる (4) Ubuntu 13.04
Nexus 7 上に開発環境をつくる (3) Ubuntu
Nexus 7 上に開発環境をつくる (2) Bluetooth と OpenGL ES 2.0
Android Tablet Nexus 7 上に開発環境をつくる (Ubuntu)


Nexus 7 等のモバイルデバイスで動く Ubuntu Touch を試してみました。
開発者向けです。

Ubuntu Touch

Nexus 7 には下記のように通常の desktop 版 Ubuntu もあります。

Android Tablet Nexus 7 上に開発環境をつくる (Ubuntu)

↓この二つは別物です。

◎ Nexus 7 で動く Desktop 版 Ubuntu
◎ Nexus 7 で動く Ubuntu Touch Developer Preview

Desktop 版は PC と同一の豊富なアプリケーションを動かすことができる反面、
タッチだけの操作は必ずしも使いやすいとはいえませんでした。
キーボードやマウスを繋げば快適で、超小型のパソコンになります。

Ubuntu Touch は Android や iOS のように、タッチ操作に特化した UI が入ります。
まだ開発者向けで、操作に HOST PC が必要となることがあります。(2013/02/22現在)


● install

Desktop 版 Ubuntu の native install と同じように、本体の Android OS を置き換える形になります。
(Android のデータは全部消えます。)
MultiROM が対応すれば、他の環境と共存できるようになるかもしれません。

Install

Ubuntu 上で走る installer が用意されています。
PC に Ubuntu が入っている状態なら上記の Install 手順に従うだけです。

コマンドは python で書かれているので、
手順がわかれば Windows から手動で入れることもできるかもしれません。

bootloader の unlock が必要です。
installer は fastboot だけでなく adb も使うので、
Android を起動し USB デバッグにチェックを入れておきます。


● UI

インストールが完了すると、端末上で Ubuntu Touch の UI を試すことが可能となります。

ReleaseNotes

UI 上でできることがまだ少ないですが、ReleaseNotes に
書かれているように USB + adb 経由でシェルにログインできます。

adb root
adb shell

端末上で shell が動いたらさらにコマンドを実行します。

ubuntu_chroot shell

これで ARM 版 Ubuntu 12.10 としてシェルが動きます。
ReleaseNotes にあるように ssh を入れておけば Wi-Fi 経由で login できます。

apt-get update 
apt-get install openssh-server 

普通の Linux コマンドを install できるようです。コンパイラとか動きます。
残念ながら ubuntu-sdk は入れられませんでした。


関連エントリ
Nexus 7 上に開発環境をつくる (4) Ubuntu 13.04
Nexus 7 上に開発環境をつくる (3) Ubuntu
Nexus 7 上に開発環境をつくる (2) Bluetooth と OpenGL ES 2.0
Android Tablet Nexus 7 上に開発環境をつくる (Ubuntu)


先週の Nexus 7 Ubuntu 13.04 image で、
新規インストールができない問題が出ていたようです。
古いバージョンなら大丈夫で、手元では 2013/02/05 の image が正しく動いています。

xda: [WiFi&3G] MultiROM v8 - (4.2.2 kernel and 4.18 bootloader fix)

また MultiROM 環境の Ubuntu で、apt-get upgrade / dist-upgrade と
フル更新をかけると OS の起動に失敗するようになります。

こちらは TWRP の Recovery menu モードに入ってから
Advanced → MultiROM → List ROMs で 選択 → re-patch init
で修復できるとのことです。

>Re-patch init - this is available only for ubuntu. Use it when ubuntu
> cannot find root partition, ie. after apt-get upgrade which changed
> the init script.


Android 4.2.2 への更新が配信されていましたが、
自動で更新できなかったので手動で行いました。

Gadget 好きの忘備録: Nexus7を4.2.2にUpdate

こちらによれば Factory Image を書き込めば良いとのことです。
boot と recovery はどうせ置き換えるので、system だけ書き込んでみました。
アーカイブ内の bat ファイルでは全パーティションを erase していましたが
そのまま実行しています。あくまで自己責任でお願いします。
また MultiROM 対応の kernel も 4.2.2 用に置き換えています。


関連エントリ
Nexus 7 上に開発環境をつくる (3) Ubuntu
Nexus 7 上に開発環境をつくる (2) Bluetooth と OpenGL ES 2.0
Android Tablet Nexus 7 上に開発環境をつくる (Ubuntu)


Nexus 7 の Ubuntu 13.04 は armhf (hard-float) です。
Android NDK は softfp なので、
Ubuntu の方が関数呼び出しが効率化されていると考えられます。
比べてみました。

// 元のソース
float func2( float a, float b, float c )
{
    return  a * b + c;
}

float func3( float a, float b, float c )
{
    return  a + b - c;
}

float func1( float a, float b )
{
    return  a * b + a;
}

↓gcc によるコンパイル結果 (softfp)

// -marm -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3

    fmsr    s14, r0
    fmsr    s13, r2
    fmsr    s15, r1
    fmacs   s13, s14, s15
    fmrs    r0, s13
    bx  lr

    fmsr    s13, r0
    fmsr    s14, r1
    fadds   s15, s13, s14
    fmsr    s13, r2
    fsubs   s13, s15, s13
    fmrs    r0, s13
    bx  lr

    fmsr    s13, r0
    fmsr    s15, r1
    fmacs   s13, s13, s15
    fmrs    r0, s13
    bx  lr

soft といっても浮動小数点演算をエミュレーション実行しているわけではなく、
上記のように VFP や NEON 等の HW 演算ユニットが使われています。

あくまで ABI (Calling Convention) の話で、関数の呼び出し時のレジスタの
使われ方が異なります。
softfp の場合は FPU (VFP) が無い場合 (soft) と互換性が取れるように、
レジスタ渡しの場合に浮動小数点値も整数レジスタ(r)に入ります。

上の結果でも、毎回整数レジスタ(r)に入った引数を VFP レジスタ(s)へ
コピーしていることがわかります。

-mfloat-abi=hard を指定すると↓下記のように不要な転送が無くなりました。
引数や戻り値としてそのまま VFP レジスタ(s)が使われています。

// -marm -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3

    fmacs   s2, s0, s1
    fcpys   s0, s2
    bx  lr

    fadds   s0, s0, s1
    fsubs   s0, s0, s2
    bx  lr

    fmacs   s0, s0, s1
    bx  lr

↓さらに vfpv4 を指定すると、fmacs の代わりに vfma が使われていることがわかります。

// -marm -march=armv7-a -mfloat-abi=hard -mfpu=vfpv4

    vfma.f32    s2, s0, s1
    fcpys   s0, s2
    bx  lr

    fadds   s0, s0, s1
    fsubs   s0, s0, s2
    bx  lr

    vfma.f32    s0, s0, s1
    bx  lr

NEON 命令も試してみました。

// 元のソース
#include   <arm_neon.h>

float32x4_t func4( float32x4_t a, float32x4_t b )
{
    return  a * b + a;
}

-ffast-math を付けると neon 命令に変換できます。

↓softfp では 128bit x2 の値をレジスタだけで渡すことができません。
2つ目の引数が stack に入っています。

// -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon -ffast-math

	vmov	d16, r0, r1  @ v4sf
	vmov	d17, r2, r3
	vld1.64	{d18-d19}, [sp:64]
	vmla.f32	q8, q9, q8
	vmov	r0, r1, d16  @ v4sf
	vmov	r2, r3, d17
	bx	lr

↓hard の場合すべてレジスタで受け渡し可能となります。

// -marm -march=armv7-a -mfloat-abi=hard -mfpu=neon -ffast-math

	vmla.f32	q0, q1, q0
	bx	lr

以上より hard-float の場合に下記の 2つのメリットあるようです。
(他にもあるかもしれません)

・整数レジスタとの転送が不要となる
・引数として利用可能なレジスタの個数が増える

具体的な速度は測定していませんが、より高速に実行できると考えられます。

Android NDK だけでなく iOS の新しいアーキテクチャ armv7s でも softfp
相当となっているようです。


関連エントリ
Nexus 7 上に開発環境をつくる (3) Ubuntu
Nexus 7 上に開発環境をつくる (2) Bluetooth と OpenGL ES 2.0
Android Tablet Nexus 7 上に開発環境をつくる (Ubuntu)


Nexus 7 に Ubuntu 13.04を入れています。
Bluetooth が使えるようになりかなり実用度が増しました。
下記はあくまで 2013/02/14 現在のものです。
日々更新されていますので、そのまま鵜呑みにせずその時点での
最新情報を探すようにしてください。


●オンラインストレージ

NetWalker の時は ARM で動く Dropbox が無く不便だったのですが、
今では Ubuntu One が入っているので全く困らなくなりました。
同様に使えるオンラインストレージで、もちろん ARM で動きます。
5GB まで無料。


● WiMAX / 有線LAN

WiMAX ルーターに Wi-Fi でつながるのは当たり前ですが、
USB による有線接続も可能でした。試したのは下記の 2機種。

・NEC Aterm WM3600R
・NEC Aterm WM3800R

USB Host にケーブルでつなぐだけで認識します。
駅前など Wi-Fi が混雑していて安定しない場所で使えるかもしれません。
有線 LAN アダプタ LUA3-U2-ATX も使えています。


●テザリング

同様に SB iPhone5, au HTC J butterfly HTL21 も USB 接続しましたが
こちらはつながりません。
もちろん Wi-Fi や Bluetooth ではテザリングできます。

Bluetooth の場合はペアリングだけではだめで、
「Use your mobile phone as a network device (PAN/NAP)」
のチェックが必要です。
その後端末側から接続を選ぶ→右上の Network のポップアップから
端末名を選択する流れになります。


●スクリーンキーボード

リサイズ出来ます。
横画面で大きめにしておくとタッチしやすくなります。

マウスポインタアイコンで拡張パネルが開き、右ボタン等の操作が可能ですが、
複雑な操作をしていると固まる事が多いです。
マウスは使えるので、タッチが反応しない場合や突然ロック画面に飛ばされた
場合は、マウスをつないで再起動した方が良いです。


●armhf

こちらのコメントにも書きましたが hard-float なので、
NDK より呼び出し効率が上がっているものと考えられます。
続きます。


関連エントリ
Android Tablet Nexus 7 上に開発環境をつくる (Ubuntu)
Nexus 7 上に開発環境をつくる (2) Bluetooth と OpenGL ES 2.0


Bitbucket などクラウド系のリポジトリサービスを使うと、
どこでもソースコードをチェックできるので非常に便利です。
電車の中や外出時だろうと、ちょっとした空き時間にブラウザだけで
コードを追うことができます。

そのうち欲が出てきて、どうせならこのままコードを手直ししたいとか
コンパイルもできたらいいのに、とか思うようになります。

最近のモバイルデバイスは非常に性能が高いので、
クロス開発でなく自分でコンパイルしてもそれなりに速いはずです。

Android 端末なら各種 Linux 環境を install できそうなので試してみました。

nexus7ubuntu1.jpg

Nexus 7 で動く Ubuntu 13.04


●開発環境として

gcc, clang はもちろん、python, git, mercurial などそのまま使えるので
ライブラリのコンパイルや arm CPU のテストには十分です。
RAM は 1GB しかありませんが、CPU も 4core なのでコンパイルも予想より
高速でした。

パフォーマンスも NetWalker の時代とは比べ物にならず、
Atom NetBook でコンパイルするよりも快適です。

実際にコンパイル速度を比べてみました。

               CPU         OS         HW thread Compiler     実行時間
---------------------------------------------------------------------
1. Nexus 7     (Cortex-A9) Ubuntu arm 13.04  4  clang 3.2    12.5 sec
2. Nexus 7     (Cortex-A9) Ubuntu arm 13.04  4  gcc 4.7.2    18.2 sec
3. Optimus Pad (Cortex-A9) Ubuntu arm 12.04  2  clang 3.0    21.2 sec
4. Optimus Pad (Cortex-A9) Ubuntu arm 12.04  2  gcc 4.6.3    29.2 sec
5. VAIO type P (Atom Z540) Ubuntu x86 12.10  2  clang 3.0    26.1 sec
6. VAIO type P (Atom Z540) Ubuntu x86 12.10  2  gcc 4.7.2    33.5 sec
7. VAIO type P (Atom Z540) Windows 7 x86     2  vs2012       87.8 sec
8. NetWalker   (Cortex-A8) Ubuntu arm 9.04   1  gcc 4.3.3    91.2 sec
9. Mac HDD(Core i7-3615QM) Windows 8 x64     8  vs2012        5.1 sec
10.Mac HDD(Core i7-3615QM) Win8 x64 + NDK    8  gcc 4.7       4.9 sec
11.Mac HDD(Core i7-3615QM) Win8 x64 + NaCl   8  gcc 4.4.3     4.1 sec
12.Mac HDD(Core i7-3615QM) Win8+VMP+u12.10   4  clang 3.0     1.6 sec
13.Mac HDD(Core i7-3615QM) Win8+VMP+u12.10   4  gcc 4.7.2     2.6 sec
14.Mac HDD(Core i7-3615QM) Win8+VMP+u +NaCl  4  gcc 4.4.3     3.0 sec
15.Mac SSD(Core i5-3210M)  OSX10.8 x64       4  clang 4.2     2.3 sec
16.Mac SSD(Core i5-3210M)  OSX10.8 x64 +NDK  4  gcc 4.7       6.4 sec
17.Mac SSD(Core i5-3210M)  OSX+Para+u12.10   2  clang 3.0     3.0 sec
18.Mac SSD(Core i5-3210M)  OSX+Para+u12.10   2  gcc 4.7.2     4.4 sec
19.Mac SSD(Core i5-3210M)  OSX+Para+u +NaCl  2  gcc 4.4.3     4.1 sec
20.Mac  (Core2 Duo P7350)  Ubuntu x64 12.10  2  clang 3.2     4.3 sec
21.Mac  (Core2 Duo P7350)  Ubuntu x64 12.10  2  gcc 4.7.2     6.8 sec
22.Mac  (Core2 Duo P7350)  Ubuntu x64 + NDK  2  gcc 4.7      10.0 sec

実行時間が少ない方が高速

・NDK= Android 向け build (NDK r8d)
・NaCl= Native Client 向け build (pepper_23)
・VMP=Windows の VMware Player 上で Ubuntu 12.10 x64 (4core)
・Para=MacOS X の Paralles8 上で Ubuntu 12.10 x64 (2core)

C++ の lib のコンパイルで Debug/Release 両方生成しています。

すべてコマンドラインからのビルドで HW thread の数だけ並列化しています。

CPU だけでなくストレージの速度なども大きく影響しているので一概には言えませんが、
このサイズで持ち歩けてこの速度でビルドできるなら満足です。
用途にもよりますが、すでに "動かしてみた" レベルではなくなっているといえます。


spec 詳細
  Nexus 7           Tegra3 Cortex-A9  x4      1.2GHz   RAM   1GB
  Optimus Pad L-06C Tegra2 Cortex-A9  x2      1.0GHz   RAM   1GB
  VAIO type P       Atom Z540         x1 HT2  1.83GHz  RAM   2GB
  NetWalker PC-Z1   i.MX515 Cortex-A8 x1      0.8GHz   RAM 0.5GB
  Mac HDD           Core i7-3615QM    x4 HT8  2.3GHz   RAM  16GB
  Mac Book SSD      Core i5-3210M     x2 HT4  2.5GHz   RAM   8GB
  Mac mini HDD      Core2 Duo P7350   x2      2.0GHz   RAM   8GB


● Nexus 7 で動く Linux 環境

LINUX ON ANDROID
AndroidLinux.com
Ubuntu Nexus 7 Desktop Installer

大きく分けて二通りあり、Android として boot したままソフトウエア環境を
置き換えるタイプと、Native に最初から Linux として boot するタイプです。


前者は Android が動作したまま、chroot したプロセスのみが
あたかも Desktop Linux であるかのように振舞います。
Android 環境と併存するため比較的抵抗が少ないですが、
母体となる Android の root 権限が必要となるため、
何らかの方法で取得しておかなければなりません。

冒頭のコンパイル速度比較にある Optimus Pad (L-06C) はこちらです。
Android 上から起動して ssh 経由でコマンドラインのみ使用しています。
Window System が Native なものではないので GUI は期待出来ませんが
コマンドラインベースなら十分使える印象でした。


後者は bootloader を unlock して完全に新たな OS で置き換えます。
PC の HDD を消してクリーンインストールするようなものです。

実際は OS を置き換えなくても、Android の起動イメージを残したまま
boot 時のセレクタで切り替えることができるらしいので試してみました。
↓下記ページを参考にさせて頂きました。

Nexus 7でUbuntuをUSBメモリにインストールしてデュアルブートで起動して使う方法。

USB メモリがなくても内蔵ストレージにも共存可能な形で install できました。

xda-developers: [WiFi&3G] MultiROM v7 - updated recovery (Feb 02)

bootloader を unlock したあとに Multi boot 可能な bootloader を入れて、
install 機能を持った recovery tool を用いて OS image を書き込みます。
もちろんこれらの作業はすべて自己責任で行うことになります。


●使ってみて

Window の描画や文字が一部欠けたりとまだ不安定なところがあります。
その代わり HW アクセラレートがきいておりそれなりに高速です。
VAIO type P (Z500系 Atom) に入れた Ubuntu 12.10 よりも快適です。

タッチ操作できるようにカスタマイズされておりスクリーンキーボードも使えます。
きちんと日本語キーボードの配列に切り替わりますが、なぜか '_' の入力ができません。
縦画面にも回転できます。

ubuntu Using the Device

現時点 (2013/02/03) で Bluetooth がまだ使えないようです。
USB Host ケーブルを使えば USB 外付けの Mouse や Keyboard をつなげることができます。

Ubuntu の豊富なソフトウエアを利用できる点が魅力です。
試しに blender を install してみましたが、GLX が無く起動しませんでした。
gimp は動きました。

Chromium ブラウザをしばらく使っていると画面全体が壊れることがあります。
おそらくメモリ不足なので、swap を作った方が良いのかもしれません。

Tegra4 の Cortex-A15 や Qualcomm Krait 等、新しい世代の CPU では
I/O 含めてさらに高速に動作するはずです。
PC 無しに、Android アプリの自己開発ができるようになると面白いかもしれません。


続きます「Nexus 7 上に開発環境をつくる (2) Bluetooth と OpenGL ES 2.0」