SlideShare a Scribd company logo
1 of 34
Download to read offline
Android Storage
- Vold (Honeycomb 3.2)
William.L
wiliwe@gmail.com
2011-11-25
Outline
What is Vold?
Components
Communication
Vold Init Flow
Volume State Machine
Example : SD Card Insert
Appendix A- An issue in Google original code
Appendix B- How to read Microsoft NTFS format
storage?
Reference
What is Vold?
Volume daemon
The same as Mountd before Donut (Android 1.7)
Vold 2.0 since Froyo (Android 2.2)
As the role of Udev in the desktop Linux distro
Lisenting Netlink socket for volume changing Uevent
Ineteract with MountService (Java layer)
As a slave to MountService which is the decision maker
Notify volume status changing events to MountService
Execute commands issued from MountService
Communicates with MountService through unix domain(POSIX
Local IPC) socket
Folder : AndroidSrc/system/vold
Main Entry
main.c : main()
Components (1/12)
Vold is composed of
VolumeManager
NetlinkManager
NetlinkHandler
NetlinkEvent
CommandListener
Volume / DirectVolume
vold.fstab file
Fat
fsck_msdos , newfs_msdos executables
Components (2/12)
MountService
vold
(local socket )
CommandListener
VolumeManager
Send
command
Notify volume
events
Netlink socket
Notify volume events
Dispatch
Command
Notify volume
events
NetlinkManager
NetlinkHandler
Linux Kernel
Notify UEVENT
Vold
VolumeCollection <List>
DirectVolume-USB
DirectVolume-
External SD Card
.
.
.
After parsing
vold.fstab,
add
DirectVolume
to
VolumeCollecti
on list
Vold Architecture
(Java layer)
(C/C++ app layer)
Components (3/12)
VolumeManager
VolumeManager.cpp/.h
Provides corresponding command handlers called by
CommandListener for ASEC/OBB/MountService
commands
Store volume informations retrieved from vold.fstab
Notify MountService status changing of volumes
Components (4/12)
NetlinkManager
NetlinkManager.cpp/.h
Open the socket listening to kernel Netlink Kobject
Uevent
Create a NetlinkHandler instance with the opened
socket and activate it to start to listen to the Netlink
socket
Components (5/12)
NetlinkHandler
NetlinkHandler.cpp/.h
Wait for Netlink Kobject Uevent
Process Uevent in NetlinkHandler::onEvent()
Call proper command handlers(defined in VolumeManager)
corresponding to the “action” type of uevent
Components (6/12)
NetlinkEvent
AndroidSrc/system/core/include/sysutils/NetlinkEvent.h
Encapsulate Uevent information
Passed to NetlinkHandler::onEvent()
Components (7/12)
CommandListener
CommandListener.cpp/.h
Using socket(vold) to communicate with MountService
Wait for commands from MountService
Dispatch received MountService commands to
corresponding executor
CommandListener::VolumeCmd::runCommand()
Components (8/12)
Volume / DirectVolume
Volume.cpp/.h , DirectVolume.cpp/.h
DirectVolume is a subclass of Volume
To store volume informations retreiving from vold.fstab
Volume do the actual actions(mount, unmount, etc)
corresponding to the commands(doMount, doUnmount, etc)
from MountService
Components (9/12)
vold.fstab
AndroidSrc/device/nvidia/ventana [nVidia solution]
Describe what storages will be added into system
Processed by process_config()
AndroidSrc/system/vold/main.cpp
Example:
dev_mount usbdrive /mnt/usbdrive auto /devices/platform/tegra-ehci.2/usb2
dev_mount - Means mounting devices
usbdrive - Label for the USB volume
/mnt/usbdrive - Where the USB volume will be mounted
auto - Partition number (1 based). 'auto' for first usable partition
/devices/platform/tegra-ehci.2/usb2 - The sysfs path to external USB device
Components (10/12)
Fat
Fat.cpp/.h
Validate if the filesystem of the new added volume is FAT
Mount the new volume whose filesystem type is FAT
Format specified volume’s filesystem to FAT
Components (11/12)
fsck_msdos exectutable
AndroidSrc/external/fsck_msdos/main.c
To validate if the filesystem in new adding volume is MS-
DOS FAT 16 or 32
Called by Fat::check()
Components (12/12)
newfs_msdos exectutable
AndroidSrc/system/core/toolbox/newfs_msdos.c
To format a specified volume to MS-DOS FAT 32 type
filesystem
Called by Fat::format()
Communication
Netlink Socket
Passes informations between Kernel space and User
space
Protocol : NETLINK_KOBJECT_UEVENT
Defined in KernelSrc/include/linux/netlink.h
KernelSrc/lib/kobject_uevent.c : kobject_uevent_env()
Unix Domain/POSIX Local IPC Socket
For the communication between Vold & MountService
Created in init.rc
socket vold stream 0660 root mount
mount is MountService process
AndroidSrc/system/core/rootdir/init.rc
Vold Init Flow
Init.rc invoke “/system/bin/vold” &
create local socket “vold”
vold/main()
Create instance of
VolumeManager, CommandListener,
NetlinkManager separately
Set CommandLisener instance
to be the broadcaster of
VolumeManager/NetlinkManager to notify
volume changing event to MountService
through local socket
Activate the VolumeManager instance to run
Create the folder “/dev/block/vold” for device
node of new added volume
Acitvate the NetlinkManager instance to
listen to netlink uevent
Call coldboot() to monitor if there has
any volume(insternal/external storage)
has existed before booting
start
Activate CommandLinstener instance to
to listen “vold” local socket
Loop forever
Parse vold.fstab and store possible adding
storages’ Information using DirectVolume
Volume State Machine (1/4)
10 volume states (enum-value)
Init (-1)
NoMedia/Removed (0)
Idle/Unmounted (1)
Pending (2)
Waiting for the report of the number of volume partition
Chencking (3)
Checking filesystem type
Mounted (4)
Unmounting (5)
Formatting (6)
Shared(Unmounted) (7)
ShareMnt (8)
Volume State Machine (2/4)
Init NoMediaInitial
System initialize done
Attach storage to the device
NoMedia
Idle(Unmounted)
Pending
CheckingMounted
Initial
Volume State Machine (3/4)
NoMedia Idle(Unmounted)
Initial
Deattach storage from the device
Mounted Unmounting
Formatting
Idle(Unmounted)
Initial
Format the storage
Mounted Unmounting
(1)
(2) (3)
(4)(5)
CheckingMounted
(6)
Volume State Machine (4/4)
Idle(Unmounted)
Initial
Storage(SD card) Unsharing
SharedMnt Shared-Unmounted
CheckingMounted
Shared-Unmounted
Initial
Storage(SD card) Sharing
Mounted Unmounting
Idle(Unmounted)
SharedMnt
From Honeycomb with
MTP, these two cases
will not happen!
When access USB
mass-storage through
MTP, it need not to
unmount SD card.
Example: SD Card Insert (1/3)
[Honeycomb MR2]
Volume information for SD card in vold.fstab :
dev_mount sdcard /sdcard2 auto /devices/platform/sdhci-tegra.2/mmc_host/mmc1
When Vold init, a DirectVolume instance will be created to store SD card volume
informations
The stored informations are:
Label : sdcard
MountPoint : /sdcard2
DevPath(sysfs) : /devices/platform/sdhci-tegra.2/mmc_host/mmc1
Example: SD Card Insert (2/3)
Kernel detect a mmc
medium (sd card) insert
Kernel send Netlink Kobject Uevent :
ACTION : add
DEVPATH : /devices/platform/sdhci-
tegra.2/mmc_host/mmc1/mmc1:e624/block/mmcblk1
DEVTYPE : disk
SUBSYS : block
ACTION : add
DEVPATH : /devices/platform/sdhci-
tegra.2/mmc_host/mmc1/mmc1:e624/block/mmcblk1/mmcblk1p1
DEVTYPE : partition
SUBSYS : block
NetlinkHanlder detect Uevent with “block” subsys type,
then call VolumeManager::handleBlockEvent()
In VolumeManager::handleBlockEvent(), it iterate all
stored DirectVolume instances and call their
handleBolckEvent() method
In DirectVolume::handleBolckEvent(), it compares
passed in devPath with the one retrieved from vold.fstab.
In this example, if it found the string
“/devices/platform/sdhci-tegra.2/mmc_host/mmc1” in
devPath, it will create a device node under
/dev/block/vold/MajrID:MinrID for the new added volume
and then send notification,
“ResponseCode::VolumeDiskInserted”, to
MountService with Label & MountPoint (from vold.fstab)
as parameters
Continued to the
next slide
Insert
Android Device
Example: SD Card Insert (3/3)
On MountService receiving notification from
Vold, “ResponseCode::VolumeDiskInserted”,
it send “volume mount” command back to Vold
with “MountPoint” as the parameter named
Label
Continued from the previous slide
In Vold, CommandListener receive ”volume
mount” command, it execute
VolumeManager::mountVolume() with
parameter, Label, from MountService
In VolumeManager::mountVolume(), it
compare parameter, Label, with “Label” or
“MountPoint” informations retrieved from
vold.fstab.
If it match one of two information, it will call
Volume::mountVol() to subsequtial operations
for mounting
In Volume::mountVol(), it does FAT filesystem
checking operation by calling Fat::check().
If the new added volume is FAT filesystem, it
will try to mount new volume with VFAT type
using Fat::doMount() and
Volume::doMoveMount()
The new added volume has been mounted,
and the user can use this new
volume/storage (^o^)
Appendix A-
An issue in Google original code:
video/image files in external storage will be deleted
when un-mounting external storage
2011-10-14
Problem Description
After user pressing “Unmount” button in
Settings>Storage menu to unmount an
external storage, all video/image files on that
external storage will be deleted immediately
without any warning message
This problem will shock users!!!
Root Cause (1/2)
After user pressing “Unmount” button in
Settings>Storage menu, the system will send
ACTION_MEDIA_EJECT and
ACTION_MEDIA_UNMOUNTED Intents (events)
in sequence
When the member "mUnmountReceiver“
(BroadcastReceiver) of the class MediaProvider
(MediaProvider.java) receiving the
ACTION_MEDIA_EJECT Intent, it will call
delete() of SQLiteDatabase class to
prune/remove invalid entries in thumbnail table
representing video/image files on the
unmounted external storage
Root Cause (2/2)
delete() of SQLiteDatabase class will delete the
(video/image) files corresponding to invalid
entries in the thumbnail table eventually
Please refer to the Google Android issue
http://code.google.com/p/android/issues/detail?id=3692
Search the keyword “delete()”
Solution
To change the Intent type the member
"mUnmountReceiver“ monitors to
ACTION_MEDIA_UNMOUNTED and
ACTION_MEDIA_BAD_REMOVAL
So MediaProvider will prune/remove invalid
entries in thumbnail table only when it receives
Unmounted or Bad-Removal events
e.g. the external storage has been detached from the
file system actually!
Appendix B-
How to read Microsoft NTFS
format storage?
2011-12-27
Problem Description
Originally, Google Android only supports
Microsoft FAT format storage
Android Vold (Volume.cpp) checks the format
of a new inserted storage when trying to do
mounting. If it is not FAT format, it will skip this
storage and check the next found storage
Storages in NTFS format are so common, so it is
better for an Android device to be capable of
reading NTFS format storage
Solution (1/2)
TuxEra’s NTFS-3G is a stable, full-featured
solution to address the requirement of reading
NTFS format storage
This is a file system driver for NTFS format
After installing this into Linux system, it will add a file
system type option “ntfs” of “mount” system command
and “mount()” API
NTFS-3G official site
http://www.tuxera.com/community/ntfs-3g-download/
Solution (2/2)
In the method mountVol() of Volume class
(Volume.cpp)
“if ( Fat::check(devicePath) )” block will enter when the
checking status is non-zero, e.g. the current storage is
NOT FAT format
It could add codes to calling mount() with “ntfs” option
in this block to try to mount current storage and to see if
it is NTFS format through the return value of mount()
Also, it needs to check the storage is in Read-Only
mode
Reference
Kobject Uevent socket – Chapter 17, Linux 核
心開發指南 (Linux Kernel Development, 2/e)
Robert Love 著, 沈中庸、沈彥男 譯, 維科出版社
Unix Domain Socket – Chapter 15, Unix
Network Programming, Volume 1: The Sockets
Networking API, 3/e W. Richard Stevens
Netlink in Kernel –
http://www.linuxjournal.com/article/7356

