Google Nexus OneでAndroid 4.4 KitKatを動かす

Google Nexus Oneは2010年に配られたスマートフォンで、公式にはAndroid 2.3.6 (Gingerbread)が最新のROMということになっている。 しかし、非公式ROMがインターネットに放流されていて、これを使うことでAndroid 4.4を使うことができた。

初期状態

Android 4.4にアップデートする前、このデバイスは公式Android 2.3.6 (GRK39F)で動作していた。 なお、これはAT&T版で、PB99110という型番が書いてある。

rootとる

なにはともあれ、rootがないと各種ツールを導入できない、ということで、Android 2.3.6でrootをとる。 これにはDooMLoRD's Easy Rooting Toolkit [v4.0](zergRush Exploit) [xda-developers.com]を使った。

実際に用いた版はDooMLoRD_v4_ROOT-zergRush-busybox-su.zipで、SHA-1が505071b8ac2036536c8a52d5ae43fc6eb2915caaのもの。 Linux環境で作業したため、バッチファイル中のadbコマンドの呼び出しを逐一Linuxでうまくいくよう書き換えながら実行。

無事、rootがとれた。

4EXT Recoveryの導入

Androidのリカバリパーティションに4EXT Recoveryというツールを導入。

APKがhttp://www.4ext.net/で配布されている。 このツールを起動すると、どのバージョンをROMに導入するか選択することができる。 とりあえず最新版の4EXT Recovery Touch v1.0.0.5 RC9を導入した。

なお、この4EXTは、Gingerbreadが起動すると壊されてしまう。 Gingerbreadが起動する度に4EXT Recovery Updaterを起動し、4EXT Reoveryを書き込むしかなかった。

ブートローダーとパーティション

アンロックされたブートローダーを導入し、パーティションを切る。

ブートローダーはBLACKROSE (Custom HBOOT) [xda-developers.com]を使った。

以下のように、まずカスタムブートローダーを導入し、次にトラックボール押下しながら電源投入でfastbootモードにし、その状態でパーティション構成を変更したHBOOTを焼けばよろしい。

$ ./BlackRose
$ ./BlackRose editor
Loading...
* daemon not running. starting it now *
* daemon started successfully *
Nexus One BlackRose Editor
If you want resize partition, type [resize] and press enter key:resize
SYSTEM + CACHE + USERDATA = 436MB
system size(MB):290
cache size(MB):33
label name(20 char max):kk
system size:290MB cache size:33MB userdata size:113MB
label:kk
Custom BlackRose(hboot_brcust.nb0) is saved
$ ./other/fastboot-l flash hboot hboot_brcust.nb0 
sending 'hboot' (512 KB)... OKAY
writing 'hboot'... OKAY

Beanstalkを焼く

