Nexus7をroot化してやったこと

ここのところ気が緩んでたのか、すっかりAndroid4.2のアップデートというイベントをスルーしまくっていました。ということで、遅まきながらアップデートをしたんですが、そのネタ振るにはまずroot化の話をしとかないといけないので、まずはそっちをエントリしてみようと思います。
では、ブートローダーアンロックしてroot化していきます。詳しい方法は他サイトにいくらでも転がっているので、そちらを参照してもらうとして、手順だけ簡単に。
まずブートローダーアンロック。Nexus7のUSBドライバを用意し、音量上下ボタンを押しながら電源ONしてブートローダーモードで起動、PCに繋いでドライバをインストールしたら、コマンドプロンプトから"fastboot oem unlock"をパシっと入力。Nexus7側でアンロックを行うかどうか確認される(英文)ので、音量ボタン上下でYESを選択して電源ボタンで決定すればアンロックされる、という寸法。アンロック時にデータが全消去されるのも含めて、全くGALAXY Nexusと同じです。なお、fastbootコマンドはAndroid SDKに含まれているものですので、そちらの用意も必要ですが省略。
続いてそのまま(Nexus7はブートローダーモードでPCにつながっている状態から)、CWM Recoveryの書き込みです。ClockWorkModのサイトからGoogle Nexus7用のCWM Recovery(右列のTouch版がオススメ)をダウンロードしてきて、コマンドプロンプトから"fastboot flash recovery <ダウンロードしてきたファイルのパス>"と入力してリカバリを書き換え、終わったら続けてコマンドプロンプトから"fastboot reboot-bootloader"でブートローダーを再起動。端末側で音量上下でRecovery modeを選択して電源ボタンで決定、リカバリーモードを起動します。ここではすぐにreboot system nowで再起動。ROM may flash stock recovery on boot. Fix? と聞かれるのでYES - Disable recovery flashを選択してinstall-recovery.shを無効化しておきます。以降install-recovery.shは動作しなくなるようなので(戻す方法があるかどうかは不明)、もし別の目的でinstall-recovery.shを使うつもりがあるなら別の方法で無効化を行ったほうが良いかもしれません。
再起動したら今度はroot化。RootzWikiのページからカスタムリカバリ向けのSuperSUアプリのZIPファイル(最初のコメントの下側にあるJB-SuperSU.zipです)をダウンロードしてきて、起動したNexus7の内蔵ストレージにコピーして、再度CWMリカバリを起動、install zip from sdcard→choose zip from sdcardと進んで、先程コピーしたファイルを選択すればroot化も完了。ちなみに、もしSDカードの中身がコピー時と違っていた場合は、mounts and storage→mount /sdcardと進んでSDカードをマウントしなおしてみてください。
ここまででroot化が終わったので、色々と手を入れていきます。このあとの作業に必要なので、まずはGooglePlayからESファイルエクスプローラーをインストールします。Root Explorerでも構いませんが、私はこっちのほうが好きなので(無料ですし)。root権限でのファイル操作と/systemへの書き込みが出来るように設定しておいてください。
最初にやったことは、Flash Playerのプリインストール化です。そのまま/system/appに書いても動かないので、ちょっとファイルに加工をしてやる必要があります。

  1. アーカイブ版 Flash Player の提供についてのページから、Android 4.0用のFlash Playerをダウンロードしてきます。このエントリを書いている時点での最新版は11.1.115.27ですね。Android 3.x/2.x用と間違えないように。
  2. ダウンロードしてきた.apkファイルをアーカイバに突っ込みます。私はExplzhを使いました。そうすると中身が見えるので、libディレクトリ内にあるファイルを4つ、展開して取り出します。取り出したらそのままアーカイブ内のlibディレクトリ丸ごとを削除して.apkを更新します。削除できないor分からないのであれば、ファイルを取り出すだけでもOKです。ただし、/systemの容量をちょっと無駄にしますが。
  3. 出来上がったlib無し.apkと取り出した4つ、合わせて5つのファイルをNexus7の内蔵ストレージにコピーします。
  4. Nexus7側でファイラーを操作し、まず4つの取り出したファイルを/system/lib/plugins/com.adobe.flashplayerディレクトリ(pluginsディレクトリ以下は存在しないので新規に作成して属性は755に変更)に移動し、属性を644に変更します。
  5. 残った1つの加工済み.apkを/system/appディレクトリに移動し、属性を644に変更します。ファイル名はそのままでも構いませんが、プリインストールされている機種ではoem_install_flash_player.apkという名前になっているようですので、参考まで。
  6. Nexus7の電源を入れ直し再起動します。Androidをアップグレードしていますという内容のダイアログが出て少し待たされますが、あとは普通に起動します。もしダイアログが出ない場合、ファイル属性や移動先のディレクトリが間違っている可能性が高いので確認してみてください。