More Related Content

What's hot

Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time OptimizationKan-Ru Chen
 
Android Booting Sequence
Android Booting SequenceAndroid Booting Sequence
Android Booting SequenceJayanta Ghoshal
 
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)Nanik Tolaram
 
Android device driver structure introduction
Android device driver structure introductionAndroid device driver structure introduction
Android device driver structure introductionWilliam Liang
 
Android booting sequece and setup and debugging
Android booting sequece and setup and debuggingAndroid booting sequece and setup and debugging
Android booting sequece and setup and debuggingUtkarsh Mankad
 
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Opersys inc.
 
Introduction to Kernel and Device Drivers
Introduction to Kernel and Device DriversIntroduction to Kernel and Device Drivers
Introduction to Kernel and Device DriversRajKumar Rampelli
 
Android OTA updates
Android OTA updatesAndroid OTA updates
Android OTA updatesGary Bisson
 
Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux DevelopersOpersys inc.
 
Kernel_Crash_Dump_Analysis
Kernel_Crash_Dump_AnalysisKernel_Crash_Dump_Analysis
Kernel_Crash_Dump_AnalysisBuland Singh
 
Android bootup process
Android bootup processAndroid bootup process
Android bootup processSanjay Kumar
 

What's hot (20)

Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time Optimization
 
