บล็อกร้านค้า

ผู้ใช้จำนวนมากยังคงจัดการข้อมูลเข้าสู่ระบบของตนเองเมื่อตั้งค่าอุปกรณ์ใหม่ที่ใช้ Android กระบวนการด้วยตนเองนี้อาจซับซ้อนและมักจะส่งผลให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี Block Store API ซึ่งเป็นไลบรารีที่ขับเคลื่อนโดย บริการ Google Play มีเป้าหมายเพื่อแก้ปัญหานี้ด้วยการมอบวิธีให้ แอปบันทึกข้อมูลเข้าสู่ระบบของผู้ใช้ได้โดยไม่ต้องมีความซับซ้อนหรือความเสี่ยงด้านความปลอดภัยที่เกี่ยวข้อง กับการบันทึกรหัสผ่านของผู้ใช้

Block Store API ช่วยให้แอปจัดเก็บข้อมูลที่สามารถดึงข้อมูลมาเพื่อตรวจสอบสิทธิ์ผู้ใช้ในอุปกรณ์ใหม่ได้อีกครั้งในภายหลัง ซึ่งจะช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ราบรื่นยิ่งขึ้น เนื่องจากผู้ใช้ไม่จำเป็นต้องเห็นหน้าจอลงชื่อเข้าใช้เมื่อเปิดแอปเป็นครั้งแรกในอุปกรณ์ใหม่

ประโยชน์ของการใช้ Block Store มีดังนี้

  • โซลูชันพื้นที่เก็บข้อมูลเข้าสู่ระบบที่เข้ารหัสสำหรับนักพัฒนาแอป ข้อมูลเข้าสู่ระบบจะได้รับการเข้ารหัสจากต้นทางถึงปลายทางเมื่อเป็นไปได้
  • บันทึกโทเค็นแทนชื่อผู้ใช้และรหัสผ่าน
  • ลดความยุ่งยากจากขั้นตอนการลงชื่อเข้าใช้
  • ช่วยให้ผู้ใช้ไม่ต้องรับภาระในการจัดการรหัสผ่านที่ซับซ้อน
  • Google จะยืนยันตัวตนของผู้ใช้

ก่อนเริ่มต้น

ทำตามขั้นตอนในส่วนต่อไปนี้เพื่อเตรียมแอป

กำหนดค่าแอป

ในไฟล์ build.gradle ระดับโปรเจ็กต์ ให้รวมที่เก็บ Maven ของ Google ไว้ในทั้งส่วน buildscript และ allprojects ดังนี้

buildscript {
  repositories {
    google()
    mavenCentral()
  }
}

allprojects {
  repositories {
    google()
    mavenCentral()
  }
}

เพิ่มทรัพยากร Dependency ของ บริการ Google Play สำหรับ Block Store API ลงใน ไฟล์ Gradle Build ของโมดูล ซึ่งโดยทั่วไปคือ app/build.gradle ดังนี้

dependencies {
  implementation 'com.google.android.gms:play-services-auth-blockstore:16.4.0'
}

วิธีการทำงาน

Block Store ช่วยให้นักพัฒนาแอปบันทึกและกู้คืนอาร์เรย์ไบต์ได้สูงสุด 16 รายการ ซึ่งช่วยให้คุณบันทึกข้อมูลสำคัญเกี่ยวกับเซสชันของผู้ใช้ปัจจุบันและมีความยืดหยุ่นในการบันทึกข้อมูลนี้ตามที่คุณต้องการ ข้อมูลนี้สามารถเข้ารหัสจากต้นทางถึงปลายทางได้ และโครงสร้างพื้นฐานที่รองรับ Block Store สร้างขึ้นบนโครงสร้างพื้นฐานการสำรองและกู้คืนข้อมูล

