システム アップデートを管理する

このデベロッパー ガイドでは、Device Policy Controller(DPC)が デバイス ユーザーに代わって Android システム アップデートを管理する。

はじめに

Android デバイスはシステムの無線(OTA)アップデートを受信してインストールできます。 ソフトウェアです。Android はデバイスのユーザーにシステム アップデートを通知します があり、デバイスのユーザーはすぐに、または後でアップデートをインストールできます。

IT 管理者は DPC を使用して、デバイス ユーザーのシステム アップデートを管理できます。DPC は、完全管理対象デバイス(デバイス所有者)または仕事用プロファイル(プロファイル所有者)を所有できます。表 1 は、デバイス オーナーがシステムを管理する方法を示しています 更新ですが、プロファイル所有者はシステム アップデートに関する情報のみを報告できます。

表 1: DPC で使用できるタスクはオーナーモードによって異なります

タスク デバイス オーナー プロフィールの所有者
保留中のシステム アップデートを確認する
新しいシステム アップデートが利用可能になったときにコールバックを受け取る
ローカル アップデート ポリシーを設定して、Android がシステム アップデートをインストールするタイミングを制御する
重要な期間に OS のバージョンを固定する

保留中のアップデートを確認する

保留中のアップデートとは、まだインストールされていないデバイスのシステム アップデートのことです。 DPC は、保留中のシステム アップデートがあるデバイスを確認する際に IT 管理者をサポートできます。また、重要なアップデートを速やかにインストールするようデバイスのユーザーに依頼することもできます。

Android 8.0(API レベル 26)以降を搭載しているデバイス所有者とプロファイル所有者 デバイスに保留中のシステム アップデートがあるかどうかを確認できます。発信 DevicePolicyManager.getPendingSystemUpdate() このメソッドは、デバイスが最新の状態であれば null を返します。システム アップデートが保留中の場合、 このメソッドは更新に関する情報を返します。

保留中の更新の詳細を確認する

getPendingSystemUpdate() を呼び出した後、返された SystemUpdateInfo の値を使用して、保留中の更新の詳細を確認します。「 次の例は、保留中の更新が最初にいつ行われたかを調べる方法を示しています 次の値になります。

Kotlin

val firstAvailable =
        dpm.getPendingSystemUpdate(adminName)?.receivedTime
firstAvailable?.let {
    Log.i(TAG, "Update first available: ${Date(firstAvailable)}")
}

Java

SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName);
if (updateInfo != null) {
  Long firstAvailable = updateInfo.getReceivedTime();
  Log.i(TAG, "Update first available: " + new Date(firstAvailable));
}

システム コールバック

アップデートが利用可能になると、Android システムからデバイス所有者に 表示されます。Android 8.0 以降では、プロファイル所有者にもシステムから通知があります。

DeviceAdminReceiver サブクラスで、 onSystemUpdatePending() コールバック。必要ない コールバックを受信するには、DPC に登録またはアドバタイズしてください。システムは 1 回のアップデートでこのメソッドを複数回呼び出すため、アップデートのステータスを確認してください。 確認する必要があります詳しくは、getPendingSystemUpdate() にお電話ください。 システム アップデートを通知します。次の例はその方法を示しています。

Kotlin

/**
 * Called when a new update is available.
 */
override fun onSystemUpdatePending(context: Context?, intent: Intent?,
                                   receivedTime: Long) {

    // System update information is supported in API level 26 or higher.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        return
    }

    val updateInfo = getManager(context)
            .getPendingSystemUpdate(getWho(context))
            ?: return
    if (updateInfo.securityPatchState ==
            SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
        // Perhaps install because this is a security patch.
        // ...
    }
}

Java

/**
 * Called when a new update is available.
 */
public void onSystemUpdatePending (Context context, Intent intent,
                                   long receivedTime) {

  // System update information is supported in API level 26 or higher.
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    return;
  }
  SystemUpdateInfo updateInfo = getManager(context)
      .getPendingSystemUpdate(getWho(context));
  if (updateInfo == null) {
    return;
  }
  if (updateInfo.getSecurityPatchState() ==
      SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
    // Perhaps install because this is a security patch.
    // ...
  }
}

