Berbagi set data besar dengan aman menggunakan blob data

Dalam beberapa situasi, seperti yang melibatkan machine learning atau pemutaran media, aplikasi Anda mungkin perlu menggunakan set data besar yang sama dengan aplikasi lain.

Untuk membantu mengurangi redundansi data, baik melalui jaringan maupun pada disk, Android 11 (API level 30) meng-cache set data bersama yang mendukung kasus penggunaan seperti machine learning dan pemutaran media. Saat memerlukan akses ke set data besar bersama, aplikasi Anda dapat mencari set data yang di-cache ini terlebih dahulu, yang disebut blob data bersama, sebelum menentukan apakah akan mendownload salinan baru atau tidak. Aplikasi dapat memanfaatkan fungsi set data bersama ini menggunakan API di BlobStoreManager, yang merupakan pengelola layanan sistem baru di Android 11.

Sistem akan mengelola blob data bersama dan mengontrol aplikasi mana yang dapat mengaksesnya. Saat aplikasi Anda mengontribusikan blob data, Anda dapat memberi tanda pada aplikasi lain yang harus memiliki akses dengan memanggil salah satu metode berikut:

  • Untuk memberikan akses ke sekumpulan aplikasi tertentu di perangkat, teruskan nama paket aplikasi tersebut ke allowPackageAccess().
  • Untuk hanya mengizinkan aplikasi yang sertifikatnya ditandatangani menggunakan kunci yang sama dengan yang digunakan untuk aplikasi Anda, seperti rangkaian aplikasi yang Anda kelola, panggil allowSameSignatureAccess().
  • Untuk memberikan akses ke semua aplikasi di perangkat, panggil allowPublicAccess().

Mengakses blob data bersama

Sistem mewakili setiap blob data bersama menggunakan objek BlobHandle. Setiap instance BlobHandle berisi hash yang aman secara kriptografi dan beberapa detail identifikasi untuk set data.

Untuk mengakses blob data bersama, download detail identifikasi dari server. Gunakan detail ini untuk memeriksa apakah set data sudah tersedia di sistem.

Langkah berikutnya bergantung pada apakah data tersedia atau tidak.

Set data tersedia

Jika sudah tersedia di perangkat, akses set data tersebut dari sistem, seperti yang ditampilkan dalam cuplikan kode berikut:

Kotlin

val blobStoreManager =
        getSystemService(Context.BLOB_STORE_SERVICE) as BlobStoreManager
// The label "Sample photos" is visible to the user.
val blobHandle = BlobHandle.createWithSha256(sha256DigestBytes,
        "Sample photos",
        System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1),
        "photoTrainingDataset")
try {
    val input = ParcelFileDescriptor.AutoCloseInputStream(
            blobStoreManager.openBlob(blobHandle))
    useDataset(input)
}

Java

BlobStoreManager blobStoreManager =
        ((BlobStoreManager) getSystemService(Context.BLOB_STORE_SERVICE));
if (blobStoreManager != null) {
    // The label "Sample photos" is visible to the user.
    BlobHandle blobHandle = BlobHandle.createWithSha256(
            sha256DigestBytes,
            "Sample photos",
            System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1),
            "photoTrainingDataset");
    try (InputStream input = new ParcelFileDescriptor.AutoCloseInputStream(
            blobStoreManager.openBlob(blobHandle))) {
        useDataset(input);
    }
}

Set data tidak tersedia

Jika tidak tersedia, download set data tersebut dari server dan kontribusikan ke sistem, seperti yang ditampilkan dalam cuplikan kode berikut:

Kotlin

val sessionId = blobStoreManager.createSession(blobHandle)
try {
    val session = blobStoreManager.openSession(sessionId)
    try {
        // For this example, write 200 MiB at the beginning of the file.
        val output = ParcelFileDescriptor.AutoCloseOutputStream(
                session.openWrite(0, 1024 * 1024 * 200))
        writeDataset(output)

        session.apply {
            allowSameSignatureAccess()
            allowPackageAccess(your-app-package,
                    app-certificate)
            allowPackageAccess(some-other-app-package,
                    app-certificate)
            commit(mainExecutor, callback)
        }
    }
}

Java

long sessionId = blobStoreManager.createSession(blobHandle);
try (BlobStoreManager.Session session =
        blobStoreManager.openSession(sessionId)) {
    // For this example, write 200 MiB at the beginning of the file.
    try (OutputStream output = new ParcelFileDescriptor.AutoCloseOutputStream(
            session.openWrite(0, 1024 * 1024 * 200)))
        writeDataset(output);
        session.allowSameSignatureAccess();
        session.allowPackageAccess(your-app-package,
                    app-certificate);
        session.allowPackageAccess(some-other-app-package,
                    app-certificate);
        session.commit(getMainExecutor(), callback);
    }
}