Android手機虛擬CD-ROM製作大概流程 && 使用網路同步時間(NITZ和NTP)

來源:互聯網
上載者:User

        很多時候,我們將手機接入電腦後,會發現一個CR-ROM光碟機類似的盤符,裡面有手機附帶的內容。做法是這樣的:

(1)增加手機分區

通過調整bootloader(傳參給kernel)或kernel的mtd partition table。增加一個分區,專門存放CDROM鏡像。

(2)製作CDROM鏡像並燒寫到該分區

將光碟機的內容拷貝入一個linux目錄,用mkisofs -r -o cdrom.iso /your-cdrom-dir建立鏡像,通過廠家提供的燒寫工具進行燒寫手機。
(3)開發usb gadget支援
a,源碼支援
kernel預設提供了drivers/usb/gadget/f_mass_storage.c以支援mass storage(磁碟或CDROM),android修改了f_mass_storage.c來支援其掛載sdcard為mass storage,其中f_mass_storage.c註冊了一堆虛擬卷lun0-lunX,每個虛擬卷都設定為了普通的DISK。android只使用lun0來掛載sdcard到PC,比較直接的將mass storage初始化直接添加到了這個檔案裡。如要要支援CDROM,需要手工為其中某個lun設定cdrom
flag(比如lun1),參考該檔案中的fsg_probe函數設定lun屬性的行。

#ifdef SUPPORT_CDROM_BLOCKif(i == 1)fsg_cfg.luns[i].cdrom = 1;#endif

b,使用者層控制
在system\vold目錄下的VolumeManager.cpp,android通過vold來控制mass storage的mount到裝置和share到PC,原理就是操作mass storage gadget運行起來後的控制節點/sys/devices/platform/usb_mass_storage。需要設定其中的enable為1,然後lun0下的file指向需要share的裝置節點。假設增加的分區為/dev/block/mtdblock14,則直接填寫該節點到file檔案中即可。

if( mUsbConnected ) {    char nodepath[255];memset(nodepath,0 ,255);snprintf(nodepath,            sizeof(nodepath), "/dev/block/mtdblock14");        LOGD(" name = usb_configuration");    int fd2;    if ((fd2 = open("/sys/devices/platform/usb_mass_storage/lun1/file",                   O_WRONLY)) < 0) {        LOGE("Unable to open ums lunfile (%s)", strerror(errno));        return ;    }    if (write(fd2, nodepath, strlen(nodepath)) < 0) {        LOGE("Unable to write to ums lunfile (%s)", strerror(errno));        close(fd2);        return ;    }    close(fd2);}else{ int fd2; char ch = 0;  LOGD(" name = usb_configuration remove ");    if ((fd2 = open("/sys/devices/platform/usb_mass_storage/lun1/file",                   O_WRONLY)) < 0) {        SLOGE("Unable to open ums lunfile (%s)", strerror(errno));        return ;    }     if (write(fd2, &ch, 1) < 0) {        SLOGE("Unable to write to ums lunfile (%s)", strerror(errno));        close(fd2);        return ;    }    close(fd2);}

 

(4)之後,就可以直接在XP中看到掛載的CD-ROM了。基本流程如此,其他還有很多細節,比如光碟片要有aurorun來運行預設執行檔案,如何同時相容adb支援但又可以預設彈出光碟機等等。

================================================================================================================

        在android 4.0版本上,通過網路同步時間有兩種方式:NITZ和NTP,它們使用的條件不同,可以擷取的資訊也不一樣;勾選這個功能後,手機首先會嘗試NITZ方式,若擷取時間失敗,則使用NTP方式
(1)NITZ(network identity and time zone)同步時間
        NITZ是一種GSM/WCDMA基地台方式,必須插入SIM卡,且需要operator支援;可以提供時間和時區資訊。中國大陸電訊廠商基本是不支援的。
(3)NTP(network time protocol)同步時間
        NTP在無SIM卡或operator不支援NITZ時使用,單純通過網路(GPRS/WIFI)擷取時間,只提供時間資訊,沒有時區資訊(因此在不支援NITZ的地區,自動擷取時區功能實際上是無效的)。NTP還有一種緩衝機制:當前成功擷取的時間會儲存下來,當使用者下次開啟自動更新時間功能時會結合手機clock來進行時間更新。這也是沒有任何網路時手機卻能自動更新時間的原因。此外,因為NTP是通過對時的server擷取時間,當同步時間失敗時,可以檢查一下對時的server是否有效,並替換為其他server試一下。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.