Android培訓班(33)

來源:互聯網
上載者:User

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

在init.rc檔案裡,可以看到載入下面的服務:

service vold /system/bin/vold

socket vold stream 0660 root mount

vold服務的代碼在目錄:

Android-2.0/system/core/vold

vold服務的作用主要是負責完成系統的動態磁碟區管理,比如CDROM、U盤、MMC卡等外儲存的管理。當有這外存放裝置插入時,就需要監視這種變化,並載入相應的驅動程式,然後報告給系統和應用程式有新存放裝置可以使用。

Vold處理過程大致分為三步:
1.建立連結:
在vold作為一個守護進程,一方面接受驅動的資訊,並把資訊傳給應用程式層;另一方面接受上層的命令並完成相應。所以這裡的連結一共有兩條:
(1)vold socket: 負責vold與應用程式層的資訊傳遞;
(2)訪問udev的socket: 負責vold與底層的資訊傳遞;
這兩個連結都是在進程的一開始完成建立的。

2.引導:
這裡主要是在vold啟動時,對現有外設存放裝置的處理。首先,要載入並解析vold.conf,
並檢查掛載點是否已經被掛載;其次,執行MMC卡掛載;最後,處理USB大型存放區。

3.事件處理:
這裡通過對兩個連結的監聽,完成對動態事件的處理,以及對上層應用操作的響應。

 

下面來分析一下main函數的代碼如下:

int main(int argc, char **argv)

{

int door_sock = -1;

int uevent_sock = -1;

struct sockaddr_nl nladdr;

int uevent_sz = 64 * 1024;

LOGI("Android Volume Daemon version %d.%d", ver_major, ver_minor);

/*

* Create all the various sockets well need

*/

// Socket to listen on for incomming framework connections

if ((door_sock = android_get_control_socket(VOLD_SOCKET)) < 0) {

LOGE("Obtaining file descriptor socket %s failed: %s",

VOLD_SOCKET, strerror(errno));

exit(1);

}

這段代碼是建立一個負責vold與應用程式層的資訊傳遞的SOCKET。

if (listen(door_sock, 4) < 0) {

LOGE("Unable to listen on fd %d for socket %s: %s",

door_sock, VOLD_SOCKET, strerror(errno));

exit(1);

}

這裡開始監聽。

mkdir("/dev/block/vold", 0755);

建立相應的裝置目錄。

// Socket to listen on for uevent changes

memset(&nladdr, 0, sizeof(nladdr));

nladdr.nl_family = AF_NETLINK;

nladdr.nl_pid = getpid();

nladdr.nl_groups = 0xffffffff;

if ((uevent_sock = socket(PF_NETLINK,

SOCK_DGRAM,NETLINK_KOBJECT_UEVENT)) < 0) {

LOGE("Unable to create uevent socket: %s", strerror(errno));

exit(1);

}

這段代碼是 負責vold與底層的資訊傳遞的SOCKET。

if (setsockopt(uevent_sock, SOL_SOCKET, SO_RCVBUFFORCE, &uevent_sz,

sizeof(uevent_sz)) < 0) {

LOGE("Unable to set uevent socket options: %s", strerror(errno));

exit(1);

}

if (bind(uevent_sock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {

LOGE("Unable to bind uevent socket: %s", strerror(errno));

exit(1);

}

/*

* Bootstrap

*/

bootstrap = 1;

// Volume Manager

volmgr_bootstrap();

// SD Card system

mmc_bootstrap();

// USB Mass Storage

ums_bootstrap();

// Switch

switch_bootstrap();

上面這段是在vold啟動時,對現有外設存放裝置的處理。

bootstrap = 0;

/*

* Main loop

*/

LOG_VOL("Bootstrapping complete");

while(1) {

fd_set read_fds;

struct timeval to;

int max = 0;

int rc = 0;

to.tv_sec = (60 * 60);

to.tv_usec = 0;

FD_ZERO(&read_fds);

FD_SET(door_sock, &read_fds);

if (door_sock > max)

max = door_sock;

FD_SET(uevent_sock, &read_fds);

if (uevent_sock > max)

max = uevent_sock;

if (fw_sock != -1) {

FD_SET(fw_sock, &read_fds);

if (fw_sock > max)

max = fw_sock;

}

if ((rc = select(max + 1, &read_fds, NULL, NULL, &to)) < 0) {

LOGE("select() failed (%s)", strerror(errno));

sleep(1);

continue;

}

if (!rc) {

continue;

}

if (FD_ISSET(door_sock, &read_fds)) {

struct sockaddr addr;

socklen_t alen;

alen = sizeof(addr);

if (fw_sock != -1) {

LOGE("Dropping duplicate framework connection");

int tmp = accept(door_sock, &addr, &alen);

close(tmp);

continue;

}

if ((fw_sock = accept(door_sock, &addr, &alen)) < 0) {

LOGE("Unable to accept framework connection (%s)",

strerror(errno));

}

LOG_VOL("Accepted connection from framework");

if ((rc = volmgr_send_states()) < 0) {

LOGE("Unable to send volmgr status to framework (%d)", rc);

}

}

if (FD_ISSET(fw_sock, &read_fds)) {

if ((rc = process_framework_command(fw_sock)) < 0) {

if (rc == -ECONNRESET) {

LOGE("Framework disconnected");

close(fw_sock);

fw_sock = -1;

} else {

LOGE("Error processing framework command (%s)",

strerror(errno));

}

}

}

if (FD_ISSET(uevent_sock, &read_fds)) {

if ((rc = process_uevent_message(uevent_sock)) < 0) {

LOGE("Error processing uevent msg (%s)", strerror(errno));

}

}

} // while

}


上面這段代碼是進入事件處理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.