Android Booting Sequence
Android Booting SequenceAndroid Booting Sequence
Android Booting Sequence
 
Android Things : Building Embedded Devices
Android Things : Building Embedded DevicesAndroid Things : Building Embedded Devices
Android Things : Building Embedded Devices
 
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
 
Embedded Android : System Development - Part II (Linux device drivers)
Embedded Android : System Development - Part II (Linux device drivers)Embedded Android : System Development - Part II (Linux device drivers)
Embedded Android : System Development - Part II (Linux device drivers)
 
Embedded Android : System Development - Part I
Embedded Android : System Development - Part IEmbedded Android : System Development - Part I
Embedded Android : System Development - Part I
 
Android device driver structure introduction
Android device driver structure introductionAndroid device driver structure introduction
Android device driver structure introduction
 
Android booting sequece and setup and debugging
Android booting sequece and setup and debuggingAndroid booting sequece and setup and debugging
Android booting sequece and setup and debugging
 
Embedded Android : System Development - Part IV
Embedded Android : System Development - Part IVEmbedded Android : System Development - Part IV
Embedded Android : System Development - Part IV
 
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
 
Android Booting Scenarios
Android Booting ScenariosAndroid Booting Scenarios
Android Booting Scenarios
 
Introduction to Kernel and Device Drivers
Introduction to Kernel and Device DriversIntroduction to Kernel and Device Drivers
Introduction to Kernel and Device Drivers
 
