| page.title=Storage | |
| @jd:body | |
| <!-- | |
| Copyright 2015 The Android Open Source Project | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| <div id="qv-wrapper"> | |
| <div id="qv"> | |
| <h2>In this document</h2> | |
| <ol id="auto-toc"> | |
| </ol> | |
| </div> | |
| </div> | |
| <img style="float: right; margin: 0px 15px 15px 15px;" src="images/ape_fwk_hal_extstor.png" alt="Android external storage HAL icon"/> | |
| <p>Android has evolved over time to support a wide variety of storage device types | |
| and features. All versions of Android support devices with <a href="{@docRoot}devices/storage/traditional.html">traditional storage</a>, | |
| which includes portable and emulated storage. <em>Portable</em> storage can be provided by physical media, like an SD card or USB, that is for | |
| temporary data transfer/ file storage. The physical media may remain with the | |
| device for an extended period of time, but is not tied to the device and may be | |
| removed. SD cards have been available as portable storage since Android 1.0; | |
| Android 6.0 added USB support. <em>Emulated</em> storage is provided by exposing a portion of internal storage through an | |
| emulation layer and has been available since Android 3.0.</p> | |
| <p>Starting in Android 6.0, Android supports <a href="{@docRoot}devices/storage/adoptable.html"><em>adoptable</em> storage</a>, which is provided by physical media, like an SD card or USB, that is | |
| encrypted and formatted to behave like internal storage. Adoptable storage can | |
| store all types of application data. </p> | |
| <h2 id=permissions>Permissions</h2> | |
| <p>Access to external storage is protected by various Android | |
| permissions. Starting in Android 1.0, write access is protected with the | |
| <code>WRITE_EXTERNAL_STORAGE</code> permission. Starting in Android 4.1, | |
| read access is protected with the <code>READ_EXTERNAL_STORAGE</code> | |
| permission.</p> | |
| <p>Starting in Android 4.4, the owner, group and modes of files on external | |
| storage devices are now synthesized based on directory structure. This | |
| enables apps to manage their package-specific directories on external | |
| storage without requiring they hold the broad | |
| <code>WRITE_EXTERNAL_STORAGE</code> permission. For example, the app with | |
| package name <code>com.example.foo</code> can now freely access | |
| <code>Android/data/com.example.foo/</code> on external storage devices with | |
| no permissions. These synthesized permissions are accomplished by wrapping | |
| raw storage devices in a FUSE daemon.</p> | |
| <h3 id=runtime_permissions>Runtime permissions</h3> | |
| <p>Android 6.0 introduces a new <a href="{@docRoot}devices/tech/config/runtime_perms.html">runtime permissions</a> model where apps request | |
| capabilities when needed at runtime. Because the new model includes the <code>READ/WRITE_EXTERNAL_STORAGE</code> permissions, the platform needs to dynamically grant storage access without | |
| killing or restarting already-running apps. It does this by maintaining three | |
| distinct views of all mounted storage devices:</p> | |
| <ul> | |
| <li><code>/mnt/runtime/default</code> is shown to apps with no special storage permissions, and to the root | |
| namespace where <code>adbd</code> and other system components live. | |
| <li><code>/mnt/runtime/read</code> is shown to apps with <code>READ_EXTERNAL_STORAGE</code> | |
| <li><code>/mnt/runtime/write</code> is shown to apps with <code>WRITE_EXTERNAL_STORAGE</code> | |
| </ul> | |
| <p>At Zygote fork time, we create a mount namespace for each running app and bind | |
| mount the appropriate initial view into place. Later, when runtime permissions | |
| are granted, <code>vold</code> jumps into the mount namespace of already-running apps and bind mounts the | |
| upgraded view into place. Note that permission downgrades always result in the | |
| app being killed.</p> | |
| <p>The <code>setns()</code> functionality used to implement this feature requires at least Linux 3.8, but | |
| patches have been backported successfully to Linux 3.4. The <code>PermissionsHostTest</code> CTS test can be used to verify correct kernel behavior.</p> | |
| <p>In Android 6.0, third-party apps don’t have access to the <code>sdcard_r</code> and <code>sdcard_rw</code> GIDs. Instead, access is controlled by mounting only the appropriate runtime | |
| view in place for that app. Cross-user interactions are blocked using the <code>everybody</code> GID.</p> |