גישה למערכי נתונים משותפים

החל מ-Android 11 (רמת API ‏30), המערכת שומרת במטמון מערכי נתונים גדולים שכמה אפליקציות יכולות לגשת אליהם לתרחישי שימוש כמו למידת מכונה והפעלת מדיה. הפונקציונליות הזו עוזרת לצמצם את יתירות הנתונים, גם ברשת וגם בדיסק.

כשהאפליקציה צריכה גישה למערך נתונים גדול ומשותף, היא יכולה לחפש קודם את מערכי הנתונים האלה שנשמרו במטמון, שנקראים אובייקטים גדולים של נתונים משותפים, לפני שהיא מחליטה אם להוריד עותק חדש. אפליקציות יכולות לגשת לפונקציונליות של מערכי הנתונים המשותפים האלה באמצעות ממשקי ה-API ב-BlobStoreManager.

המערכת שומרת את ה-blobs של הנתונים המשותפים וקובעת לאילו אפליקציות תהיה גישה אליהם. כשהאפליקציה שלכם תורמת blobs של נתונים, אתם יכולים לציין לאילו אפליקציות אחרות צריכה להיות גישה על ידי קריאה לאחת מהשיטות הבאות:

  • כדי לתת גישה לקבוצה ספציפית של אפליקציות במכשיר, צריך להעביר את שמות החבילות של האפליקציות האלה אל allowPackageAccess().
  • כדי לאפשר רק לאפליקציות שהאישורים שלהן חתומים באמצעות אותו מפתח שמשמש לאפליקציה שלכם – כמו חבילת אפליקציות שאתם מנהלים – צריך להפעיל את allowSameSignatureAccess().
  • כדי לתת גישה לכל האפליקציות במכשיר, צריך להפעיל את allowPublicAccess().

גישה לנתוני blobs משותפים

המערכת מייצגת כל blob של נתונים משותפים באמצעות אובייקט BlobHandle. כל מופע של BlobHandle מכיל גיבוב (hash) מאובטח מבחינה קריפטוגרפית וכמה פרטים מזהים של מערך הנתונים.

כדי לגשת לנתונים משותפים, צריך להוריד פרטים מזהים מהשרת. בעזרת הפרטים האלה, בודקים אם מערך הנתונים כבר זמין במערכת.

השלב הבא תלוי בזמינות הנתונים.

קבוצת הנתונים זמינה

אם קבוצת הנתונים כבר זמינה במכשיר, אפשר לגשת אליה מהמערכת, כמו בקטע הקוד הבא:

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);
    }
}

קבוצת הנתונים לא זמינה

אם מערך הנתונים לא זמין, מורידים אותו מהשרת ומוסיפים אותו למערכת, כמו בקטע הקוד הבא:

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);
    }
}