microSDにBeanstalk Rom 4.4.001 [xda-developers.com]にあるBeanstalk_4.4.4001-passion.zipを入れておく。 なお、このzipファイルには、MacOS X特有の__MACOSX/*.DS_Storeがなぜか含まれていたので、zip -d ….zip …などとして消しておいた。

Nexus Oneをトラックボールを押しながら起動する。 Recoveryを選択すると仕込んでおいた4EXTが起動する。

4EXTで、wipeを選び、SDカード以外をすべてwipeする。 次に、例のzipファイルを選択し、書き込む。 再起動するとAndroid 4.4.4 (Beanstalk 4.4)が起動した。

なお、このROMでは、4EXT Recoveryが破壊されることはなかった。

mounts2sdを導入

Nexus Oneのオンボードフラッシュメモリは512 MBしかないので、そのままKitKatを利用し続けるには足りない。 そこで、Mounts2SD - Storage & Memory Management [xda-developers.com]を導入、一部のデータをmicroSD側に移動することができる。

まずPCでmicroSDカードのパーティションを切る:

# fdisk /dev/mmcblk0

fdisk (util-linux 2.25.2) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): p
Disk /dev/mmcblk0: 3.7 GiB, 3904897024 bytes, 7626752 sectors
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x00000000

Device         Boot Start     End Sectors  Size Id Type
/dev/mmcblk0p1 *     2048 7626751 7624704  3.7G  c W95 FAT32 (LBA)


コマンド (m でヘルプ): d
Selected partition 1
Partition 1 has been deleted.

コマンド (m でヘルプ): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (1-4, default 1): 
最初のセクタ (2048-7626751, default 2048): 
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (2048-7626751, default 7626751): +1536M

新しいパーティション 1 をタイプ Linux、サイズ 1.5 GiB で作成しました。

コマンド (m でヘルプ): t
Selected partition 1
16 進数コード (L で利用可能なコードを一覧表示します): c
DOS 6.x 領域を作成、または変更してしまった場合は、cfdisk 付属文書にある追加情報ページを参照してください。
パーティションのタイプを 'Linux' から 'W95 FAT32 (LBA)' に変更しました。

コマンド (m でヘルプ): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (2-4, default 2): 
最初のセクタ (3147776-7626751, default 3147776): 
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (3147776-7626751, default 7626751): 

新しいパーティション 2 をタイプ Linux、サイズ 2.1 GiB で作成しました。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

# mkfs.vfat /dev/mmcblk0p1
mkfs.fat 3.0.27 (2014-11-12)
# mkfs.ext3 /dev/mmcblk0p2 
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done                            
Creating filesystem with 559872 4k blocks and 139968 inodes
Filesystem UUID: f8540f07-f381-4405-9f99-41203c8b05be
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

これを装着するとNexus Oneではこんな感じになる:

1|root@passion:/ # df
Filesystem               Size     Used     Free   Blksize
/dev                   201.3M   136.0K   201.2M   4096
/sys/fs/cgroup         201.3M     0.0K   201.3M   4096
/mnt/asec              201.3M     0.0K   201.3M   4096
/mnt/obb               201.3M     0.0K   201.3M   4096
/system                290.0M   212.8M    77.2M   4096
/data                  113.3M    98.1M    15.1M   4096
/cache                  33.0M     1.1M    31.9M   4096
/mnt/media_rw/sdcard0     1.5G    12.0K     1.5G   4096
/mnt/secure/asec         1.5G    12.0K     1.5G   4096
/storage/sdcard0         1.5G    12.0K     1.5G   4096

で、APKを導入しようとしたが、Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE]と言われてしまいうまくいかなかったので、Beanstalk ROMに元から入っているExchange Servicesを削除した。すると:

% adb install Mounts2SD-3.4.8-unlocked.apk
1294 KB/s (2300141 bytes in 1.734s)
	pkg: /data/local/tmp/Mounts2SD-3.4.8-unlocked.apk
Success

となり、うまくいった。 Mounts2SDを起動し、Install startup scriptを選択後、再起動する。 結果、マウント一覧はこんな感じに:

# df 
Filesystem               Size     Used     Free   Blksize
/dev                   201.3M   136.0K   201.2M   4096
/sys/fs/cgroup         201.3M     0.0K   201.3M   4096
/mnt/asec              201.3M     0.0K   201.3M   4096
/mnt/obb               201.3M     0.0K   201.3M   4096
/system                290.0M   212.9M    77.1M   4096
/data                  113.3M    72.3M    40.9M   4096
/cache                  33.0M     1.1M    31.9M   4096
/sd-ext                  2.1G    94.8M     2.0G   4096
/data/app                2.1G    94.8M     2.0G   4096
/data/app-private        2.1G    94.8M     2.0G   4096
/data/app-asec           2.1G    94.8M     2.0G   4096
/mnt/media_rw/sdcard0     1.5G    16.0K     1.5G   4096
/mnt/secure/asec         1.5G    16.0K     1.5G   4096
/storage/sdcard0         1.5G    16.0K     1.5G   4096

日本語が表示できるようにする

Beanstalk ROMを焼いてから日本語が表示できないことに気付いた。 簡体字で表示されてしまうのはありがちだが、今回の場合全く表示されない。 豆腐もでない。 /system/etc/fallback_fonts.xmlを見ると、lang="ja"でMTLmr3m.ttfなるファイルを指定しているが、当該ファイルはROMの中には見当たらない。 MTLmr3m.ttfは検索するとダウンロードできるので、これを適切に配置する。

% adb shell
root@passion:/ # mount -o remount,rw /system
root@passion:/ # ^D
% adb push MTLmr3m.ttf /system/fonts
1318 KB/s (2871020 bytes in 2.126s)

そして再起動する。

以上で見事日本語が表示できるようになった。

結論

以上のような方法でとりあえずNexus OneでKitKatを動作させることができた。 USに行く必要があるが、SIMフリーのAndroid端末がなくて困った、といった時には十分使える機種になった気がする。

KitKatのROM焼き後、無事AT&Tのgophoneサービスで通話・データ通信が行えることを確認した。 店員に「この端末かなり遅いけど一応動いてるっぽい」等といわれた。 リンクはHSDPAと表示されていた。