데이터 blob을 사용하여 대규모 데이터세트 안전하게 공유

일부 상황(예: 머신러닝이나 미디어 재생과 관련)에서 나의 앱이 다른 앱과 동일한 대규모 데이터 세트를 사용할 수도 있습니다.

네트워크의 데이터와 디스크에 있는 데이터 모두에서 데이터 중복을 줄이기 위해 Android 11(API 수준 30)은 머신러닝 및 미디어 재생과 같은 사용 사례를 지원하는 공유 데이터 세트를 캐시합니다. 앱이 대규모 공유 데이터 세트에 액세스해야 할 때 새로운 사본을 다운로드할지 판단하기 전에 먼저 이 캐시된 데이터 세트(공유 데이터 blob이라고 함)를 찾아볼 수 있습니다. 앱은 Android 11의 새로운 시스템 서비스 관리자인 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)
        }
    }
}

자바

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