2013年1月12日土曜日

【CWM】AROMAインストーラー

カスタムしたシステムファイルを端末に適用したいと思った時、ClockworkMod Recovery(以下CWM)の機能を使ってzipの形でインストールする方法が古来より存在していました。
CWM自体がほぼテキスト表示オンリーで、操作もハードキーをぽちぽちしないといけないので手がつりそうになりますが、今やテクノロジーは進化し、よりグラフィカルに、操作もタッチパネルで出来るような仕組みが作られました。日本語も使える優れもの。

AROMA Installer というものです。

配布されているファイル群に、従来のインストーラーを埋め込み、簡単なスクリプトを書いてzipにするだけの簡単なお仕事です。
とは言え、ググっても日本語で解説しているサイトは見付からず、またサンプルのスクリプトを参考にしようとしても、素ではちゃんと動かない(色がおかしくなったりする)ので、上手く動かすべくいろいろ検証してみました。
取り急ぎ、気付いた点などをまとめようとしてみます。

前提は以下です。
・CWMを導入してあること
・つまりrootとってあること
・この検証はSO-01E(Xperia AX)で行った
・トラブっても自力で何とかできること(つまり自己責任)

■必要物資
・AROMA Installer(これを元に俺俺zipを作成)
・update-binaryをupdate-binary-installerにリネームしたもの(同梱のものは上手く動かなかった)

AROMA Installerは「aroma installer」で検索するとxda-developersのページが見付かると思います。超縦長なページですが、ちょっと下にスクロールしていくと巨大な「DOWNLOAD」のボタンがありますので、そこをクリックすると「aroma-x.xx.zip」(x.xxの部分はバージョン番号)がダウンロードできます。私の検証した時点ではバージョン2.56でした。
2013/10/23現在、バージョンは2.70RC2になっており、いろいろ改善されていておすすめです。
update-binaryですが、これは巷で配布されているzipに含まれているものを拝借するか、Titanium Backupを導入していれば、それでupdate.zipを作成し、その中から引っこ抜くかしてください。私の場合、「xperia ics zip cwm」等で検索したりしました。update-binaryはzipの中のMETA-INF\com\google\androidにきっと入っていると思います。
ややこしいですが、ゲットしたupdate-binaryは、「update-binary-installer」にリネームしておいてください。名前を変えずそのままAROMA Installer同梱のupdate-binaryに上書きするとジ・エンドです。(AROMAのupdate-binaryは別の働きをします。)

■PCにおける作業フォルダの準備
ここでは「c:\aroma」とします。
そして例えばその下にパッケージごとのフォルダを作ります。ここでは「mymod」とします。
まずmymodの中に、aroma-x.xx.zipの中身をぶちまけます。
META-INF\com\google\androidの中に「update-binary-installer」がありますが、これは少なくとも私の環境では役立たずだったので、別途ゲットしたupdate-binaryを「update-binary-installer」にリネームしたもので上書きします。間違っても元々入っているupdate-binaryを上書きしないように!
後は、不要なファイルを消したり自分でファイル作ったりして、最低限必要なものだけにすると、以下のような構成になるかと思います。

□aroma ━ □mymod ━ □META-INF ━ □com ━ □google
  ━ □android ┳ □aroma ┳ □fonts(もしかして要らないかも)
        ┃     ┣ □icons(中身はオリジナルのままで)
        ┃     ┣ □langs(en.langのみ残し、ja.langは自作(後述))
        ┃     ┣ □themes(テーマを適用するなら必要)
        ┃     ┣ □ttf(DroidSansFallback.ttfがあればOK)
        ┃     ┗ dot.png(自分で作る(後述)(2.70以降は不要))
        ┣ aroma-config(AROMAインストーラーのスクリプト)
        ┣ update-binary(AROMAインストーラー本体)
        ┣ update-binary-installer(既存のものをリネームして上書き)
        ┗ updater-script(従来形式のスクリプト)

langsフォルダ内のja.langですが、まずen.langをコピー、ja.langにリネームします。
そして中身をテキストエディタで編集するのですが、必要なのは「COMMON SYSTEM STRING RESOURCE」のところだけです。(text_ok=OK ~ text_quit_msg=の行まで。)「CUSTOM STRING RESOURCE」以降は削除しても構いません。
残った部分のイコールの右側を日本語にしておきます。(「text_next=次へ >」「text_yes=はい」等。)これがそのままインストーラーでのボタンの表示等になります。
編集が済んだらUTF-8(UTF-8Nでもいいかも)で保存しておいてください。ちなみにAROMAで扱うテキストはすべて文字コードUTF-8、改行コードLFのようです。
dot.pngに関しては、1ドット×1ドットの透明なpngファイルを作ってください。
これはXperiaではAROMAインストーラーの色がおかしくなる現象の対策に使用します。
まあとにかく小さめのpngであれば何でもいいです。
※バージョン2.70RC2時点では不具合が改善されているので、dot.pngは不要になりました。

元々のaroma-configはサンプルとして大変参考になりますので、別途保存しておくといいでしょう。というか元々の「aroma-x.xx.zip」を展開したものを別途保存しておくべきですね。

■aroma-configの編集
サンプルを熟読すれば、ひととおりの使い方は分かると思います。
ということで、自分なりに気が付いたことを羅列するにとどめます。