これでFlash Playerのプリインストール化は終了。ドロワー画面にFlash Player Settingsのアイコンが出現しています。ただし、このままだとブラウザとしてFlash Playerに対応していないChromeが使われてしまい、Flash Playerが使い物になりません。Chrome以外の対応ブラウザをインストールすればいいだけなんですが、私はここでちょっと拘って、Android4.1.2の標準ブラウザをプリインストール化してみました。

  1. Android4.1.2の端末の/system/appディレクトリから、Browser.apk(ブラウザ)とChromeBookmarksSyncAdapter.apk(Googleブックマーク同期)を抜き出してきます。私は4.1.2にアップグレードしたGALAXY Nexusがあったのでそこから抜き出してきましたが、どうしてもということならWEBで検索すれば配布されているものがあるので、それを利用してください。ライセンス的にはわりとグレーゾーンな気がしますので、詳細は控えますが……。
  2. 抜き出した2つのファイルをNexus7の内蔵ストレージにコピーします。加工は必要ありません。
  3. Nexus7側でファイラーを操作し、2つのファイルを/system/appディレクトリに移動し、属性を644に変更します。
  4. Nexus7の電源を入れ直し再起動します。Flash Playerの時と同様にダイアログが出て待たされますが、あとは普通に起動します。

これで標準ブラウザが復活して、ドロワー画面に地球のアイコンが現れます。ちなみに、私のNexus7とGALAXY Nexusから引っこ抜いた.apkだと大丈夫だったんですが、場合によってはこのままだとブラウザが落ちて起動しない場合があるようです。その場合は、/system/appディレクトリ内のBrowserProviderProxy.apkとBrowserProviderProxy.odexを無効化してください。削除しても大丈夫だと思いますが、拡張子が.apkと.odex以外になっていれば無効になりますので、BrowserProviderProxy.apk.org・BrowserProviderProxy.odex.org等にリネームして残しておくのがオススメです。*1
普通に使う分にはこれで十分なんですが……。私がNexus7を買ったのは「1台くらいタブレットが無いとなぁ……」というのが動機だったんですが、Nexus7のUIはタブレットUIではなく、拡大されたスマートフォンUI*2になっているんですよね。調べてみたらroot化されていれば簡単に切り替えられるので、それも弄りました。

  1. ESファイルエクスプローラーから/systemディレクトリ内にあるbuild.propを開き、ESテキストエディターを選択してテキストエディタを起動します。
  2. ro.sf.lcd_densityという項目を見つけ、値を初期値の213から160に書き換え、ファイルを保存しテキストエディターを終了します。
  3. build.propファイルの属性が変わってしまっているので、ファイル属性を644に変更します。
  4. Nexus7の電源を入れ直し再起動します。

これであっさりとUIがタブレットUIに切り替わります。ただ、デスクトップも変わってしまう関係で色々変なことになりますので、やるならファクトリーリセットも併用すべきだと思いますが。
で。先のエントリで書いた通りストレージの容量には不満を感じていないのですが、外部とのデータのやり取りにUSBメモリ等を使えれば便利ということで、ついでにUSBホスト機能による外部メモリのアクセスも出来るよう弄ってみました。

  1. GooglePlayでStickMountというアプリをインストールします。他にも似たようなアプリはあるようですが、SuperSUアプリと同じ作者さんなのでコレを利用します。このあとプリインストール化するので、インストールしたら/data/app/eu.chainfire.stickmount-1.apkを内蔵ストレージにコピーして、すぐにアンインストールします。
  2. xda-developersのページから、Module Loader 1.1をダウンロードしてきて(最初のコメントのかなり下にあるModuleLoader-release.apkです)、これもNexus7の内蔵ストレージにコピーしておきます。
  3. xda-developersのページから、ファイル名の日本語化に必要なカーネルモジュールをダウンロードしてきます(最初のコメントのjb-3.1.10-g52027f9.zipです)。必要なのは中に入っているnls_utf8.koだけなので、PCの適当なフォルダにそのファイルだけ展開しておきます。
  4. Nexus7の設定→タブレット情報から、カーネルバージョンの最初の1行の文字列をメモしておきます。その文字列が見れればいいだけなので、その項目を表示させたNexus7をそばに置いておくだけでも構いません。
  5. PCのバイナリエディタ(私はstirlingを使っています)で先程のnls_utf8.koを開き、オフセット0x0122からにある"3.1.10-g52027f9"という文字列を、カーネルバージョンの最初の1行の文字列に書き換えて保存します。保存できたらこれもNexus7の内蔵ストレージにコピーしておきます。
  6. Nexus7側でファイラーを操作し、Stick MountとModule Loaderの2つの.apkファイルを/system/appに移動し属性を644に、nls_utf8.koを/system/lib/modules(modulesディレクトリは存在しないので新規作成し属性を755に変更)に移動し属性を644にします。
  7. Nexus7の電源を入れ直し再起動します。例によってダイアログと、デスクトップまで来るとStick MountとModule Loaderが出したトーストが表示されます。
  8. Module Loaderを起動し、System Modules→nls_utf8.koと選んでチェックボックスをONにし、画面上部のSave selectionボタンを押して、Will insmod 1 modulesと確認されるのでOKを選んで設定を保存し、アプリを終了します。
  9. Stick Mountを起動し、LANGUAGEのUTF-8の項目をタップしチェックボックスをONにしたらアプリを終了します。

これで、USBホスト機能で接続された外部メモリ(電源が許すならHDDでもイケるはず)にアクセス出来、ファイル名が日本語でも化けなくなります。
 だいぶ長文になってしまいましたが、これでとりあえず「Nexus7をroot化してやったこと」は終わりです。Android周りで細々したことは色々やっているので、そういうネタもぽちぽち出していこうと思います。

*1:Linuxチックに属性を000にするってのもアリかも? 書いた後気づきました(苦笑)。

*2:Phone+TabletでPhablet(ファブレット)と呼ぶらしい