بدءًا من الإصدار Android 11 (مستوى واجهة برمجة التطبيقات 30)، يخزّن النظام مؤقتًا مجموعات البيانات الكبيرة التي قد تصل إليها تطبيقات متعددة لحالات الاستخدام مثل تعلُّم الآلة وتشغيل الوسائط. تساعد هذه الوظيفة في تقليل تكرار البيانات، سواء عبر الشبكة أو على القرص.
عندما يحتاج تطبيقك إلى الوصول إلى مجموعة بيانات كبيرة مشتركة، يمكنه أولاً البحث عن مجموعات البيانات المخزّنة مؤقتًا هذه، والتي تُسمى مجموعات البيانات الثنائية الكبيرة المشتركة، قبل تحديد ما إذا كان سيتم تنزيل نسخة جديدة. يمكن للتطبيقات الوصول إلى وظيفة مجموعات البيانات المشتركة هذه باستخدام
واجهات برمجة التطبيقات في BlobStoreManager.
يحتفظ النظام ببيانات blob التي تمت مشاركتها ويتحكّم في التطبيقات التي يمكنها الوصول إليها. عندما يساهم تطبيقك في إنشاء مجموعات بيانات ثنائية، يمكنك تحديد التطبيقات الأخرى التي يجب أن يكون لديها إذن بالوصول من خلال استدعاء إحدى الطرق التالية:
- لمنح إذن الوصول إلى مجموعة معيّنة من التطبيقات على جهاز، عليك تمرير أسماء حِزم هذه التطبيقات إلى
allowPackageAccess(). - للسماح فقط بالتطبيقات التي تم توقيع شهاداتها باستخدام المفتاح نفسه المستخدَم في تطبيقك، مثل مجموعة تطبيقات تديرها، يمكنك استدعاء
allowSameSignatureAccess(). - لمنح إذن الوصول إلى جميع التطبيقات على جهاز معيّن، يمكنك استدعاء
allowPublicAccess().
الوصول إلى مجموعات البيانات المشتركة
يمثّل النظام كل ملف ثنائي كبير للبيانات التي تمت مشاركتها باستخدام عنصر BlobHandle. يحتوي كل مثيل من BlobHandle على تجزئة آمنة من الناحية التشفيرية وبعض التفاصيل التعريفية لمجموعة البيانات.
للوصول إلى مجموعات البيانات التي تمت مشاركتها، نزِّل تفاصيل التعريف من الخادم. باستخدام هذه التفاصيل، تحقَّق مما إذا كانت مجموعة البيانات متاحة على النظام.
تعتمد الخطوة التالية على ما إذا كانت البيانات متاحة أم لا.
مجموعة البيانات متاحة
إذا كانت مجموعة البيانات متاحة على الجهاز، يمكنك الوصول إليها من النظام، كما هو موضّح في مقتطف الرمز التالي:
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); } }