คู่มือนี้จะครอบคลุมกรณีการใช้งานในการบันทึกโทเค็นของผู้ใช้ลงใน Block Store ขั้นตอนต่อไปนี้แสดงให้เห็นว่าแอปที่ใช้ Block Store จะทำงานอย่างไร

  1. ในระหว่างขั้นตอนการตรวจสอบสิทธิ์ของแอปหรือหลังจากนั้น คุณสามารถจัดเก็บโทเค็นการตรวจสอบสิทธิ์ของผู้ใช้ลงใน Block Store เพื่อดึงข้อมูลในภายหลังได้
  2. ระบบจะจัดเก็บโทเค็นไว้ในเครื่องและยังสำรองข้อมูลไปยังระบบคลาวด์ได้ด้วย โดยจะเข้ารหัสจากต้นทางถึงปลายทางเมื่อเป็นไปได้
  3. ระบบจะโอนข้อมูลเมื่อผู้ใช้เริ่มขั้นตอนการกู้คืนในอุปกรณ์ใหม่
  4. หากผู้ใช้กู้คืนแอปของคุณในระหว่างขั้นตอนการกู้คืน แอปของคุณจะดึงโทเค็นที่บันทึกไว้จาก Block Store ในอุปกรณ์ใหม่ได้

การบันทึกโทเค็น

เมื่อผู้ใช้ลงชื่อเข้าใช้แอป คุณสามารถบันทึกโทเค็นการตรวจสอบสิทธิ์ที่สร้างขึ้นสำหรับผู้ใช้รายนั้นลงใน Block Store ได้ คุณสามารถจัดเก็บโทเค็นนี้โดยใช้ค่าคู่คีย์ที่ไม่ซ้ำกันซึ่งมีขนาดสูงสุด 4 KB ต่อรายการ หากต้องการจัดเก็บโทเค็น ให้เรียก setBytes() และ setKey() ในอินสแตนซ์ของ StoreBytesData.Builder เพื่อจัดเก็บข้อมูลเข้าสู่ระบบของผู้ใช้ลงใน อุปกรณ์ต้นทาง หลังจากบันทึกโทเค็นด้วย Block Store แล้ว ระบบจะเข้ารหัสและจัดเก็บโทเค็นไว้ในเครื่องในอุปกรณ์

ตัวอย่างต่อไปนี้แสดงวิธีบันทึกโทเค็นการตรวจสอบสิทธิ์ลงในอุปกรณ์ในเครื่อง

Java

  BlockstoreClient client = Blockstore.getClient(this);
  byte[] bytes1 = new byte[] { 1, 2, 3, 4 };  // Store one data block.
  String key1 = "com.example.app.key1";
  StoreBytesData storeRequest1 = StoreBytesData.Builder()
          .setBytes(bytes1)
          // Call this method to set the key value pair the data should be associated with.
          .setKeys(Arrays.asList(key1))
          .build();
  client.storeBytes(storeRequest1)
    .addOnSuccessListener(result -> Log.d(TAG, "stored " + result + " bytes"))
    .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));

Kotlin

  val client = Blockstore.getClient(this)

  val bytes1 = byteArrayOf(1, 2, 3, 4) // Store one data block.
  val key1 = "com.example.app.key1"
  val storeRequest1 = StoreBytesData.Builder()
    .setBytes(bytes1) // Call this method to set the key value with which the data should be associated with.
    .setKeys(Arrays.asList(key1))
    .build()
  client.storeBytes(storeRequest1)
    .addOnSuccessListener { result: Int ->
      Log.d(TAG,
            "Stored $result bytes")
    }
    .addOnFailureListener { e ->
      Log.e(TAG, "Failed to store bytes", e)
    }

ใช้โทเค็นเริ่มต้น

ข้อมูลที่บันทึกไว้โดยใช้ StoreBytes โดยไม่มีคีย์จะใช้คีย์เริ่มต้น BlockstoreClient.DEFAULT_BYTES_DATA_KEY

Java

  BlockstoreClient client = Blockstore.getClient(this);
  // The default key BlockstoreClient.DEFAULT_BYTES_DATA_KEY.
  byte[] bytes = new byte[] { 9, 10 };
  StoreBytesData storeRequest = StoreBytesData.Builder()
          .setBytes(bytes)
          .build();
  client.storeBytes(storeRequest)
    .addOnSuccessListener(result -> Log.d(TAG, "stored " + result + " bytes"))
    .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));