・どういう仕組みか
まずグラフィカルなインストーラーとして、aroma-configスクリプトの内容が実行されます。その中で、選択した内容等が端末の「/tmp/aroma」以下に「xxx.prop」というファイルで一時的に保存されます。
また、xxx.prop以外にも、/tmp/aromaフォルダにはいろいろ置いておくことができます。
実際のインストールの段階で、制御はupdater-scriptスクリプトに移ります。updater-scriptはaroma-configで保存しておいたものを/tmp/aromaフォルダを介して読み込み、動的な動作が可能になります。(ちなみに進捗状況はちゃんとグラフィカルのほうに反映されます。)
update-scriptの実行が済んだら制御はaroma-configに戻ってきます。

・言語ファイルの読み込み
「loadlang("langs/ja.lang");」とします。

・フォントの読み込み
「fontresload( "0", "ttf/DroidSansFallback.ttf", "12" );」
「fontresload( "1", "ttf/DroidSansFallback.ttf", "18" );」
とします。
"12"や"18"はそれぞれ小さい文字、大きい文字の設定らしいです。

・色化け対策(重要)
「splash(1, "dot");」
「ini_set("force_colorspace","rgba");」
何も考えないとXperiaでは盛大に色化けしますので、この2行をスクリプトの最初の方に記述しておいてください。
色化けを直すのは2行目の方ですが、これだけだとAROMAインストーラーが表示されなくなることがありました。いろいろ試して、ini_set("force_colorspace"~の前に何か表示させれば上手くいくことが分かったので、ダミーのpngを一瞬だけスプラッシュとして表示するという対策をとっています。
※バージョン2.70RC2時点では不具合が改善されているので、splash(1, "dot");の行は不要になりました。ini_set("force_colorspace","rgba");の方は必要ですので、忘れずに記述してください。

・ini_setとsetvarの違い
ini_setはAROMAインストーラーのシステム環境変数のようです。setvarは自由に使える変数ですね。

・関数内の"@うんたら"
アイコンを表します。iconsフォルダ内の画像ファイル名から拡張子を除き、頭に@を付けた書き方をするのが習わしのようです。テーマを適用している場合は「icon.xxx.png」の「xxx」の頭に@を付けます。

・選択肢のキー名は?
aroma-config内では、選択した内容は、「prop("xxx.prop", "キー名")」で参照できますが、このキー名は決め打ちのようです。
menuboxの場合は「selected」で、selectboxは非グループは「selected.0」、グループを組んだ場合は上から「selected.1」「selected.2」~となります。
checkboxは非グループは上から「item.0.1」「item.0.2」~、グループを組んだ場合は上から「item.1.1」「item.1.2」~「item.2.1」「item.2.2」~となります。

・ボタンの表示を変更する
「ini_set("text_next", "完了");」等とすると、ボタンの表示に反映されます。
元に戻すには再度ini_setし直してください。

・aroma-configからupdater-scriptに制御を移す
install関数でupdater-scriptに制御が移ります。
updater-script内でのui_print出力、set_progressの進捗がグラフィカル画面に反映されます。
ui_printで出力する文字列の頭に「@」を付けると、その文字列は強調して表示されます。
そうそう、ui_printは何と日本語が通ります。UTF-8N、LFで保存したupdater-scriptで検証済みです。

■作成するzipについて
通常はMETA-INFと同じ階層にインストールするファイル群を並べる格好になると思いますが、それらをzipで圧縮するだけです。
(署名とかは不要です…と思ったら勘違いのようでした。最近のCWMは署名チェックするかしないかを設定で選べるようになっており(もしかして昔から?)、なおかつデフォルトでDisabledになっていますね。それが原因でした。)
作ったzipは端末の/sdcard(内部ストレージ)もしくは/extSdCard(SDカード)に入れておいて、CWMでinstall zip from sdcard → choose zip from (external) sdcard → zip選択 → Yesと進めばAROMAが起動します。

■最後に
サンプルのzipファイルを置いておきます。
DroidSansFallback.ttfは入れてありませんので、各自AROMA同梱のものをttfフォルダに入れてください。

cwm-sample-mod-0.1.zip(バージョン2.56ベースです。)
cwm-sample-mod-0.2.zip(バージョン2.70RC2ベースです。)

なお、スクリプトを見ていただけたら分かると思いますが、実行しても端末には影響を与えません。
皆様のAROMAライフの一助になれば幸いです。

4 件のコメント:

  1. いろいろできて面白いですね。
    あとZIPファイルをいちいち署名しなくていいのもZIPファイル作成→テスト時には助かります。
    配布物のサイズがちょっと大きくなるのとたまに画面の色がおかしくなる時があるのが欠点ですがw

    返信削除
    返信
    1. ここ数年AROMAじゃないzipを作ってなかったんですが、今のCWMでも本来はやはり署名が要るのですね。
      AROMAは工夫次第で結構何でもできそうで、便利だと思います。

      ただ、たまーに固まる等不安定ではあるので、今後のバージョンアップに期待ですね。

      削除
  2. 色々探していてここにたどり着きました。

    SDカードからAndroidを起動したいと考えています。
    アプリの「BootManager」のようなデュアルブートでもいいです。

    インストールするAndroidはカスタムROMでAROMAインストーラーを使用しているので
    どこかの記述を変更したらSDにインストールできるのかと思っているのですがどうでしょうか?

    SDからAndroidを起動できる方法は何か無いでしょうか?


    返信削除
    返信
    1. 逆に私が聞きたいくらいですが、そんなことが可能なのでしょうか。
      少なくとも今の私の知識では及ばない技術だと思いますが…。

      削除