Android OTA updates
Android OTA updatesAndroid OTA updates
Android OTA updates
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux Developers
 
Embedded Android : System Development - Part III
Embedded Android : System Development - Part IIIEmbedded Android : System Development - Part III
Embedded Android : System Development - Part III
 
Android Binder: Deep Dive
Android Binder: Deep DiveAndroid Binder: Deep Dive
Android Binder: Deep Dive
 
Kernel_Crash_Dump_Analysis
Kernel_Crash_Dump_AnalysisKernel_Crash_Dump_Analysis
Kernel_Crash_Dump_Analysis
 
Android bootup process
Android bootup processAndroid bootup process
Android bootup process
 
Init of Android
Init of AndroidInit of Android
Init of Android
 

Similar to Android Storage: Vold (Volume Daemon

Monky vold extension
Monky vold extensionMonky vold extension
Monky vold extensionmamahow
 
Let’s talk virtualization
Let’s talk virtualizationLet’s talk virtualization
Let’s talk virtualizationEtienne Tremblay
 
Mirroring the root_disk under solaris SVM
Mirroring the root_disk under solaris SVMMirroring the root_disk under solaris SVM
Mirroring the root_disk under solaris SVMKazimal Abed Mohammed
 
Bootloaders (U-Boot)
Bootloaders (U-Boot) Bootloaders (U-Boot)
Bootloaders (U-Boot) Omkar Rane
 
The Holy Grail of Deployment
The Holy Grail of DeploymentThe Holy Grail of Deployment
The Holy Grail of DeploymentStuart King
 
I/O, You Own: Regaining Control of Your Disk in the Presence of Bootkits
I/O, You Own: Regaining Control of Your Disk in the Presence of BootkitsI/O, You Own: Regaining Control of Your Disk in the Presence of Bootkits
I/O, You Own: Regaining Control of Your Disk in the Presence of BootkitsCrowdStrike
 
Bootkits: Past, Present & Future - Virus Bulletin
Bootkits: Past, Present & Future - Virus BulletinBootkits: Past, Present & Future - Virus Bulletin
Bootkits: Past, Present & Future - Virus BulletinESET
 
R12 d49656 gc10-apps dba 01
R12 d49656 gc10-apps dba 01R12 d49656 gc10-apps dba 01
R12 d49656 gc10-apps dba 01zeesniper
 
WinFE: The (Almost) Perfect Triage Tool
WinFE: The (Almost) Perfect Triage ToolWinFE: The (Almost) Perfect Triage Tool
WinFE: The (Almost) Perfect Triage ToolBrent Muir
 
dokumen.tips_aix-presentation.ppt
dokumen.tips_aix-presentation.pptdokumen.tips_aix-presentation.ppt
dokumen.tips_aix-presentation.pptAhmedFawzy916524
 
Logical volume manager xfs
Logical volume manager xfsLogical volume manager xfs
Logical volume manager xfsSarwar Javaid
 
VDCF Overview
VDCF OverviewVDCF Overview
VDCF OverviewJomaSoft
 
X64 Workshop Linux Information Gathering
X64 Workshop Linux Information GatheringX64 Workshop Linux Information Gathering
X64 Workshop Linux Information GatheringAero Plane
 

Similar to Android Storage: Vold (Volume Daemon (20)

Ch12 system administration
Ch12 system administration Ch12 system administration
Ch12 system administration
 
Ch04 system administration
Ch04 system administration Ch04 system administration
Ch04 system administration
 
Ch04
Ch04Ch04
Ch04
 
Monky vold extension
Monky vold extensionMonky vold extension
Monky vold extension
 
Let’s talk virtualization
Let’s talk virtualizationLet’s talk virtualization
Let’s talk virtualization
 
Mirroring the root_disk under solaris SVM
Mirroring the root_disk under solaris SVMMirroring the root_disk under solaris SVM
Mirroring the root_disk under solaris SVM
 
Bootloaders (U-Boot)
Bootloaders (U-Boot) Bootloaders (U-Boot)
Bootloaders (U-Boot)
 
The Holy Grail of Deployment
The Holy Grail of DeploymentThe Holy Grail of Deployment
The Holy Grail of Deployment
 
I/O, You Own: Regaining Control of Your Disk in the Presence of Bootkits
I/O, You Own: Regaining Control of Your Disk in the Presence of BootkitsI/O, You Own: Regaining Control of Your Disk in the Presence of Bootkits
I/O, You Own: Regaining Control of Your Disk in the Presence of Bootkits
 
Ch12
Ch12Ch12
Ch12
 
Bootkits: Past, Present & Future - Virus Bulletin
Bootkits: Past, Present & Future - Virus BulletinBootkits: Past, Present & Future - Virus Bulletin
Bootkits: Past, Present & Future - Virus Bulletin
 
R12 d49656 gc10-apps dba 01
R12 d49656 gc10-apps dba 01R12 d49656 gc10-apps dba 01
R12 d49656 gc10-apps dba 01
 
WinFE: The (Almost) Perfect Triage Tool
WinFE: The (Almost) Perfect Triage ToolWinFE: The (Almost) Perfect Triage Tool
WinFE: The (Almost) Perfect Triage Tool
 
dokumen.tips_aix-presentation.ppt
dokumen.tips_aix-presentation.pptdokumen.tips_aix-presentation.ppt
dokumen.tips_aix-presentation.ppt
 
Logical volume manager xfs
Logical volume manager xfsLogical volume manager xfs
Logical volume manager xfs
 
Red Hat Training
Red Hat   TrainingRed Hat   Training
Red Hat Training
 
1 04 rao
1 04 rao1 04 rao
1 04 rao
 
VDCF Overview
VDCF OverviewVDCF Overview
VDCF Overview
 
Basic Linux Internals
Basic Linux InternalsBasic Linux Internals
Basic Linux Internals
 
X64 Workshop Linux Information Gathering
X64 Workshop Linux Information GatheringX64 Workshop Linux Information Gathering
X64 Workshop Linux Information Gathering
 

More from William Lee

Usage Note of Apache Thrift for C++ Java PHP Languages
Usage Note of Apache Thrift for C++ Java PHP LanguagesUsage Note of Apache Thrift for C++ Java PHP Languages
Usage Note of Apache Thrift for C++ Java PHP LanguagesWilliam Lee
 
Usage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on LinuxUsage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on LinuxWilliam Lee
 
Usage Note of SWIG for PHP
Usage Note of SWIG for PHPUsage Note of SWIG for PHP
Usage Note of SWIG for PHPWilliam Lee
 
Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5 Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5 William Lee
 
Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3William Lee
 
Viewing Android Source Files in Eclipse (Chinese)
Viewing Android Source Files in Eclipse  (Chinese)Viewing Android Source Files in Eclipse  (Chinese)
Viewing Android Source Files in Eclipse (Chinese)William Lee
 
Usage Note of Microsoft Dependency Walker
Usage Note of Microsoft Dependency WalkerUsage Note of Microsoft Dependency Walker
Usage Note of Microsoft Dependency WalkerWilliam Lee
 
Usage Note of PlayCap
Usage Note of PlayCapUsage Note of PlayCap
Usage Note of PlayCapWilliam Lee
 
Qt4 App - Sliding Window
Qt4 App - Sliding WindowQt4 App - Sliding Window
Qt4 App - Sliding WindowWilliam Lee
 
GTK+ 2.0 App - Desktop App Chooser
GTK+ 2.0 App - Desktop App ChooserGTK+ 2.0 App - Desktop App Chooser
GTK+ 2.0 App - Desktop App ChooserWilliam Lee
 
GTK+ 2.0 App - Icon Chooser
GTK+ 2.0 App - Icon ChooserGTK+ 2.0 App - Icon Chooser
GTK+ 2.0 App - Icon ChooserWilliam Lee
 
Note of CGI and ASP
Note of CGI and ASPNote of CGI and ASP
Note of CGI and ASPWilliam Lee
 
Moblin2 - Window Manager(Mutter) Plugin
Moblin2 - Window Manager(Mutter) PluginMoblin2 - Window Manager(Mutter) Plugin
Moblin2 - Window Manager(Mutter) PluginWilliam Lee
 
Asterisk (IP-PBX) CDR Log Rotation
Asterisk (IP-PBX) CDR Log RotationAsterisk (IP-PBX) CDR Log Rotation
Asterisk (IP-PBX) CDR Log RotationWilliam Lee
 
L.A.M.P Installation Note --- CentOS 6.5
L.A.M.P Installation Note --- CentOS 6.5L.A.M.P Installation Note --- CentOS 6.5
L.A.M.P Installation Note --- CentOS 6.5William Lee
 
C Program Runs on Wrong Target Platform(CPU Architecture)
C Program Runs on Wrong Target Platform(CPU Architecture)C Program Runs on Wrong Target Platform(CPU Architecture)
C Program Runs on Wrong Target Platform(CPU Architecture)William Lee
 
Internationalization(i18n) of Web Page
Internationalization(i18n) of Web PageInternationalization(i18n) of Web Page
Internationalization(i18n) of Web PageWilliam Lee
 
Notes for SQLite3 Usage
Notes for SQLite3 UsageNotes for SQLite3 Usage
Notes for SQLite3 UsageWilliam Lee
 
Cygwin Install How-To (Chinese)
Cygwin Install How-To (Chinese)Cygwin Install How-To (Chinese)
Cygwin Install How-To (Chinese)William Lee
 

More from William Lee (20)

Usage Note of Apache Thrift for C++ Java PHP Languages
Usage Note of Apache Thrift for C++ Java PHP LanguagesUsage Note of Apache Thrift for C++ Java PHP Languages
Usage Note of Apache Thrift for C++ Java PHP Languages
 
Usage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on LinuxUsage Note of Qt ODBC Database Access on Linux
Usage Note of Qt ODBC Database Access on Linux
 
Usage Note of SWIG for PHP
Usage Note of SWIG for PHPUsage Note of SWIG for PHP
Usage Note of SWIG for PHP
 
Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5 Upgrade GCC & Install Qt 5.4 on CentOS 6.5
Upgrade GCC & Install Qt 5.4 on CentOS 6.5
 
Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3Usage Notes of The Bro 2.2 / 2.3
Usage Notes of The Bro 2.2 / 2.3
 
Viewing Android Source Files in Eclipse (Chinese)
Viewing Android Source Files in Eclipse  (Chinese)Viewing Android Source Files in Eclipse  (Chinese)
Viewing Android Source Files in Eclipse (Chinese)
 
Usage Note of Microsoft Dependency Walker
Usage Note of Microsoft Dependency WalkerUsage Note of Microsoft Dependency Walker
Usage Note of Microsoft Dependency Walker
 
Usage Note of PlayCap
Usage Note of PlayCapUsage Note of PlayCap
Usage Note of PlayCap
 
Qt4 App - Sliding Window
Qt4 App - Sliding WindowQt4 App - Sliding Window
Qt4 App - Sliding Window
 
GTK+ 2.0 App - Desktop App Chooser
GTK+ 2.0 App - Desktop App ChooserGTK+ 2.0 App - Desktop App Chooser
GTK+ 2.0 App - Desktop App Chooser
 
GTK+ 2.0 App - Icon Chooser
GTK+ 2.0 App - Icon ChooserGTK+ 2.0 App - Icon Chooser
GTK+ 2.0 App - Icon Chooser
 
Note of CGI and ASP
Note of CGI and ASPNote of CGI and ASP
Note of CGI and ASP
 
Moblin2 - Window Manager(Mutter) Plugin
Moblin2 - Window Manager(Mutter) PluginMoblin2 - Window Manager(Mutter) Plugin
Moblin2 - Window Manager(Mutter) Plugin
 
MGCP Overview
MGCP OverviewMGCP Overview
MGCP Overview
 
Asterisk (IP-PBX) CDR Log Rotation
Asterisk (IP-PBX) CDR Log RotationAsterisk (IP-PBX) CDR Log Rotation
Asterisk (IP-PBX) CDR Log Rotation
 
L.A.M.P Installation Note --- CentOS 6.5
L.A.M.P Installation Note --- CentOS 6.5L.A.M.P Installation Note --- CentOS 6.5
L.A.M.P Installation Note --- CentOS 6.5
 
C Program Runs on Wrong Target Platform(CPU Architecture)
C Program Runs on Wrong Target Platform(CPU Architecture)C Program Runs on Wrong Target Platform(CPU Architecture)
C Program Runs on Wrong Target Platform(CPU Architecture)
 
Internationalization(i18n) of Web Page
Internationalization(i18n) of Web PageInternationalization(i18n) of Web Page
Internationalization(i18n) of Web Page
 
Notes for SQLite3 Usage
Notes for SQLite3 UsageNotes for SQLite3 Usage
Notes for SQLite3 Usage
 
Cygwin Install How-To (Chinese)
Cygwin Install How-To (Chinese)Cygwin Install How-To (Chinese)
Cygwin Install How-To (Chinese)
 

Recently uploaded

Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 

Recently uploaded (20)

Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 

Android Storage: Vold (Volume Daemon

  • 1. Android Storage - Vold (Honeycomb 3.2) William.L wiliwe@gmail.com 2011-11-25
  • 2. Outline What is Vold? Components Communication Vold Init Flow Volume State Machine Example : SD Card Insert Appendix A- An issue in Google original code Appendix B- How to read Microsoft NTFS format storage? Reference
  • 3. What is Vold? Volume daemon The same as Mountd before Donut (Android 1.7) Vold 2.0 since Froyo (Android 2.2) As the role of Udev in the desktop Linux distro Lisenting Netlink socket for volume changing Uevent Ineteract with MountService (Java layer) As a slave to MountService which is the decision maker Notify volume status changing events to MountService Execute commands issued from MountService Communicates with MountService through unix domain(POSIX Local IPC) socket Folder : AndroidSrc/system/vold Main Entry main.c : main()
  • 4. Components (1/12) Vold is composed of VolumeManager NetlinkManager NetlinkHandler NetlinkEvent CommandListener Volume / DirectVolume vold.fstab file Fat fsck_msdos , newfs_msdos executables
  • 5. Components (2/12) MountService vold (local socket ) CommandListener VolumeManager Send command Notify volume events Netlink socket Notify volume events Dispatch Command Notify volume events NetlinkManager NetlinkHandler Linux Kernel Notify UEVENT Vold VolumeCollection <List> DirectVolume-USB DirectVolume- External SD Card . . . After parsing vold.fstab, add DirectVolume to VolumeCollecti on list Vold Architecture (Java layer) (C/C++ app layer)
  • 6. Components (3/12) VolumeManager VolumeManager.cpp/.h Provides corresponding command handlers called by CommandListener for ASEC/OBB/MountService commands Store volume informations retrieved from vold.fstab Notify MountService status changing of volumes
  • 7. Components (4/12) NetlinkManager NetlinkManager.cpp/.h Open the socket listening to kernel Netlink Kobject Uevent Create a NetlinkHandler instance with the opened socket and activate it to start to listen to the Netlink socket
  • 8. Components (5/12) NetlinkHandler NetlinkHandler.cpp/.h Wait for Netlink Kobject Uevent Process Uevent in NetlinkHandler::onEvent() Call proper command handlers(defined in VolumeManager) corresponding to the “action” type of uevent
  • 10. Components (7/12) CommandListener CommandListener.cpp/.h Using socket(vold) to communicate with MountService Wait for commands from MountService Dispatch received MountService commands to corresponding executor CommandListener::VolumeCmd::runCommand()
  • 11. Components (8/12) Volume / DirectVolume Volume.cpp/.h , DirectVolume.cpp/.h DirectVolume is a subclass of Volume To store volume informations retreiving from vold.fstab Volume do the actual actions(mount, unmount, etc) corresponding to the commands(doMount, doUnmount, etc) from MountService
  • 12. Components (9/12) vold.fstab AndroidSrc/device/nvidia/ventana [nVidia solution] Describe what storages will be added into system Processed by process_config() AndroidSrc/system/vold/main.cpp Example: dev_mount usbdrive /mnt/usbdrive auto /devices/platform/tegra-ehci.2/usb2 dev_mount - Means mounting devices usbdrive - Label for the USB volume /mnt/usbdrive - Where the USB volume will be mounted auto - Partition number (1 based). 'auto' for first usable partition /devices/platform/tegra-ehci.2/usb2 - The sysfs path to external USB device
  • 13. Components (10/12) Fat Fat.cpp/.h Validate if the filesystem of the new added volume is FAT Mount the new volume whose filesystem type is FAT Format specified volume’s filesystem to FAT
  • 14. Components (11/12) fsck_msdos exectutable AndroidSrc/external/fsck_msdos/main.c To validate if the filesystem in new adding volume is MS- DOS FAT 16 or 32 Called by Fat::check()
  • 15. Components (12/12) newfs_msdos exectutable AndroidSrc/system/core/toolbox/newfs_msdos.c To format a specified volume to MS-DOS FAT 32 type filesystem Called by Fat::format()
  • 16. Communication Netlink Socket Passes informations between Kernel space and User space Protocol : NETLINK_KOBJECT_UEVENT Defined in KernelSrc/include/linux/netlink.h KernelSrc/lib/kobject_uevent.c : kobject_uevent_env() Unix Domain/POSIX Local IPC Socket For the communication between Vold & MountService Created in init.rc socket vold stream 0660 root mount mount is MountService process AndroidSrc/system/core/rootdir/init.rc
  • 17. Vold Init Flow Init.rc invoke “/system/bin/vold” & create local socket “vold” vold/main() Create instance of VolumeManager, CommandListener, NetlinkManager separately Set CommandLisener instance to be the broadcaster of VolumeManager/NetlinkManager to notify volume changing event to MountService through local socket Activate the VolumeManager instance to run Create the folder “/dev/block/vold” for device node of new added volume Acitvate the NetlinkManager instance to listen to netlink uevent Call coldboot() to monitor if there has any volume(insternal/external storage) has existed before booting start Activate CommandLinstener instance to to listen “vold” local socket Loop forever Parse vold.fstab and store possible adding storages’ Information using DirectVolume
  • 18. Volume State Machine (1/4) 10 volume states (enum-value) Init (-1) NoMedia/Removed (0) Idle/Unmounted (1) Pending (2) Waiting for the report of the number of volume partition Chencking (3) Checking filesystem type Mounted (4) Unmounting (5) Formatting (6) Shared(Unmounted) (7) ShareMnt (8)
  • 19. Volume State Machine (2/4) Init NoMediaInitial System initialize done Attach storage to the device NoMedia Idle(Unmounted) Pending CheckingMounted Initial
  • 20. Volume State Machine (3/4) NoMedia Idle(Unmounted) Initial Deattach storage from the device Mounted Unmounting Formatting Idle(Unmounted) Initial Format the storage Mounted Unmounting (1) (2) (3) (4)(5) CheckingMounted (6)
  • 21. Volume State Machine (4/4) Idle(Unmounted) Initial Storage(SD card) Unsharing SharedMnt Shared-Unmounted CheckingMounted Shared-Unmounted Initial Storage(SD card) Sharing Mounted Unmounting Idle(Unmounted) SharedMnt From Honeycomb with MTP, these two cases will not happen! When access USB mass-storage through MTP, it need not to unmount SD card.
  • 22. Example: SD Card Insert (1/3) [Honeycomb MR2] Volume information for SD card in vold.fstab : dev_mount sdcard /sdcard2 auto /devices/platform/sdhci-tegra.2/mmc_host/mmc1 When Vold init, a DirectVolume instance will be created to store SD card volume informations The stored informations are: Label : sdcard MountPoint : /sdcard2 DevPath(sysfs) : /devices/platform/sdhci-tegra.2/mmc_host/mmc1
  • 23. Example: SD Card Insert (2/3) Kernel detect a mmc medium (sd card) insert Kernel send Netlink Kobject Uevent : ACTION : add DEVPATH : /devices/platform/sdhci- tegra.2/mmc_host/mmc1/mmc1:e624/block/mmcblk1 DEVTYPE : disk SUBSYS : block ACTION : add DEVPATH : /devices/platform/sdhci- tegra.2/mmc_host/mmc1/mmc1:e624/block/mmcblk1/mmcblk1p1 DEVTYPE : partition SUBSYS : block NetlinkHanlder detect Uevent with “block” subsys type, then call VolumeManager::handleBlockEvent() In VolumeManager::handleBlockEvent(), it iterate all stored DirectVolume instances and call their handleBolckEvent() method In DirectVolume::handleBolckEvent(), it compares passed in devPath with the one retrieved from vold.fstab. In this example, if it found the string “/devices/platform/sdhci-tegra.2/mmc_host/mmc1” in devPath, it will create a device node under /dev/block/vold/MajrID:MinrID for the new added volume and then send notification, “ResponseCode::VolumeDiskInserted”, to MountService with Label & MountPoint (from vold.fstab) as parameters Continued to the next slide Insert Android Device
  • 24. Example: SD Card Insert (3/3) On MountService receiving notification from Vold, “ResponseCode::VolumeDiskInserted”, it send “volume mount” command back to Vold with “MountPoint” as the parameter named Label Continued from the previous slide In Vold, CommandListener receive ”volume mount” command, it execute VolumeManager::mountVolume() with parameter, Label, from MountService In VolumeManager::mountVolume(), it compare parameter, Label, with “Label” or “MountPoint” informations retrieved from vold.fstab. If it match one of two information, it will call Volume::mountVol() to subsequtial operations for mounting In Volume::mountVol(), it does FAT filesystem checking operation by calling Fat::check(). If the new added volume is FAT filesystem, it will try to mount new volume with VFAT type using Fat::doMount() and Volume::doMoveMount() The new added volume has been mounted, and the user can use this new volume/storage (^o^)
  • 25. Appendix A- An issue in Google original code: video/image files in external storage will be deleted when un-mounting external storage 2011-10-14
  • 26. Problem Description After user pressing “Unmount” button in Settings>Storage menu to unmount an external storage, all video/image files on that external storage will be deleted immediately without any warning message This problem will shock users!!!
  • 27. Root Cause (1/2) After user pressing “Unmount” button in Settings>Storage menu, the system will send ACTION_MEDIA_EJECT and ACTION_MEDIA_UNMOUNTED Intents (events) in sequence When the member "mUnmountReceiver“ (BroadcastReceiver) of the class MediaProvider (MediaProvider.java) receiving the ACTION_MEDIA_EJECT Intent, it will call delete() of SQLiteDatabase class to prune/remove invalid entries in thumbnail table representing video/image files on the unmounted external storage
  • 28. Root Cause (2/2) delete() of SQLiteDatabase class will delete the (video/image) files corresponding to invalid entries in the thumbnail table eventually Please refer to the Google Android issue http://code.google.com/p/android/issues/detail?id=3692 Search the keyword “delete()”
  • 29. Solution To change the Intent type the member "mUnmountReceiver“ monitors to ACTION_MEDIA_UNMOUNTED and ACTION_MEDIA_BAD_REMOVAL So MediaProvider will prune/remove invalid entries in thumbnail table only when it receives Unmounted or Bad-Removal events e.g. the external storage has been detached from the file system actually!
  • 30. Appendix B- How to read Microsoft NTFS format storage? 2011-12-27
  • 31. Problem Description Originally, Google Android only supports Microsoft FAT format storage Android Vold (Volume.cpp) checks the format of a new inserted storage when trying to do mounting. If it is not FAT format, it will skip this storage and check the next found storage Storages in NTFS format are so common, so it is better for an Android device to be capable of reading NTFS format storage
  • 32. Solution (1/2) TuxEra’s NTFS-3G is a stable, full-featured solution to address the requirement of reading NTFS format storage This is a file system driver for NTFS format After installing this into Linux system, it will add a file system type option “ntfs” of “mount” system command and “mount()” API NTFS-3G official site http://www.tuxera.com/community/ntfs-3g-download/
  • 33. Solution (2/2) In the method mountVol() of Volume class (Volume.cpp) “if ( Fat::check(devicePath) )” block will enter when the checking status is non-zero, e.g. the current storage is NOT FAT format It could add codes to calling mount() with “ntfs” option in this block to try to mount current storage and to see if it is NTFS format through the return value of mount() Also, it needs to check the storage is in Read-Only mode
  • 34. Reference Kobject Uevent socket – Chapter 17, Linux 核 心開發指南 (Linux Kernel Development, 2/e) Robert Love 著, 沈中庸、沈彥男 譯, 維科出版社 Unix Domain Socket – Chapter 15, Unix Network Programming, Volume 1: The Sockets Networking API, 3/e W. Richard Stevens Netlink in Kernel – http://www.linuxjournal.com/article/7356