Kotlin

  val client = Blockstore.getClient(this);
  // the default key BlockstoreClient.DEFAULT_BYTES_DATA_KEY.
  val bytes = byteArrayOf(1, 2, 3, 4)
  val storeRequest = StoreBytesData.Builder()
    .setBytes(bytes)
    .build();
  client.storeBytes(storeRequest)
    .addOnSuccessListener { result: Int ->
      Log.d(TAG,
            "stored $result bytes")
    }
    .addOnFailureListener { e ->
      Log.e(TAG, "Failed to store bytes", e)
    }

การดึงโทเค็น

ในภายหลัง เมื่อผู้ใช้ทำตามขั้นตอนการกู้คืนในอุปกรณ์ใหม่ บริการ Google Play จะยืนยันตัวตนของผู้ใช้ก่อน จากนั้นจึงดึงข้อมูล Block Store ของคุณ ผู้ใช้ได้ตกลงที่จะกู้คืนข้อมูลแอปของคุณแล้วซึ่งเป็นส่วนหนึ่งของขั้นตอนการกู้คืน จึงไม่จำเป็นต้องขอความยินยอมเพิ่มเติม เมื่อผู้ใช้เปิดแอป คุณสามารถขอ โทเค็นจาก Block Store ได้โดยเรียก retrieveBytes() จากนั้นคุณจะใช้โทเค็นที่ดึงข้อมูลมาเพื่อคงสถานะลงชื่อเข้าใช้ของผู้ใช้ในอุปกรณ์ใหม่ได้

ตัวอย่างต่อไปนี้แสดงวิธีดึงโทเค็นหลายรายการตามคีย์ที่เฉพาะเจาะจง

Java

BlockstoreClient client = Blockstore.getClient(this);

// Retrieve data associated with certain keys.
String key1 = "com.example.app.key1";
String key2 = "com.example.app.key2";
String key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY; // Used to retrieve data stored without a key

List requestedKeys = Arrays.asList(key1, key2, key3); // Add keys to array
RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder()
    .setKeys(requestedKeys)
    .build();

client.retrieveBytes(retrieveRequest)
    .addOnSuccessListener(
        result -> {
          Map<String, BlockstoreData> blockstoreDataMap = result.getBlockstoreDataMap();
          for (Map.Entry<String, BlockstoreData> entry : blockstoreDataMap.entrySet()) {
            Log.d(TAG, String.format(
                "Retrieved bytes %s associated with key %s.",
                new String(entry.getValue().getBytes()), entry.getKey()));
          }
        })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));

Kotlin

val client = Blockstore.getClient(this)

// Retrieve data associated with certain keys.
val key1 = "com.example.app.key1"
val key2 = "com.example.app.key2"
val key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY // Used to retrieve data stored without a key

val requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array

val retrieveRequest = RetrieveBytesRequest.Builder()
  .setKeys(requestedKeys)
  .build()

client.retrieveBytes(retrieveRequest)
  .addOnSuccessListener { result: RetrieveBytesResponse ->
    val blockstoreDataMap =
      result.blockstoreDataMap
    for ((key, value) in blockstoreDataMap) {
      Log.d(ContentValues.TAG, String.format(
        "Retrieved bytes %s associated with key %s.",
        String(value.bytes), key))
    }
  }
  .addOnFailureListener { e: Exception? ->
    Log.e(ContentValues.TAG,
          "Failed to store bytes",
          e)
  }

การดึงโทเค็นทั้งหมด

ด้านล่างนี้เป็นตัวอย่างวิธีดึงโทเค็นทั้งหมดที่บันทึกลงใน BlockStore

Java

BlockstoreClient client = Blockstore.getClient(this)

// Retrieve all data.
RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder()
    .setRetrieveAll(true)
    .build();

