Android SDCard框架
Android SDCard框架,我們修改一般涉及到四大模塊
- Linux Kernel 用於檢測熱拔插,作為框架開發者來說,這者不用涉及
- Vold 作為Kernel 與 Framework 之間的橋梁
- Framework 操作Vold ,給Vold 下發操作命令
- UI 與Framework 交互,用於掛載/卸載SD卡
框架涉及的源碼位置
Vold :System/vold
為vold 提供接口:System/Netd
其他涉及的部分:System/core/libsysutils/src
System/core/include/sysutils
Framework:frameworks/base/services/java/com/android/server
訪問和提供接口類:framework/base/core/java/android/os/storage/
可能還要參考的庫:framework/base/libs/storage
framework/base/native
UI:Settings/src/com/android/setting/deviceinfo
SDCard UnMounted流程分析
VolumeManager, CommandListener, NetlinkManager 都是在 main()函數里面初始化的。
深入main文件
在Vold 的main.cpp里面,啟動一個線程用來監聽kernel 發出unMounted 的uevent事件,代碼:
// NetlinkManager內部使用的單例模式
if (!(nm = NetlinkManager::Instance())) {
SLOGE( " Unable to create NetlinkManager ");
exit( 1);
};
// 開始監聽,從服務啟動就一直監聽
if ( nm->start()) {
SLOGE( " Unable to start NetlinkManager (%s) ", strerror(errno));
exit( 1);
}
NetlinkManager的start 函數是實例化了一個NetlinkHandler(繼承關系:NetlinkHandler->NetlinkListener->SocketLinstener),並調用handler 的start方法,如下代碼:
if ( mHandler->start()) {
SLOGE( " Unable to start NetlinkHandler: %s ", strerror(errno));
return - 1;
}
深入NetlinkHandler 的start函數,見代碼:
return this-> startListener();
}
上面有說過NetlinkHandler其實是SocketLinstener的子類,NetlinkHandler直接調用父類的startListener 方法,startListener開啟了一個線程用來執行threadStart函數,代碼太多,貼出主心代碼:
SLOGE( " pthread_create (%s) ", strerror(errno));
return - 1;
}
而threadStart函數則調用了runListener方法,代碼如下:
SocketListener *me = reinterpret_cast<SocketListener *>(obj);
me->runListener();
pthread_exit(NULL);
return NULL;
}
runListener會判斷socket 有無信息可讀,不會阻滯UI,最后調用onDataAvailable函數,代碼:
SocketClientCollection *pendingList = new SocketClientCollection();
//代碼有所省略
}
}
onDataAvailable會處理來自uEvent 的命令,並最終調用onEvent函數,onDataAvailable 位於System/core/libsysutils/src/NetlinkListener.cpp 這個主要處理一些socket方法的知識,一般不用修改。
最后由Netlinklinstener 來解析 ,代碼:
{
int socket = cli->getSocket();
ssize_t count;
count = TEMP_FAILURE_RETRY( uevent_kernel_multicast_recv(socket, mBuffer, sizeof(mBuffer)));
if (count < 0) {
SLOGE( " recvmsg failed (%s) ", strerror(errno));
return false;
}
NetlinkEvent *evt = new NetlinkEvent();
if (!evt->decode(mBuffer, count, mFormat)) {
SLOGE( " Error decoding NetlinkEvent ");
} else {
onEvent(evt);
}
delete evt;
return true;
}
小結
NetlinkManager其實就是用來處理uEvent 命令,並最終發送到vold/NetlinkHandler 的onEvent 。