システムに複数の DPC がある場合(完全管理対象デバイスの仕事用プロファイルなど)、デバイス所有者とプロファイル所有者の両方がコールバックを受け取ります。

ポリシーを更新する

デバイス所有者は、デバイスのローカル システム アップデート ポリシーを設定して、アップデートのインストールタイミングを制御できます。システム アップデート ポリシーは、次の 3 つのタイプのいずれかになります。

自動
システム アップデートはインストールされるとすぐにインストール できます(ユーザーの操作なしで)。このポリシータイプを設定すると、保留中の更新がすぐにインストールされます 延期された、またはメンテナンスの時間枠を待っているケース。
窓(まど)つき
システム アップデートは毎日のメンテナンスの時間枠内でインストールされます(ユーザーの操作なし)。新しいウィンドウ ポリシーを作成するときに、毎日のメンテナンスの時間枠の開始時間と終了時間を分単位で設定します。
延期
システム アップデートのインストールを 30 日間延期します。30 日後 期間が終了すると、デバイスのユーザーにアップデートをインストールするよう求めるメッセージが表示されます。

延期期間

システムにより、各更新は 30 日間の延期 1 回に制限されています。この期間は、システムが最初にアップデートを延期したときに開始されます。新しい延期ポリシーを設定しても、期間は延長されません。

延期を除き、Android は他の Google プロダクトのアップデートをインストールできない 接続されていない、ディスク容量の不足、バッテリー残量の低下などが原因です。

別のアップデートが行われた場合、30 日間の延期タイマーはシステムによってリセットされます。 して、IT 管理者が統合されたシステムを あります。新しいアップデートがない状態で 30 日が経過すると、 ユーザーに依頼して保留中のアップデートをすべてインストールしてもらいます。その後、新しいシステム アップデートがリリースされたとき、 30 日間の期間が始まります。

ポリシーの設定方法

アップデート ポリシーは Android 8.0(API レベル 26)以降で設定できます。指定する デバイスによるシステム アップデートのインストールが必要なタイミングについて、 SystemUpdatePolicy(概説している 3 つのタイプのいずれかを使用) ご覧ください。ポリシーを設定するには、デバイス所有者が DevicePolicyManager メソッド setSystemUpdatePolicy() を呼び出します。次のコードでは、 サンプルは、その方法を示しています。ウィンドウ ポリシーの例については、SystemUpdatePolicy のドキュメントをご覧ください。

Kotlin

// Create the system update policy to postpone installation for 30 days.
val policy = SystemUpdatePolicy.createPostponeInstallPolicy()

// Get a DevicePolicyManager instance to set the policy on the device.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy)

Java

// Create the system update policy to postpone installation for 30 days.
SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy();

// Get a DevicePolicyManager instance to set the policy on the device.
DevicePolicyManager dpm = (DevicePolicyManager) context
    .getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy);

作成後にポリシー インスタンスを変更することはできません。デバイスがアップデートをインストールするタイミングを変更するには、新しいポリシーを作成して設定します。新しい Deployment からポリシーを削除するには、 デバイスの場合は、setSystemUpdatePolicy() を呼び出して、policy 引数として null を渡します。 DPC がポリシーを削除すると、デバイスのユーザーには、 適用できるシステム アップデートが表示されます。

アプリは getSystemUpdatePolicy() を呼び出して、 現在のポリシーに適用されます。このメソッドが null を返した場合は、 ポリシーは設定されていません。

凍結期間

休日や繁忙期などの重要な期間に OS のバージョンを凍結する デバイスの所有者はシステム アップデートを最大 90 日間停止できます。特定の デバイスが凍結期間中であれば、次のように動作します。

  • デバイスは、保留中のシステム アップデートに関する通知を受信しません。
  • OS のシステム アップデートがインストールされていない。
  • デバイスのユーザーは、[設定] でシステム アップデートを手動で確認できません。