client.retrieveBytes(retrieveRequest)
    .addOnSuccessListener(
        result -> {
          Map<String, BlockstoreData> blockstoreDataMap = result.getBlockstoreDataMap();
          for (Map.Entry<String, BlockstoreData> entry : blockstoreDataMap.entrySet()) {
            Log.d(TAG, String.format(
                "Retrieved bytes %s associated with key %s.",
                new String(entry.getValue().getBytes()), entry.getKey()));
          }
        })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));

Kotlin

val client = Blockstore.getClient(this)

val retrieveRequest = RetrieveBytesRequest.Builder()
  .setRetrieveAll(true)
  .build()

client.retrieveBytes(retrieveRequest)
  .addOnSuccessListener { result: RetrieveBytesResponse ->
    val blockstoreDataMap =
      result.blockstoreDataMap
    for ((key, value) in blockstoreDataMap) {
      Log.d(ContentValues.TAG, String.format(
        "Retrieved bytes %s associated with key %s.",
        String(value.bytes), key))
    }
  }
  .addOnFailureListener { e: Exception? ->
    Log.e(ContentValues.TAG,
          "Failed to store bytes",
          e)
  }

ด้านล่างนี้เป็นตัวอย่างวิธีดึงคีย์เริ่มต้น

Java

BlockStoreClient client = Blockstore.getClient(this);
RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder()
    .setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY))
    .build();
client.retrieveBytes(retrieveRequest);

Kotlin

val client = Blockstore.getClient(this)

val retrieveRequest = RetrieveBytesRequest.Builder()
  .setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY))
  .build()
client.retrieveBytes(retrieveRequest)

การลบโทเค็น

คุณอาจต้องลบโทเค็นออกจาก BlockStore ด้วยเหตุผลต่อไปนี้

  • ผู้ใช้ทำตามขั้นตอนการออกจากระบบ
  • โทเค็นถูกเพิกถอนหรือใช้ไม่ได้

เช่นเดียวกับการดึงโทเค็น คุณสามารถระบุโทเค็นที่ต้องลบได้โดยตั้งค่าอาร์เรย์ของคีย์ที่ต้องลบ

ตัวอย่างต่อไปนี้แสดงวิธีลบคีย์บางรายการ

Java

BlockstoreClient client = Blockstore.getClient(this);

// Delete data associated with certain keys.
String key1 = "com.example.app.key1";
String key2 = "com.example.app.key2";
String key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY; // Used to delete data stored without key

List requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array
DeleteBytesRequest deleteRequest = new DeleteBytesRequest.Builder()
      .setKeys(requestedKeys)
      .build();
client.deleteBytes(deleteRequest)

Kotlin

val client = Blockstore.getClient(this)

// Retrieve data associated with certain keys.
val key1 = "com.example.app.key1"
val key2 = "com.example.app.key2"
val key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY // Used to retrieve data stored without a key

val requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array

val retrieveRequest = DeleteBytesRequest.Builder()
      .setKeys(requestedKeys)
      .build()

client.deleteBytes(retrieveRequest)

ลบโทเค็นทั้งหมด

ตัวอย่างต่อไปนี้แสดงวิธีลบโทเค็นทั้งหมดที่บันทึกลงใน BlockStore ในปัจจุบัน

Java

// Delete all data.
DeleteBytesRequest deleteAllRequest = new DeleteBytesRequest.Builder()
      .setDeleteAll(true)
      .build();
client.deleteBytes(deleteAllRequest)
.addOnSuccessListener(result -> Log.d(TAG, "Any data found and deleted? " + result));

Kotlin

  val deleteAllRequest = DeleteBytesRequest.Builder()
  .setDeleteAll(true)
  .build()
retrieve bytes, the key BlockstoreClient.DEFAULT_BYTES_DATA_KEY can be used
in the RetrieveBytesRequest instance in order to get your saved data

The following example shows how to retrieve the default key.

Java

End-to-end encryption

