OTA パッケージの詳細

システムは、bootable/recovery/updater からアップデータ バイナリをビルドし、そのバイナリを OTA パッケージで使用します。

パッケージ自体は .zip ファイル(ota_update.zipincremental_ota_update.zip)で、実行可能なバイナリ META-INF/com/google/android/update-binary を含みます。

アップデータにはいくつかの組み込み関数と拡張可能なスクリプト言語(edify)のインタープリタが含まれており、アップデータに関連する作業一般についてのコマンドをサポートしています。アップデータはパッケージの .zip ファイル内で META-INF/com/google/android/updater-script ファイルにあるスクリプトを探します。

注: edify スクリプトや組み込み関数の使用は一般的ではありませんが、アップデート ファイルをデバッグする必要がある場合に役立ちます。

edify 構文

edify スクリプトは、すべての値が文字列である単一の式です。ブール値コンテキストでは空文字列は false で、他のすべての文字列は true です。edify は次の演算子をサポートしています(各演算子の意味は一般的なものです)。

(expr )
 expr + expr  # string concatenation, not integer addition
 expr == expr
 expr != expr
 expr && expr
 expr || expr
 ! expr
 if expr then expr endif
 if expr then expr else expr endif
 function_name(expr, expr,...)
 expr; expr

a~z、A~Z、0~9、_、:、/、. のうち予約語ではない任意の文字列は文字列リテラルと見なされます。予約語は if else then endif です。文字列リテラルは二重引用符で囲むこともできます。上記のセットにない空白文字やその他の文字を使用して値を作成する方法です。\n、\t、\"、\\ は \x## のように引用符で囲まれた文字列の中でエスケープとして機能します。

&& と || 演算子は短絡評価を採用しています。論理的な結果が左側で決定されると、右側は評価されません。次の式は同じ結果になります。

e1 && e2
if e1 then e2 endif

; 演算子はシーケンス ポイントです。最初に左辺を評価し、その後右辺を評価することを意味します。値は右側の式の値です。セミコロンは、式の後にも出現するので、C スタイルのステートメントをシミュレートする効果があります。

prepare();
do_other_thing("argument");
finish_up();

組み込み関数

ほとんどのアップデート機能は、スクリプトが実行できる関数に含まれています(厳密に言うと、これらはすべての引数を評価する必要がないため、LISP の意味では関数というよりマクロです)。特に指定のない限り、関数は成功時に true を返し、エラー時に false を返します。エラーによりスクリプトの実行を中止したい場合は、abort() または assert() 関数を使用します。 アップデータで使用できる一連の関数を拡張して、デバイス固有の機能を提供することもできます。

abort([msg])
スクリプトの実行を直ちに中止し、任意で msg を追加できます。 ユーザーがテキスト表示を有効にすると、msg がリカバリログと画面に表示されます。
assert(expr[, expr, ...])
expr を順番に評価します。いずれかが false の場合、「assert failed」というメッセージと失敗した式のソーステキストを示して実行を直ちに中止します。
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
バイナリパッチを src_file に適用し、tgt_file を作成します。ターゲットをソースと同じにする場合は、tgt_file に「-」を指定します。tgt_sha1tgt_size はターゲット ファイルの最終的な SHA1 ハッシュとサイズです。残りの引数には、SHA1 ハッシュ(40 文字の 16 進数文字列)1 つと blob 1 つのペアが必要です。この blob は、ソースファイルの現在のコンテンツが指定された SHA1 を持つ場合に適用されるパッチです。

パッチは安全に実行され、ターゲット ファイルは目的の SHA1 ハッシュとサイズを取得するか、または何も変更されません。復元できない中間状態になることはありません。プロセスがパッチ中に中断された場合、ターゲット ファイルは中間状態になる可能性があります。キャッシュ パーティション内にコピーが存在するため、アップデートを再起動するとファイルが正常に更新されます。

特別な構文により、メモリー テクノロジー デバイス(MTD)パーティションの内容をファイルとして扱い、起動パーティションなどの RAW パーティションのパッチ適用をサポートします。MTD パーティションを読み取るには、パーティションにファイルの終端という概念がないため、読み取るデータの量を把握しておく必要があります。文字列「MTD:partition:size_1:sha1_1:size_2:sha1_2」をファイル名として使用し、指定されたパーティションを読み取ります。少なくとも 1 つの(size、sha-1)のペアを指定してください。読み取り対象が複数の可能性がある場合は複数を指定できます。

