Android 11(API 수준 30)부터 시스템은 머신러닝 및 미디어 재생과 같은 사용 사례를 위해 여러 앱에서 액세스할 수 있는 큰 데이터 세트를 캐시합니다. 이 기능은 네트워크와 디스크에서 모두 데이터 중복을 줄이는 데 도움이 됩니다.
앱이 대규모 공유 데이터 세트에 액세스해야 할 때, 새로운 사본을 다운로드할지 판단하기 전에 먼저 이러한 캐시된 데이터 세트(공유 데이터 blob이라고 함)를 찾아볼 수 있습니다. 앱은 BlobStoreManager
의 API를 사용하여 이러한 공유 데이터 세트 기능에 액세스할 수 있습니다.
시스템에서는 공유 데이터 blob을 유지관리하며 이 blob에 액세스할 수 있는 앱을 제어합니다. 앱에서 데이터 blob을 제공하면 다음 메서드 중 하나를 호출하여 액세스할 수 있는 다른 앱을 지정할 수 있습니다.
- 기기의 특정 앱 세트에 액세스 권한을 부여하려면 이러한 앱의 패키지 이름을
allowPackageAccess()
에 전달합니다. - 앱에 사용되는 것과 동일한 키를 사용하여 인증서에 서명한 앱(예: 개발자가 관리하는 앱 제품군)만 허용하려면
allowSameSignatureAccess()
를 호출합니다. - 기기의 모든 앱에 액세스 권한을 부여하려면
allowPublicAccess()
를 호출합니다.
공유 데이터 blob 액세스
시스템은 BlobHandle
객체를 사용하여 각 공유 데이터 blob을 나타냅니다. BlobHandle
의 각 인스턴스에는 암호화 방식으로 안전한 해시 및 데이터세트에 관한 일부 식별 세부정보가 있습니다.
공유 데이터 blob에 액세스하려면 서버에서 식별 세부정보를 다운로드합니다. 이 세부정보를 사용하여 데이터세트를 시스템에서 이미 사용할 수 있는지 확인합니다.
다음 단계는 데이터를 사용할 수 있는지 여부에 따라 다릅니다.
데이터세트 사용 가능
이미 기기에서 데이터세트를 사용할 수 있는 경우 다음 코드 스니펫과 같이 시스템에서 데이터세트에 액세스합니다.
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) }
자바
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); } }