In order for end-to-end encryption to be made available, the device must be running Android 9 or higher, and the user must have set a screen lock (PIN, pattern, or password) for their device. You can verify if encryption will be available on the device by calling isEndToEndEncryptionAvailable().

The following sample shows how to verify if encryption will be available during cloud backup:

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { result ->
          Log.d(TAG, "Will Block Store cloud backup be end-to-end encrypted? $result")
        }

เปิดใช้การสำรองข้อมูลในระบบคลาวด์

หากต้องการเปิดใช้การสำรองข้อมูลในระบบคลาวด์ ให้เพิ่มเมธอด setShouldBackupToCloud() ลงในออบเจ็กต์ StoreBytesData Block Store จะสำรองข้อมูลไบต์ที่จัดเก็บไว้ในระบบคลาวด์เป็นระยะๆ เมื่อตั้งค่า setShouldBackupToCloud() เป็น "จริง"

ตัวอย่างต่อไปนี้แสดงวิธีเปิดใช้การสำรองข้อมูลในระบบคลาวด์เฉพาะเมื่อการสำรองข้อมูลในระบบคลาวด์ มีการเข้ารหัสจากต้นทางถึงปลายทาง

val client = Blockstore.getClient(this)
val storeBytesDataBuilder = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { isE2EEAvailable ->
          if (isE2EEAvailable) {
            storeBytesDataBuilder.setShouldBackupToCloud(true)
            Log.d(TAG, "E2EE is available, enable backing up bytes to the cloud.")

            client.storeBytes(storeBytesDataBuilder.build())
                .addOnSuccessListener { result ->
                  Log.d(TAG, "stored: ${result.getBytesStored()}")
                }.addOnFailureListener { e ->
                  Log.e(TAG, Failed to store bytes, e)
                }
          } else {
            Log.d(TAG, "E2EE is not available, only store bytes for D2D restore.")
          }
        }

วิธีทดสอบ

ใช้วิธีการต่อไปนี้ในระหว่างการพัฒนาเพื่อทดสอบขั้นตอนการกู้คืน

ถอนการติดตั้ง/ติดตั้งใหม่ในอุปกรณ์เครื่องเดิม

หากผู้ใช้เปิดใช้บริการสำรองข้อมูล (ตรวจสอบได้ที่การตั้งค่า > Google > การสำรองข้อมูล) ระบบจะเก็บข้อมูล Block Store ไว้เมื่อถอนการติดตั้ง/ติดตั้งแอปใหม่

คุณสามารถทำตามขั้นตอนต่อไปนี้เพื่อทดสอบ

  1. ผสานรวม Block Store API เข้ากับแอปทดสอบ
  2. ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อจัดเก็บข้อมูล
  3. ถอนการติดตั้งแอปทดสอบ แล้วติดตั้งแอปอีกครั้งในอุปกรณ์เครื่องเดิม
  4. ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อดึงข้อมูล
  5. ตรวจสอบว่าไบต์ที่ดึงข้อมูลมาเหมือนกับไบต์ที่จัดเก็บไว้ก่อนถอนการติดตั้ง

อุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง

ในกรณีส่วนใหญ่ การดำเนินการนี้จะต้องรีเซ็ตอุปกรณ์เป้าหมายเป็นค่าเริ่มต้นจากโรงงาน จากนั้นคุณสามารถทำตามขั้นตอนการกู้คืนแบบไร้สายของ Android หรือการกู้คืนด้วยสายของ Google (สำหรับอุปกรณ์ที่รองรับ)