apply_patch_check(filename, sha1[, sha1, ...])
filename または(存在する場合は)キャッシュ パーティションの一時コピーに、指定された sha1 値に等しい SHA1 チェックサムがある場合、true を返します。sha1 値は 40 桁の 16 進数で指定します。 この関数が sha1_check(read_file(filename), sha1 [, ...]) と異なる点は、キャッシュ パーティションのコピーをチェックすることで、apply_patch() update が中断されたことでファイルが破損していても apply_patch_check() が正常に実行されることです。
apply_patch_space(bytes)
バイナリパッチを適用するためのスクラッチ スペースとして少なくとも bytes が使用できる場合に true を返します。
concat(expr[, expr, ...])
各式を評価し、それらを連結します。+ 演算子は、この関数について 2 つの引数がある場合の特別な糖衣構文です。ただし、関数形式では任意の数の式を指定できます。式は文字列でなければなりません。blob を連結することはできません。
file_getprop(filename, key)
指定された filename を読み取り、/system/build.prop などのプロパティ ファイルとして解釈します。指定された key の値を返すか、または key が存在しない場合は空の文字列を返します。
format(fs_type, partition_type, location, fs_size, mount_point)
指定されたパーティションを再フォーマットします。サポートされているパーティション タイプは次のとおりです。
  • fs_type="yaffs2" および partition_type="MTD"。location には MTD パーティションの名前を指定してください。空の yaffs2 ファイル システムがそこに構築されます。残りの引数は使用されません。
  • fs_type="ext4" および partition_type="EMMC"。location は、パーティションのデバイス ファイルである必要があります。空の ext4 ファイル システムがそこに構築されます。fs_size がゼロの場合、ファイル システムはパーティション全体を占有します。fs_size が正の数値の場合、ファイル システムはパーティションの最初の fs_size バイトを占有します。fs_size が負の数値の場合、ファイル システムはパーティションの最後の |fs_size| バイトを除くすべてのデータを占有します。
  • fs_type="f2fs" および partition_type="EMMC"。location は、パーティションのデバイス ファイルである必要があります。fs_size には負の数を指定しないでください。fs_size がゼロの場合、ファイル システムはパーティション全体を占有します。fs_size が正の数値の場合、ファイル システムはパーティションの最初の fs_size バイトを占有します。
  • mount_point は、ファイル システムの将来のマウント ポイントである必要があります。
getprop(key)
システム プロパティの key 値(定義されていない場合は空の文字列)を返します。リカバリ パーティションで定義されたシステム プロパティ値は、メインシステムとは必ずしも一致しません。この関数は、リカバリの値を返します。
greater_than_int(a, b)
(整数として解釈される)a が(整数として解釈される)b より大きい場合にのみ true を返します。
ifelse(cond, e1[, e2])
cond を評価し、true の場合は、e1 を評価してその値を返します。それ以外の場合は、e2(存在する場合)を評価して返します。「if ... else ... then ... endif」コンストラクトは、この関数の単なる糖衣構文です。
is_mounted(mount_point)
ファイル システムに mount_point がマウントされている場合にのみ true を返します。
is_substring(needle, haystack)
needlehaystack の部分文字列の場合のみ true を返します。
less_than_int(a, b)
(整数として解釈される)a が(整数として解釈される)b より小さい場合のみ true を返します。
mount(fs_type, partition_type, name, mount_point)
mount_pointfs_type のファイル システムをマウントします。 partition_type は次のいずれかにしてください。
  • MTD。name は、MTD パーティションの名前です。たとえば、system、userdata などです。すべてを網羅したリストについてはデバイスの /proc/mtd を参照してください。
  • EMMC

リカバリではデフォルトでファイル システムがマウントされません。ただし SD カードから手動でパッケージをインストールする場合の SD カードを除きます。スクリプトは、修正が必要なパーティションをマウントする必要があります。

package_extract_dir(package_dir, dest_dir)
package_dir 下にあるパッケージからすべてのファイルを抽出し、それらを dest_dir 下の対応するツリーに書き込みます。既存のファイルはすべて上書きされます。
package_extract_file(package_file[, dest_file])
単一の package_file をアップデート パッケージから取得して、dest_file に書き込みます。必要に応じて既存のファイルを上書きします。dest_file 引数がない場合、パッケージ ファイルの内容をバイナリ blob として返します。
read_file(filename)
filename を読み込み、その内容をバイナリ blob として返します。
run_program(path[, arg, ...])
path でバイナリを実行し、arg を渡します。プログラムの終了ステータスを返します。
set_progress(frac)
直近の show_progress() 呼び出しにより定義されたチャンク内の進捗メーターの位置を設定します。frac は、0.0~1.0 の範囲内になければなりません。進捗メーターは逆方向には動きません。逆方向に動かそうとした場合は無視されます。
sha1_check(blob[, sha1])
blob 引数は、 read_file() によって返される型の blob、または package_extract_file() 引数形式の 1 つです。sha1 引数がない場合、この関数は blob の SHA1 ハッシュを 40 桁の 16 進数文字列として返します。1 つ以上の sha1 引数を指定すると、いずれかの引数と等しい場合は SHA1 ハッシュを、そうでない場合は空の文字列を返します。
show_progress(frac, secs)
sec 秒(整数値)の間、次の frac の長さだけ進捗メーターを進めます。sec は 0 にすることができ、この場合はメーターが自動で進むことはありませんが、前述の set_progress() 関数を使用して進めることができます。
sleep(secs)
sec 秒(整数値)の間スリープします。
stdout(expr[, expr, ...])
各式を評価し、その値を stdout にダンプします。デバッグに便利です。
tune2fs(device[, arg, …])
調整可能な device のパラメータ arg を調整します。
ui_print([text, ...])
すべての text 引数を連結し、結果を UI に出力します。ユーザーがテキスト表示をオンにした場合に表示されます。
unmount(mount_point)
mount_point にマウントされているファイル システムのマウントを解除します。
wipe_block_device(block_dev, len)
指定されたブロック デバイス block_devlen バイトをワイプします。
wipe_cache()
キャッシュ パーティションが正常にインストールされたときにワイプされます。
write_raw_image(filename_or_blob, partition)
filename_or_blob 内のイメージを MTD partition に書き込みます。filename_or_blob は、書き込むデータを含むローカル ファイルを指定する文字列か、blob 値の引数です。OTA パッケージからパーティションにファイルをコピーするには、次のコマンドを使用します。 write_raw_image(package_extract_file("zip_filename"), "partition_name");

注: Android 4.1 より前のバージョンでは、ファイル名のみが使用されていました。そのためこの操作を行うには、まずデータをローカルの一時ファイルに解凍してください。