안드로이드는 기본적으로 사용자가 촬영하는 사진이나 음악, 비디오가 모두 SD/MMC 메모리 카드에 들어가게 된다. 그래서 SD/MMC 카드를 마운트해야 정상적인 멀티미디어 안드로이드 환경을 느낄 수 있다. 안드로이드 1.5 Cupcake 이전 버전에서는 mountd 라는 장치 마운트 데몬이 있었는데, 이것이 버전업이 되면서 vold라는 장치 마운트 데몬으로 바뀌게 되었다.

 VOLD::uevent 처리>

부팅 후 추가되는 장치는 event에 의해 처리되지만 부팅 전에 연결되어 있는 장치는 coldboot()함수에서 처리한다.
 coldboot("/sys/block") 함수를 호출하여 모든 장치에 대해 uevent를 이용해 add event를 발생시킨다. 
uevent에 대한 메시지는 NetlinkManager가 담당하기 때문에 coldboot()함수를 호출하기 전에 NetlinkManager를 create하고 start하는 과정이 필요하다. 
물론 실질적인 처리는 NetlinkManager가 아니라 NetlinkManager의 start함수를 호출할 때 생성되는 NetlinkHandler에서 처리한다. 
부팅 후 추가되는 장치도 uevent를 발생하고 NetlinkHandler가 처리하기 때문에 이후 동작은 동일하다.

0. coldboot함수에서 모든 장치에 대해 uevent의 add event 발생
1. NetlinkHandler의 onEvent함수 호출
2. VolumeManager의 handleBlockEvent함수 호출
3. process_config 과정에서 등록었던 모든 volume의 DirectVolume::handleBlockEvent함수 호출
4. sysfs_path가 일치하는 DirectVolume에 대해 이벤트 처리
5. action에 따라 다음과 같이 처리
case 1: add
 1. createDeviceNode 호출
 2. devtype에 따라 handleDiskAdded or handlePartitionAdded 호출
case 2: remove
 1. devtype에 따라 handleDiskRemoved or handlePartitionRemoved 호출
case 3: change
 1. devtype에 따라 handleDiskChanged or handlePartitionChanged 호출

<VOLD::설정하기>
초기화 과정에서 vold가 실행되면 실질적으로 가장 먼저 하는 일은 process_config()함수이다. 
그 전에 하는 일은 create와 start 함수이므로 크게 신경쓰지 않아도 된다. 
proces_config()는 '/system/etc/vold.fstab' 파일을 읽고 VolumeManager에 volume을 등록한다. 
그러므로 vold.fstab파일의 내용을 알아둬야 한다. 
vold 소소를 잘 정리해두면 vold.fstab을 수정하는 것 만으로도 새로운 장치를 적용할 수 있다

1. vold.fstab 파일 open한 후 값을 읽어 다음 순으로 저장
2. type : type에 따라 동작을 달리할 수 있으나 기본적으로 'dev_mount'일 경우만 동작
3. label : volume을 구분하기 위한 고유값. 실제로 대부분이 mount_point를 이용해서 구분.
4. mount_point : mount할 directory로 여러 부분에서 사용
5. part : device의 partition. auto일 경우 순서대로 mount를 시도하여 가장 먼저 성공한 partition을 사용.
6. sysfs_path : device의 path. 실제로 가장 중요. 4개까지 설정 가능

<VOLD::시작>

안드로이드가 froyo로 버전업이 되면서 vold도 많이 달라졌다. 여기서는 froyo 소스로 분석을 할 것이다. 
그러니 froyo로 버전업되면서 vold의 위치가 '/system/core/vold'에서 '/system/vold'로 수정되었다는 사실을 알아두자. 
정확히 말하면 위치가 바꼈다기 보다는 froyo에서는 VOLD2를 사용하는데 VOLD2의 위치가 '/system/vold'이다.

1. init.rc에서 vold 실행
2. Create VolumeManager
3. Create NetlinkManager
4. Create CommandListener
5. VolumeManager::start()
6. process_config()
7. NetlinkManager::start()
8. coldboot("/sys/block")
9. VolumeManager::notifyUmsConnected()
10. coldboot("/sys/class/switch");
11. CommandListener::startListener()

 

MMC Card를 2개의 partition으로 나눈 상태에서 아래와 같이 vold.fstab을 작성할 수 있다.

dev_mount   sdcard   quto  /devices/platform/s3c-sdhci.0/mmc_host/mmc0/mmc0:0001/block/mmcblk0

 

Android OS가 올라간 이후로 mmc card가 자동으로 인식 안되는 문제가 있다. 이때 수동으로는 아래와 같이 할 수 있다.

# mount -t vfat /dev/block/mmcblk0p1 /mnt/sdcard

# vdc volume list

# vdc volume mount /mnt/sdcard

자동으로 인식하게 하려면 init.rc에 아래와 같이 내용을 추가해준다.

mount vfat /dev/block/mmcblk0p1 /mnt/sdcard

이렇게 해서 mp3 play가 가능해진다. 그런데, sound는 stub로 잡히면서 소리가 나질 않는다. sound는 따로 잡아줘야한다.

출처 : http://blog.naver.com/PostView.nhn?blogId=essenlee&logNo=70103708811

 

+ Recent posts