0%

Android storage sandbox

1. prepareSandboxForApp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

skinparam backgroundColor #EEEBDC

skinparam sequence {
ArrowColor DeepSkyBlue
ActorBorderColor DeepSkyBlue
LifeLineBorderColor blue
LifeLineBackgroundColor #A9DCDF

ParticipantBorderColor DeepSkyBlue
ParticipantBackgroundColor DodgerBlue
ParticipantFontName Impact
ParticipantFontSize 17
ParticipantFontColor #A9DCDF

ActorBackgroundColor aqua
ActorFontColor DeepSkyBlue
ActorFontSize 17
ActorFontName Aapex
}

autoactivate on
pkms -> SMS: prepareSandboxForApp\n(pkg.packageName, appId,\n pkg.mSharedUserId, userId);
SMS->SMS: getSandboxId\n(packageName, sharedUserId);
return sandboxId
note left: packageName || "shared-" + packageName
SMS -> vold: <b>prepareSandboxForApp\n(packageName, appId, \n sandboxId, userId)
vold -> VM: prepareSandboxForApp
alt hasIsolatedStorage
VM->VM: hasIsolatedStorage
note left:"sys.isolated_storage_snapshot" true || "persist.sys.isolated_storage" true
else
VM-->pkms:end
end

VM->VM:verify package
return
VM->VM:<b>prepareSandboxes\n(userId, {packageName}, visibleVolLabels)
VM->VM:prepareSubDirs
note left:<b>sandboxRoot:\n/mnt/runtime/write/<vlable>Android/sandbox/
return

VM->VM:prepareSandboxTargets\n(userId, visibleVolLabels)
note left:<b>mntTargetRoot:\n/mnt/user/<userid>/package\n\
<b>sandboxTarget:\n/mnt/user/<userid>/package/<vlabel>/<userid>\n\
<b>primaryPath</b>(/stor**age/emulated/<userid>) <b>-></b> $mntTargetRoot/self/primary
return

VM->VM:mountPkgSpecificDirsForRunningProcs\n(userId, packageNames, \n visibleVolLabels, -1)
note left:obbMountDir:\n\
/mnt/user/<userId>/obb_mount\n\
<b>read /proc/<pid>/ns/mnt \n\
setns(nsFd.get(), CLONE_NEWNS
VM->VM:getMountModeForRunningProc
note left: <b>stat("/storage", &storageSb) \n\
vs stat("/mnt/runtime/full", &mntFullSb) -> <b>REMOUNT_MODE_FULL \n\
vs stat("/mnt/runtime/write", &mntWriteSb) -> <b>REMOUNT_MODE_LEGACY \n\
obbMountFile: "/mnt/user/<userid>/obb_mount/package" <b> \n\
<b>obbMountFile exist -> REMOUNT_MODE_INSTALLER \n\
vs /mnt/user/<userid>/package-><b>REMOUNT_MODE_WRITE
return mountmode

alt mountMode == remountMode
VM->VM:handleMountModeInstaller
return 0
end

alt REMOUNT_MODE_FULL || REMOUNT_MODE_LEGACY || REMOUNT_MODE_NONE
VM->pkms:end
else REMOUNT_MODE_INSTALLER || REMOUNT_MODE_WRITE
VM->VM ++ : mount
note left #LightBlue:mntSource: /mnt/runtime/write/<vlabel>/<userid> (for emulated)\n\
mntTarget: /storage/<vlabel>/<userid> (storage/emulated/0) \n\
sandboxSource: $mntSource/Android/sandbox/<sandboxid> \n\
<b>$sandboxSource <b>-></b> $mntTarget \n\
obbSourceDir: $mntSource/Android/obb \n\
obbTargetDir: $mntTarget/Android/obb \n\
REMOUNT_MODE_INSTALLER: $obbSourceDir <b>-></b> $obbTargetDir \n\
REMOUNT_MODE_WRITE: $mntSource/Android/data|media/<package>/ <b>-></b> $mntTarget/Android/data|media/<package>/ \n\
$mntSource/Android/data|media/<package>/ <b>-></b> $mntTarget/Android/data|media/<package>/
return
VM->pkms:end
end