凍結を定義した場合は 60 日間のバッファ期間が必須となります。 デバイスが無期限にフリーズするのを防ぎます。覚えておいてください デバイスへの重要なアップデートを受信できないことがあります。

図 1.デバイスに対して設定された 2 つの凍結期間
60 日間のバッファを備えた 1 年間に 2 つの凍結期間を示すカレンダー。

更新ポリシーで凍結期間を設定しました。凍結期間を設定するには できます。デバイスが設定した凍結期間外である場合、 通常のポリシー動作(自動、ウィンドウ処理、延期)が適用されます。

凍結期間の設定方法

凍結期間を設定できるのは Android 9(API レベル 28)以降です。デバイス ポリシーを設定する前に、所有者がシステム アップデート ポリシーの凍結期間を設定している 指定します。手順は次のとおりです。

  1. 新しいシステム アップデート ポリシーを作成する(または現在のシステム アップデート ポリシーを取得します)。
  2. 呼び出してポリシーの凍結期間を設定する setFreezePeriods()
  3. を呼び出してデバイスのポリシーと凍結期間を設定する setSystemUpdatePolicy()

凍結期間は毎年繰り返されるため、期間の開始日と終了日は 月と日の値で表されます。開始日は、少なくとも前回の凍結期間の終了日から 60 日以上空けなければなりません。次の例は、既存のシステム アップデート ポリシーに 2 つのフリーズ期間を設定する方法を示しています。

Kotlin

// Get the existing policy from the DevicePolicyController instance.
val policy = dpm.systemUpdatePolicy ?: return

try {
    // Set the two annual freeze periods on the policy for our retail
    // point-of-sale devices.
    val summerSale = FreezePeriod(
            MonthDay.of(6, 1),
            MonthDay.of(7, 31)) // Jun 1 - Jul 31 inclusive
    val winterSale = FreezePeriod(
            MonthDay.of(11, 20),
            MonthDay.of(1, 12)) // Nov 20 - Jan 12 inclusive
    policy.freezePeriods = Arrays.asList(summerSale, winterSale)

    // Set the policy again to activate the freeze periods.
    dpm.setSystemUpdatePolicy(adminName, policy)

} catch (e: SystemUpdatePolicy.ValidationFailedException) {
    // There must be previous periods recorded on the device because
    // summerSale and winterSale don’t overlap and are separated by more
    // than 60 days. Report the overlap ...
}

Java

// Get the existing policy from the DevicePolicyController instance.
SystemUpdatePolicy policy = dpm.getSystemUpdatePolicy();

try {
  // Set the two annual freeze periods on the policy for our
  // retail point-of-sale devices.
  FreezePeriod summerSale = new FreezePeriod(
      MonthDay.of(6, 1),
      MonthDay.of(7, 31)); // Jun 1 - Jul 31 inclusive
  FreezePeriod winterSale = new FreezePeriod(
      MonthDay.of(11, 20),
      MonthDay.of(1, 12)); // Nov 20 - Jan 12 inclusive
  policy.setFreezePeriods(Arrays.asList(summerSale, winterSale));

  // Don’t forget to set the policy again to activate the freeze periods.
  dpm.setSystemUpdatePolicy(adminName, policy);

} catch (SystemUpdatePolicy.ValidationFailedException e) {
  // There must be previous periods recorded on the device because summerSale
  // and winterSale don’t overlap and are separated by more than 60 days.
  // Report the overlap ...
}

開始日と終了日の両方が含まれます。開始日が (上記の例の winterSale など)、凍結 翌年まで確認できます

凍結を設定する場合 Android は以下の要件についてテストします。

  • 凍結期間が 90 日を超えることはありません。
  • 凍結期間と凍結期間の間は 60 日以上離す必要があります。
  • 凍結期間は重複しません。
  • 重複する凍結期間はありません。

デバイスのシステム アップデート ポリシーを設定すると、Android で次のテストが繰り返される デバイスの現在または過去の凍結期間が含まれます。

次の場合、Android は SystemUpdatePolicy.ValidationFailedException をスローします。 テストは失敗します

