DELL Streakをroot化してやったこと(2)

busyboxが入ってシェル上で使うコマンドには困らなくなりました。こう見えても昔はMS-DOSブイブイ言わせてた古株ですし、PC-UNIX系も全くの未経験ではないので、かなり色々なことが出来るようになったんですが、ただ、やはりOSの違いから来る不便はあるもので。特に困ったのが、Android OSにはMS-DOSで言うところのAUTOEXEC.BATが無いこと。何がしか起動毎に自動実行させたい処理があっても、簡単には用意できないんですよね。
ということで、今度はAUTOEXEC.BATモドキの作成についてエントリしてみようと思います。
何か方法は無いものかとざっと調べてみたところ、まず真っ先に出てきたのが「ブートイメージを書き換える」という方法。ブートイメージに含まれるinit.rcというスクリプトに1行書き加えることが出来れば、AUTOEXEC.BATモドキなんて楽勝なんですが……。でも、そもそもブートイメージの書き換え自体のハードルが高すぎます。DELL Streak向けに行った事例も無いので、ちょっとやってられません。残念ながらボツ。
ならば有り物で何とかするしかない訳です。幸いsystem領域は書き換え可能なので、system領域内にある何らかのスクリプトに寄生させられれば、AUTOEXEC.BATモドキが作れるかもしれません。ということでまずは、起動時に実行されるスクリプトの洗い出しを始めたんですが……実は探すまでも無いということに全く気づいていませんでした(苦笑)。
ググったり自分でinit.rcを覗いたりして、見つけたのが以下の部分。

service flash_recovery /system/etc/install-recovery.sh
    oneshot

えーと、このファイル、思いっきり見覚えがあるんですけど(苦笑)。そう、先日のroot化のエントリで無効化した「起動毎に実行される、recovery領域をチェックして書き戻してしまうシェルスクリプト」です(大苦笑)。
わざわざ無効化しているくらいなので、寄生どころかそのまま中身を書き換えて、AUTOEXEC.BATモドキとして使用可能です。で、ここ数日はこのファイルを直接ゴリゴリと書き換えて色々やっていたわけですが……。
さすがにsystem領域にあるファイルを書き換えていると面倒になってきますし、交換出来ないsystem領域を何度も書き換えるのは精神衛生上よろしくないので、ちょっとひと工夫。セキュリティ的にはヤバめかもしれませんが、ここでは利便性を取ります。
ということで、AUTOEXEC.BATモドキ版install-recovery.shは、こんな感じにしてみました。

#!/system/bin/sh
/system/bin/sh /data/autoexec.bat

.(ドット)はカレントディレクトリを表すものではありません。れっきとしたコマンドです(よく見ると/(スラッシュ)との間に空白があります)。私も完全には理解してないのですが、ドットコマンドは、要するにシェルスクリプトから他のシェルスクリプトを呼ぶコマンドなので、*1上記のスクリプトは/data/autoexec.batを呼び出してくれます。こうしておけば、以降はinstall-recovery.shを変更する必要は無くなり、代わりに/data/autoexec.batで自動実行を処理させることが出来るので、精神衛生上も手間の面でもだいぶマシになりました。
セキュリティ的には、下手にファイルを書き換えられたり実行されたりすると危ないので、とりあえずinstall-recovery.shには755の、autoexec.batには644の属性*2を付けてあります。いっそ555や444に、と思って試したらDell Stage(DELL Streakの標準ホーム)でウィジェットが一切表示されないという現象が発生した*3ので慌てて戻しました。くわばらくわばら。
まあ、それはそれとして。せっかく出来上がったAUTOEXEC.BATモドキ改め/data/autoexec.batですが、残念ながら色々弄っているうちに自動実行させるものが無くなってしまい(苦笑)、今のところ中身は空っぽです。
手軽に変更出来る自動実行スクリプトが出来たので、今後は色々やっても楽に自動実行の設定が出来るでしょう。

*1:ドットコマンドで呼び出しを行うと、autoexec.bat側でエラーが発生した際にinit.rcを道連れにしてしまうようなので修正しました。

*2:シェル(shコマンド)に起動パラメータとしてスクリプトファイルを渡す場合、実行属性は必要ありません。

*3:これがinit.rcを道連れにした結果です。おお怖い。