Nexus7(2012)のLineageOSにtermuxを導入する

目的

以下、環境にtermuxを導入するにあたり、当該バージョンで躓いた箇所の解決方法をメモしておこうと思います。

環境

  • H/W: Nexus7(2012)
  • S/W: LineageOS 14.1-20170423(Android7.1.2)
  • termux(0.73)をAPKPureでインストールを想定
  • プロンプトと環境
$ adbコマンドを実行するコマンドプロンプト(Linuxでも可)
grouper:/ # Nexus7にadb shellにログインした状態
% LinuxサーバでdockerでWEBサーバを実行する環境

調査

termuxのパッケージをインストール後、termuxの初期環境の入ったbootstrapファイルのダウンロードが正常に行われなかったため、この原因を調査し解決していこうとおもいます。

bootstrapのファイルのURL

初めに、このbootstrapファイルですが、後でわかったのですが、どうも古いパッケージに埋め込まれたURLと、現在提供中のURLが以下のように異なっているようです。

(新)○ http://termux.net/bootstrap/bootstrap-arm.zip
(旧)× https://termux.org/bootstrap-arm.zip

ログを確認する

Nexus7とPCをUSBで繋いでadbで操作をしていきます。

Nexus7でtermuxを実行したのち、adbで繋いでログを確認すると、以下の通り、間違ったURLへ接続を繰り返している事が確認できました。

Javaのsourceはさすがに修正できないので、URL曲げる方向で検討することにします。

$ adb get-state
$ adb shell
grouper:/ # logcat -t 1000|grep boot
04-22 02:24:10.650 7213 9172 E termux : java.io.FileNotFoundException: https://termux.org/bootstrap-arm.zip

どのファイルがURLを突きに行くのか

Nexus7とPCをUSBで繋いでadbでURLが埋め込まれたファイルを捜索していきます。

$ adb get-state
$ adb shell
grouper:/ $ su
grouper:/ # cd /data/app/com.termux-1/oat/arm
grouper:/data/app/com.termux-1/oat/arm # strings base,odex | grep http
./data/misc/profiles/cur/0/com.termux/primary.prof
0https://dl.bintray.com/termux/termux-packages-24
'https://termux.net/bootstrap/bootstrap-
https://termux.org/bootstrap-
https://wiki.termux.com
&https://wiki.termux.com/wiki/Main_Page

修正

上記より、以下のファイルに接続先が埋め込まれているであろうことがわかりましたので、このファイルを書き換えて行こうと思います。

grouper:/data/app/com.termux-1/oat/arm # pwd
/data/app/com.termux-1/oat/arm

バイナリファイルの書き換え

直接/data/app/com.termux-1/oat/armからファイルを転送することが出来ないので、いったん/storage/self/primary にファイルを移してからとってきます。

$ adb get-state
$ adb shell
grouper:/ $ su
grouper:/ # cd /data/app/com.termux-1/oat/arm
grouper:/data/app/com.termux-1/oat/arm # cp base.odex /storage/self/primary
^D
$ adb pull /storage/self/primary/base.odex ./

ファイルを取ってきた後、PCでbzエディタに base.odex を放り込んで、ASCIIモードで
「https://termux.org/bootstrap-」を検索して
「http:///termux.org/bootstrap-」に書き換えて保存する

$ adb push base.odex /storage/self/primary
$ adb shell
grouper:/ $ su
grouper:/ # cp /storage/self/primary/base.odex /data/app/com.termux-1/oat/arm/

linuxのPCでWEBサーバ起動

% cd /home/saka/ngixn/
% sudo vi default.conf
server {
  server_name termux.org;
  listen 80;
  location /bootstrap-arm.zip {
    proxy_pass http://termux.net/bootstrap/bootstrap-arm.zip;
  }
}

% sudo docker run -d --rm \
  -p 80:80 \
  -v /home/saka/nginx:/etc/nginx/conf.d \
  nginx \
  nginx-debug \
  -g 'daemon off;'

nexus7で/system/etc/hosts設定を変える

hostsファイルはread onlyでマウントされているので直接編集できないので、read writeモードで再マントします

$ adb shell
grouper:/ $ su
grouper:/ # mount|grep system

/dev/block/platform/sdhci-tegra.3/by-name/APP on /system type ext4 (ro,seclabel,relatime,user_xattr,acl,barrier=1)

grouper:/ # mount -o rw,remount \
            /dev/block/platform/sdhci-tegra.3/by-name/APP \
            /system
grouper:/ # mount | grep system

/dev/block/mmcblk0p3 on /system type ext4 (rw,seclabel,relatime,user_xattr,acl,barrier=1)

hostsにtermux.orgのIPアドレスを設定します。このIPアドレス(ここでは192.168.1.122としています)は、WEBサーバを起動したLinux PCの物にしてください。

grouper:/system/etc # cd /system/etc
grouper:/system/etc # cp hosts hosts.org
grouper:/system/etc # echo '192.168.1.112 termux.org' >> hosts
grouper:/system/etc # cat hosts
127.0.0.1 localhost
::1 ip6-localhost
192.168.1.112 termux.org
grouper:/system/etc # ping termux.org
PING termux.org (192.168.1.112) 56(84) bytes of data.
64 bytes from termux.org (192.168.1.112): icmp_seq=1 ttl=64 time=61.8 ms

Nexus7でtermuxを起動

既に起動していたらいちどOS事再起動しておいてください。
termuxを起動して、bootstrapファイルのダウンロードが始まれば完了です٩(^▽^*)


他にもいろいろ試したのですが。。。

bzでURLを正しいものに書き換えたら・・・と思ったけど、あくまでもバイナリデータの編集なので、1byteも漏れなく修正する必要があるので、最小限にとどめる必要があった。

httpsのままにしてはどうか?と思ったけど、正しいURLも元の、httpsからhttpへ変更になったようで、httpsで直接接続が出来ない。また、Proxy用のLinuxで立てたWebサーバでSSLサーバ証明書を持たせるにはオレオレしかありませんが、nexus7のjavaが証明書エラーで接続に失敗するので、httpでのproxy接続とする必要があった。

最新のtermuxをインストールすれば?を検討したけど、Nexus7(2012)にインストールできるLineageOSは上記が限界で、最新のtermuxをインストールすることができなかった。

まぁとりあず、本来の目的はtermuxを使う事なので、手段は出来れば何でも良いかな。hostsとか、いじったところは直しておきましょう!

Nexus7(2012)を4.4.4にもどす!

5.1.1にしたら、めっちゃ遅くなった!!!
4.4.4は快適だった。。。これは戻さねばっ!(ホントはちょっと違うのだがw)

手順

  1. googleのサイトからFactoryImageをダウンロードします
  2. Nexus7(2012)は、 “nakasi” for Nexus 7 (Wifi)
    の方の、4.4.4 (KTU84P)を選びましょう!

  3. ダウンロードが完了したら、Nexus7とPC(ubuntu)をUSBケーブルで接続しましょう
  4. この時、bootloaderがunlockできる状態にしておきましょう。
    unlockはココを参照ください。

  5. ダウンロードしたファイルを展開します。
  6. gzip -dc nakasi-ktu84p-factory-2c6e4d6f.tgz | tar xf -
    
  7. 展開したファイルの中にあるスクリプトを実行します。
  8. cd nakasi-ktu84p
    ./flash-all.sh
    

後は待つのみ。
旨く行ったら、Nexus7で[START> を電源ボタンで選択して、初期セットアップを開始!

ふぅ。なおってよかった(´∀`;)・・・えw