システム アップデート ポリシー オブジェクトで以前に設定した凍結期間のリストを取得するには: インストール済みのすべてのアプリで SystemUpdatePolicy.getFreezePeriods()。次の 次のサンプルは、このメソッドを呼び出してデバイスの凍結期間をログに記録しています。

Kotlin

// Log any freeze periods that might be set on a system update policy.
dpm.systemUpdatePolicy?.freezePeriods?.forEach {
    Log.i(TAG, "Freeze period: $it")
}

Java

// Log any freeze periods that might be set on a system update policy.
SystemUpdatePolicy currentPolicy = dpm.getSystemUpdatePolicy();
if (currentPolicy != null) { // A policy might not be set.
  for (FreezePeriod freezePeriod : currentPolicy.getFreezePeriods()) {
    Log.i(TAG, "Freeze period: " + freezePeriod.toString());
  }
}

うるう年

Android は ISO 8601 カレンダー(グレゴリオ暦とも呼ばれる)を使用してフリーズ期間を計算し、うるう年は考慮しません。つまり 2 月 29 日に は有効な日付として認識されず、2 月 28 日として扱われます。 そのため、凍結期間の計算には 2 月 29 日はカウントされません。 です。

開発とテスト

DPC のシステム アップデート機能を開発してテストする際に、多くのフリーズ期間を作成しなければならない場合があります。Android では 60 日間隔のチェックが行われるため、 新しい凍結期間を設定できなくなる可能性があります。 生理のデータを削除し続けることができます。デバイスのフリーズを解除するには Android Debug Bridge で、以下のコマンドを実行します。 (adb)shell:

adb shell dpm clear-freeze-period-record

デバイスが凍結期間中かどうかは、 インターフェースを無効にしています。

Google Play システム アップデート(Mainline)

Google Play システム アップデート(Mainline アップデートとも呼ばれます)は、 自動的にダウンロードされますが、インストールするにはデバイスを再起動する必要があります。これらのアップデートでは再起動が自動的にトリガーされず、ユーザー、管理者、またはポリシーによる再起動が次回行われた際にアップデートがインストールされます。システムによってトリガーされた再起動 アップデート ポリシーにより、関連する Google/OEM システム アップデートと、 以前にダウンロードした Google Play システム アップデート。

Google Play システム アップデートは、 [設定] >概要 >Android バージョン >Google Play システム アップデートをご覧ください。

更新をロールバックする

Google Play システム アップデートのロールバック(GPSUR)ツール Google Play システム アップデートの問題によるデバイスの状態の復元に使用 インストールできます。このツールは、上級ユーザーまたは指示があった場合に使用してください データが失われる可能性があります。GPSUR の使用方法 ツール:

  1. マシンで Android Debug Bridge(adb)が実行されている場合は、 adb サービスに干渉しないように、事前に adb サービスを ロールバックできます。adb を停止するには、adb kill-server を実行します。
  2. GPSUR ツールを開きます
  3. [Allow ADB access] をクリックし、ツールが adb 経由でテストデバイスと通信できるようにします。
  4. [Add new device] をクリックします。
  5. リストからデバイスを選択して、[Connect] をクリックします。このリストは 完全なデバイス名を含めます
  6. デバイスの画面で [このパソコンからの USB デバッグを常に許可する] を選択し、 [OK] をクリックして、USB デバッグ接続を受け入れます。
  7. ブラウザ上で、接続したデバイスを選択します。
  8. ページ上のボタンテキストが、ロールバックできませんから [Rollback Recent Updates]: 、デバイスでロールバックを利用できます。 [Rollback Recent Updates] をクリックします。
  9. [ロールバックの確認] モーダルで警告を確認し、[確認] をクリックします。
  10. ロールバックが完了するまで待ちます。完了すると、[Rollback Successful] をクリックすると、 モーダルが表示され、デバイスが再起動します。電源ケーブルを抜いても安全です ダウンロードします

参考情報

システム アップデートの詳細については、Android オープンソース プロジェクトの OTA 更新のドキュメント。