6

Android で暗号化された OBB (Opaque Binary Blob) ファイルの作成/マウントに成功したかどうか疑問に思っていましたか? これは、この質問 1のフォローアップです。Android 開発サイトの OBB (Opaque Binary Blob) とは何ですか? 、その投稿の指示に従って、次を実行しました(ICS 4.01ベースラインから、Ubuntu 10.10-32ビットとUbuntu 12.4-64ビットの両方で試しました):

sudo modprobe cryptoloop
sudo modprobe twofish
sudo modprobe vfat
./mkobb.sh -d /tmp/obb/ -kblahblah -o /tmp/out.obb -v
obbtool a -n com.test.blah -v 1 -s 997ff9b1516a6788 /tmp/out.obb # 997ff... is the salt from the mkobb step
obbtool i /temp/out.obb # verify the obb file
adb push /temp/out.obb /sdcard/

ここから、out.obb ファイルを電話の /sdcard/ にコピーします。そして、次のコードでマウントします。

String obbFile = Environment.getExternalStorageDirectory() + "/out.obb";
mgr = (StorageManager) getSystemService(Context.STORAGE_SERVICE);  // mgr is a member varible of my main activity
Log.i("OBB", "trying to mount : " + obbFile + " does it exist? " + new File(obbFile).exists());

if (mgr.mountObb(obbFile, "blahblah", new OnObbStateChangeListener(){

    @Override
    public void onObbStateChange(String path, int state) {
        Log.i("OBB", String.format("onObbStateChange:Path [%s] State=%d", path, state));
        if (state == OnObbStateChangeListener.ERROR_COULD_NOT_MOUNT){
            Log.i("OBB", "THIS IS THE ERROR I GET");
        }
    }})) 
{
    Log.i("OBB", "Attempting to mount");
} else {
    Log.i("OBB", "Mount failed");   // this isn't happening
}

これの最終結果は次のとおりです。

 E/MountService( 2004): Couldn't mount OBB file: -1
 I/OBB     (21219): onObbStateChange:Path [/mnt/sdcard/out.obb] State=21
 I/OBB     (21219): THIS IS THE ERROR I GET

誰でもこれに問題がありますか?それはうまくいくはずです!

注: 私は android.permission.WRITE_EXTERNAL_STORAGE を持っています。また、期待される情報を次から取得します。

ObbInfo info = ObbScanner.getObbInfo("/sdcard/out.obb"); // this returns expected info, so the file is there and able to be read.

編集: Android-Developer グループの質問へのリンクはこちら

4

1 に答える 1

1

まず、obb ファイル (out.obb) で作成された仮想デバイス (device-mapper デバイス) をフォーマットしてからマウントする必要があります。

具体的には、VolumeManager::mountObb() に次のようなコードを追加する必要があります。

if (Fat::format(dmDevice, 0)) {
    SLOGE("OBB FAT format failed (%s)", strerror(errno));
    return -1;
}

多分これはアンドロイドのバグですか?

于 2012-08-24T08:19:51.620 に答える