การกู้คืนจากระบบคลาวด์

  1. ผสานรวม Block Store API เข้ากับแอปทดสอบ โดยคุณต้องส่งแอปทดสอบไปยัง Play Store
  2. ในอุปกรณ์ต้นทาง ให้ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อจัดเก็บข้อมูล โดยตั้งค่า shouldBackUpToCloud เป็น true
  3. สำหรับอุปกรณ์ที่ใช้ Android เวอร์ชัน O ขึ้นไป คุณสามารถทริกเกอร์การสำรองข้อมูล Block Store ในระบบคลาวด์ด้วยตนเองได้โดยไปที่การตั้งค่า > Google > การสำรองข้อมูล แล้วคลิกปุ่ม "สำรองข้อมูลเลย"
    1. หากต้องการยืนยันว่าการสำรองข้อมูล Block Store ในระบบคลาวด์สำเร็จ ให้ทำดังนี้
      1. หลังจากสำรองข้อมูลเสร็จแล้ว ให้ค้นหาบรรทัดบันทึกที่มีแท็ก "CloudSyncBpTkSvc"
      2. คุณควรเห็นบรรทัดที่คล้ายกับบรรทัดนี้ "......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., uploaded size: XXX bytes ..."
    2. หลังจากสำรองข้อมูล Block Store ในระบบคลาวด์แล้ว จะมีระยะเวลา "พัก" 5 นาที ภายใน 5 นาทีนั้น การคลิกปุ่ม "สำรองข้อมูลเลย" จะไม่ทริกเกอร์การสำรองข้อมูล Block Store ในระบบคลาวด์อีก
  4. รีเซ็ตอุปกรณ์เป้าหมายเป็นค่าเริ่มต้นและทำตามขั้นตอนการกู้คืนจากระบบคลาวด์ เลือกกู้คืนแอปทดสอบในระหว่างขั้นตอนการกู้คืน ดูข้อมูลเพิ่มเติมเกี่ยวกับ ขั้นตอนการกู้คืนจากระบบคลาวด์ได้ที่ ขั้นตอนการกู้คืนจากระบบคลาวด์ที่รองรับ
  5. ในอุปกรณ์เป้าหมาย ให้ใช้แอปทดสอบเพื่อเรียกใช้ Block Store API เพื่อดึงข้อมูล
  6. ตรวจสอบว่าไบต์ที่ดึงข้อมูลมาเหมือนกับไบต์ที่จัดเก็บไว้ในอุปกรณ์ต้นทาง

ข้อกำหนดของอุปกรณ์

การเข้ารหัสจากต้นทางถึงปลายทาง

  • การเข้ารหัสจากต้นทางถึงปลายทางรองรับในอุปกรณ์ที่ใช้ Android 9 (API 29) ขึ้นไป
  • อุปกรณ์ต้องตั้งค่าการล็อกหน้าจอด้วย PIN, รูปแบบ หรือรหัสผ่านเพื่อให้เปิดใช้การเข้ารหัสจากต้นทางถึงปลายทางได้และเข้ารหัสข้อมูลของผู้ใช้อย่างถูกต้อง

ขั้นตอนการกู้คืนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง

การกู้คืนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งกำหนดให้คุณต้องมีอุปกรณ์ต้นทางและอุปกรณ์เป้าหมาย ซึ่งจะเป็นอุปกรณ์ 2 เครื่องที่จะโอนข้อมูล

อุปกรณ์ต้นทาง ต้องใช้ Android 6 (API 23) ขึ้นไปจึงจะสำรองข้อมูลได้

อุปกรณ์เป้าหมาย ต้องใช้ Android 9 (API 29) ขึ้นไปจึงจะกู้คืนได้

ดูข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนการกู้คืนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งได้ที่นี่ here.

ขั้นตอนการสำรองและกู้คืนจากระบบคลาวด์

การสำรองและกู้คืนจากระบบคลาวด์กำหนดให้คุณต้องมีอุปกรณ์ต้นทางและอุปกรณ์เป้าหมาย

อุปกรณ์ต้นทาง ต้องใช้ Android 6 (API 23) ขึ้นไปจึงจะสำรองข้อมูลได้

ระบบจะรองรับอุปกรณ์เป้าหมาย ตามผู้ผลิต อุปกรณ์ Pixel สามารถใช้ฟีเจอร์นี้ได้ตั้งแต่ Android 9 (API 29) ขึ้นไป และอุปกรณ์อื่นๆ ทั้งหมดต้องใช้ Android 12 (API 31) ขึ้นไป