| 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> |