More Related Content
Similar to Androidのリカバリシステム (Androidのシステムアップデート) (20)
Androidのリカバリシステム (Androidのシステムアップデート)
- 2. 今日の内容
●
ABS2012 の Intel Andrew Boie 氏のセッショ
ン、“ Android Software Updates” をベース
に Android の OTA アップデート / リカバリシス
テムの解説をします
●
Lollipop で の 新 機 能 、 SecureBoot/Block-
Oriented OTA についても少々
- 3. 自己紹介
●
Twitter ID:@l_b__
●
PF 部の司会進行役 兼 懇親会手配役 兼 配信
係 兼 雑用係
●
フレームワーク周りが好物です
●
BeOS 好きだったのと Java-er なので Be 関係者
が多い ( 多かった )Android に惹かれました
●
仕事は某 SIer で Android フレームワーク修正か
らアプリ作成までやっていましたが最近は
Android やっていません
- 9. AOSP 内コンポーネントその2
●
Recovery Console (RC)
– Android 内の別ブート環境
– システムアップデート処理を起動
– ファクトリデータリセットを実行
– bootable/recovery 配下
●
Updater
– アップデートファイル内のアップデートロジックと実
行形式バイナリ
– RC から起動され、 Edify と呼ばれる独自スクリプ
トで実行
– bootable/recovery 配下
- 13. Android のパーティションレイアウト
●
boot
– Linux カーネルと root ファイルシステムになる
RAM ディスク
– init をはじめとした、 /system をマウントし
Android を起動するためのツールが含まれる
●
system
– 全ての Android のシステムアプリとライブラリを含
む
– OTA アップデート時以外は常に Read-only でマ
ウントされる
●
※Lollipop では OTA アップデート時も Read-only
でマウント ( 後述 )
- 15. Android のパーティションレイアウト
●
recovery
– リカバリ OS( 互換起動イメージ ) 格納
– RecoveryConsole(RC) の実装をはじめとした
recovery 機能を含む RAM ディスク
●
misc
– ファイルシステムを含まない非常に小さな領域
●
Bootloader Control Block(BCB) と呼ばれ、ブ
ロックデバイスとして直接読み書きされる
– RC と Bootloader 、カーネル間のやり取りに使わ
れる
- 17. Android Boot イメージ
●
メタデータ (boot header) 、カーネルイメー
ジ、 RAM ディスク、 2nd ブートローダー ( オプ
ション ) を格納したコンテナファイルフォーマット
●
system/core/mkbootimg を使って生成
– ファイルフォーマットは
system/core/mkbootimg/bootimg.h で定義
– 通常ビルド時と OTA アップデートファイル生成時
に使用される
- 22. Android セキュリティ
●
全ての APK は電子署名される
– 同じアプリのバージョンアップとして扱われるには
同じ証明書で署名される必要がある
– 複数のアプリで同じユーザー ID を共有するのにも
それらのアプリが同じ証明書で署名される必要
がある
– LOCAL_CERTIFICATE として定義された証明書
を使用。
●
デフォルトでは testkey を使用
- 23. Android セキュリティ
●
AOSP は build/target/product/security に以
下の 4 つの証明書キーを持っている
– testkey:APK 署名のデフォルトキー
– platform: コアプラットフォーム署名向け
– shared: ホームと連絡先アプリのプロセス間で共
有されるプロバイダ向け
– media: メディア / ダウンロードプロバイダ向け
- 25. ota_from_target_files
●
TFP から OTA アップデートファイルを生成するた
めの Python スクリプト
– ota_from_target_files [flags]
input_target_files output_ota_package
– (--incremental_from) <file>
●
差分アップデート時に差分の元となる TFP を指定
– (--wipe_user_data)
●
OTA で /data を消去
– (--package_key) <key>
●
パッケージ署名に使うキーを指定
– デフォルトは testkey
- 27. アップデートファイル生成まとめ
Android ビルド
TFP
( Test Key 使用)
APK 再署名 TFP
差分アップデート
元 TFP
アップデート
ファイル生成
アップデート
ファイル
make target-files-package
sign_target_files_apks
ota_from_target_files
差分アップデート
ファイルの生成場合必要
- 28. Releasetools 拡張
●
Releasetools を拡張するには以下のファンクショ
ンを実装した Python モジュールを作成する必
要がある
– FullOTA_Assertion()
– FullOTA_InstallEnd()
– IncrementalOTA_Assertion()
– IncrementalOTA_VerifyEnd()
– IncrementalOTA_InstallEnd()
●
モジュールを置いたパスを BoardConfig.mk に
TARGET_RELEASETOOLS_EXTENSIONS と
して記述する
- 31. RecoverySystem API
●
android.os.RecoverySystem としてアプリから
使用可能な API
– REBOOT のパーミッションが必要
– /cache の読み書き権限も必要なので system
ユーザー向け API
●
/cache/recovery/command にコマンド (OTA
アップデート / ファクトリデータリセット ) 、アップ
デートファイルパスを書き込み、 OS 再起動後に
Recovery Console へ伝える
●
アップデートファイルの検証を実行
– /system/etc/security/otacerts.zip をデフォル
トでは検証に使用
- 33. Recovery Console
●
リカバリ用の起動イメージ
– シェルから’ reboot recovery’ で起動
– RecoverySystem API から起動
– ベンダーが実装するブートローダーからの操作と
して起動
●
UI は画像ベース、ローカライゼーションにも対応
●
手動操作向けの隠しメニュー
– ファクトリデータリセット
– SD カードからのアップデート
– UI プラグインでデバイス固有の機能追加可能
- 35. Recovery Console の制御
●
RC 起動時は以下をコマンドライン引数として
チェックする
– recovery コマンドの引数 デバッグ用途のみ
– BCB の recovery パラメータ
– /cache/recovery/command ファイル
(RecoverySystem API が書き込み )
●
起動時に引数を BCB に常に保存
– アップデート中の不意の電源断時に再度ブート
ローダーがリカバリ OS を起動するようにする
- 37. ブートローダーとの調整
●
カーネルは reboot() の引数とし
て” recovery” が与えられたら、 BCB の
command パラメータに” boot-recovery” を
書き、 recovery パラメータを 0 クリアする
– ドライバの register_reboot_notifier() で実装す
る
●
ブートローダーは起動イメージを BCB の
command パラメータで判断する
– RC が command パラメータを消去するまでは RC
を起動
– command が消去されていれば通常の Android
起動
- 38. Recovery Console UI プラグイン
●
RC へデバイス固有の拡張を追加可能
– BoardConfig.mk の
TARGET_RECOVERY_UI_LIB にライブラリの
$(LOCAL_MODULE) を定義する
– bootable/recovery/device.h で定義される
Device クラスを実装することで独自拡張可能
– device/htc/fugu/recovery 以下に実装サンプ
ルあり
- 39. Recovery 画面
●
GUI は画像ベース
●
bootable/recovery/ 配下の res-mdpi 〜 res-
xxxhdpi に標準の画像があり、差し替え可能
– RGB/RGBA フォーマットの 8bit PNG ファイル
– ファイル名は同じままにしておく
●
bootable/recovery/interlace-frames.py とし
てアニメーションの作成に使えるスクリプトが準
備されている
– ベース画像とオーバーレイする複数フレームを一
枚画像にする
- 41. Updater 実行バイナリ
●
アップデートファイル内に含まれる
– zip ファイルに含まれることで、アップデートの実装
コードが既存に存在している必要が無くなる
●
必ずしも AOSP の Updater 実装を使用する必要
はない
– RC は Updater を fork()/exec() で実行し、 pipe
で通信する
– RC は引数を 3 つ渡す
●
Android.mk で定義された RC API バージョン
(Android2.2 〜 5.0 でバージョン 3)
●
pipe のファイルディスクリプタ
●
アップデート zip ファイルパス
- 42. Updater 実行バイナリ
– Updater は画面 ( 進捗表示 ) 表示制御や文字表
示、 cache 消去などの文字列コマンドを pipe
経由で RC に送信する
●
bootable/recovery/install.cpp 参照
●
AOSP 実装 Updater はアップデートファイル内の
Edify で記述されたスクリプトを実行する
●
デバイス固有の Updater 機能はプラグインとし
て実装可能
●
Updater の中断処理には注意 ! 正しく実装しな
いと文鎮化してしまう
- 43. 起動からのリカバリ処理
●
RC 自体は OTA アップデートの処理中はアップ
デートされない
– 不意の電源断後も同じ RC が使用されることを確
実にするため
●
flash_recovery
– init.rc の oneshot service として実行
– /system/etc/install-recovery.sh を実行
– recovery イメージの SHA1 ハッシュをチェックして
パッチを当てる必要があるか判断
– 必要があれば recovery パーティションの起動イ
メージにパッチを当てる
- 46. Updater プラグイン
●
ライブラリとして複数の追加定義が可能
– Static ライブラリとして作成
– BoardConfig.mk に
TARGET_RECOVERY_UPDATE_LIBS として
ライブラリ名を定義
– サンプル実装として
device/asus/fugu/recovery を参照
– TARGET_RECOVERY_UPDATE_EXTRA_LIBS
として Static ライブラリのバイナリ ( サポートライ
ブラリ ) を追加定義可能
- 48. 製品化タスク
●
Releasetools 拡張実装
– OTA アップデートファイルへの RADIO イメージの
追加・パッチのロジックを追加
– イメージを扱う Edify コマンドの Updater スクリプ
トへの追加
– 必要ならアサーション・ベリフィケーション処理を追
加
●
BoardConfig.mk にプラグイン、拡張、サポートラ
イブラリの定義を追加
●
設定アプリから IntentFilter で OTA アップデート
ファイルダウンロード処理を呼べるようを実装
- 55. 参考資料
●
Android Builders Summit 2012 ”Android*
Software Updates”
– https://events.linuxfoundation.org/images/s
tories/pdf/lf_abs12_boie.pdf
– http://free-electrons.com/blog/abs-2012-v
ideos/
●
Android Open Source Project “Android Core
Technologies Secure Boot”
– https://source.android.com/devices/tech/s
ecurity/secureboot/index.html
●
Android ソースコード検索サービス
– https://sites.google.com/site/devcollaborati
on/codesearch