廣東石油化工學院 馬遠佳
我們知道,Android的設計中,SD卡是非常重要的。有些APK在運行中需要SD卡來存儲數(shù)據(jù),而有些大型游戲需要大量的SD卡空間這樣如果系統(tǒng)沒有接入SD卡,某些APK就會碰到安裝或運行的問題。但是目前的趨勢是,手機內(nèi)部存儲空間越來越大,對于很多人來說,如果不需要安裝大型軟件或游戲數(shù)據(jù)包,僅僅是安裝普通軟件,這些空間已經(jīng)綽綽有余,但是很多程序如拍照、下載等又必須放到外置SD卡上,而不能放到內(nèi)部存儲中,為了使用這些功能,就必須裝一個沒有太多用處的SD卡,實在是有點浪費。所以要想辦法把內(nèi)置空間用起來,現(xiàn)在主流的做法是怎樣的呢?
三星、聯(lián)想的方案是這樣的:把內(nèi)部flash裝載為SDcard,然后把外部SD卡裝載到/mnt/SDcard/下面的某個子目錄。這種做法的優(yōu)點是可以有一個一直存在的SD卡,缺點是內(nèi)置flash要足夠大,mediascanner中要增加/mnt/SDcard/externalSDcard的掃描、裝載卸載處理,而APK是沒有機會安裝到實際的外置SD卡上的。
另一種方案是在沒有SD卡插入時把內(nèi)部flash卡除了安裝系統(tǒng)、app和數(shù)據(jù)之外的剩余空間獨立做成一個分區(qū),然后用這個分區(qū)來模擬SD卡,這就是網(wǎng)上常見的所謂內(nèi)置SD卡和外置SD卡。而在SD卡插入時把實際SD卡重新裝載到mnt/SDcard。此時,實際上對于系統(tǒng)應用和app來說,只有內(nèi)置SD卡即虛擬SD卡才是真正的SD卡。這種做法的優(yōu)點是SD卡插入時APK會安裝到實際SD卡上,可以把flash上的某個目錄作為虛擬SD卡,比較靈活。缺點是因為內(nèi)置SD卡所對應的路徑是默認的SD卡路徑,對于應用程序來說是可見的,而外置SD卡只能當作額外存儲來用,應用程序基本用不上,而且安裝到虛擬SD卡上的APK在第二個SD卡插入時消失所以才出現(xiàn)了為了擴大內(nèi)置SD卡空間而把內(nèi)置、外置SD卡進行交換的各種破解方案。
以上兩種方案都有各自的缺陷,如果能像PC機上的虛擬光驅(qū)那樣,使得只用內(nèi)部存儲空間就可以模擬出一個SD卡,在無需插入外置SD卡的情況下,就能讓所有app都認為已經(jīng)有SD卡而能正常運行,而且這個方法還應當盡量簡單,最好不需要刷機,因為root對于多數(shù)人來說還不算太難,也就是下載一個應用運行一下的問題,但刷機畢竟風險較大,對于多數(shù)人來說還是有點顧慮的。
下面的方案,可以解決虛擬SD卡的絕大部分問題,且無需刷機,無需修改內(nèi)核映像文件和啟動ramdisk,只需修改一些文件、增加幾個腳本即可,可以實現(xiàn)開機自啟動,而且虛擬SD卡中的空閑部分也不占用data分區(qū)的實際空間。虛擬SD卡還有另一個額外好處,就是省電,畢竟讀寫外置SD卡還是要費一點電的。能夠支持U盤模式。而且還更進了一步,能夠支持雙重加載,手機和pc能同時訪問虛擬SD卡,對于用戶和應用程序來說,虛擬SD卡與外置SD卡完全沒有區(qū)別了。額外的,本方案可以支持三重掛載,在使用手機助手等調(diào)試工具的同時,還可以實現(xiàn)U盤模式。
現(xiàn)在說一下詳細步驟,其實非常簡單,只需要執(zhí)行一下一個安裝腳本即可,然后就萬事大吉了。下載地址http∶//url.cn/NXPVqz。本人的手機是長虹zme,所以腳本也是基于zme寫的,后面會講怎么樣移植到其他手機。
先說一下前提要求,手機必須是已經(jīng)root了的,假定玩家已經(jīng)掌握了root、授權等基本概念和操作,busybox已經(jīng)安裝好,也已經(jīng)安裝并懂得使用RE管理器,如果能懂得一些linux和adb命令那就更好,可以自己去琢磨、試驗。另外,玩家應事先備份system/bin/vold和/system/etc/vold.fstab這兩個文件,因為如果多次執(zhí)行安裝腳本可能造成原始文件被覆蓋。
具體安裝方法是,創(chuàng)建目錄/data/fake-SD,設置權限為全選即所有人可讀寫,把附件中的幾個文件拷貝到/data/fake-SD下面(注意需要修改所有腳本文件的權限為全部可執(zhí)行,否則不成功,另外安裝腳本中用的都是絕對路徑,如果想換個路徑,修改一下腳本即可),拷貝過程可能需要外置SD卡作為中介,或者用騰訊手機助手直接上傳到手機內(nèi)存,然后用RE管理器進入該目錄,執(zhí)行其中的install-fake-SD.sh腳本即可(注意修改權限)。執(zhí)行完后立即生效,無需重啟動。
以后的使用過程中,執(zhí)行switch-tofake-SD.sh就會切換到虛擬的內(nèi)置SD卡,如果想使用外置SD卡,就執(zhí)行switch-toreal-SD.sh,執(zhí)行完后都是立即生效,無需重啟動。
目前方案的效果很不錯,可以支持三重掛載,即在打開usb調(diào)試的情況下還能做到同時支持U盤模式和手機訪問SD卡,這個對于虛擬內(nèi)置SD卡和外置SD卡都支持。另外插入數(shù)據(jù)線時不會再出現(xiàn)提示畫面,自動進入U盤模式。如果使用中出現(xiàn)usb線插拔之后虛擬SD卡掛載不上等等問題,再用RE管理器執(zhí)行一遍自啟動腳本system/etc/intallrecovery.sh往往就能解決。如果還是不行,那就重啟動機器。
而auto-start-fake-SD.sh和autostart-real-SD.sh是安裝和切換時要被拷貝到/system/etc下面的自啟動腳本,分別對應使用虛擬內(nèi)置SD卡和外置SD卡的情況,這個自啟動腳本將會被改名為system/etc/intall-recovery.sh(之所以用這個文件名,是因為這個文件并不存在,但系統(tǒng)啟動時將會自動查找并執(zhí)行有該名字的腳本,而其它.rc自啟動文件都在根目錄,如果要修改的話就需要修改boot映像文件,需要刷機太麻煩,而system/etc是可寫的,所以只是利用這個系統(tǒng)啟動自動執(zhí)行功能而已,并非真要安裝什么recovery。其實這也算是個小竅門,可以利用它來執(zhí)行一些其它需要在系統(tǒng)啟動時自啟動的功能)。
在正常使用虛擬SD卡之后,最好不要再去執(zhí)行安裝腳本install-fake-SD.sh了,因為安裝過程中它會刪除原來的虛擬映像文件,造成數(shù)據(jù)丟失。/data/fake-SD/SD.bin映像文件和data/fake-SD目錄要小心,千萬不要誤刪了。
最后談一下移植到其他機器的方法。如果想要在其它機型上使用,必須修改以下幾項內(nèi)容:vold.fstab.real-SD文件中的設備路徑、每個腳本文件開頭的關于設備名稱和路徑的定義、system分區(qū)的設備名和文件系統(tǒng)類型、映像文件的路徑、名稱和大小。下面以中興v880為例。雖然V880內(nèi)置空間很小,但筆者的V880是給家里老人用,只需要電話短信和照相功能就足夠,因此額外配一張SD卡還是顯得有些浪費,因此想虛擬一個80M的SD卡,也能夠存幾百張照片了。
下面來說明怎樣針對自己的機型修改腳本文件。這里最好需要用到UltraEdit,方便編輯腳本文件。首先將vold.fstab.real-SD文件中的dev_mount sdcard/mnt/sdcard auto/devices/platform/msm_sdcc.4/mmc_host替換,具體的設備名稱路徑在sys/devices/platform里面找到,v880對應的設備路徑改為dev_mount sdcard/mnt/sdcard auto/devices/platform/msm_sdcc.1/mmc_host/mmc0
然后將每個腳本文件中的設備名和路徑都修改一遍,這里主要修改:
(1)大容量存儲設備文件字段ums_dev,具體在/sys/devices/platform/找到lun0/file,然后填寫相應的路徑到ums_dev的等號后。
(2)真實SD卡設備字段real_sd_dev,具體在/dev/block/里面找到mmcblk0p1文件的相應路徑填入。SD/MMC的驅(qū)動通用,進一步的,Linux的設備節(jié)點就延續(xù)了MMC的這個名字,后面的blk是塊設備這個英文的簡寫,mmcblk也就是“mmc/sd塊設備”,0就是這個mmc/sd設備的順序編號,p1就是第一個分區(qū)。如果有多個mmcblk就只能根據(jù)名稱一個個試了。
(3)如果想修改虛擬SD卡的大小,只需要修改install-fake-SD.sh中的fake_SD_img_sparse_seek參數(shù)即可,這個參數(shù)是以塊大小為單位的,而塊大小我用的是2K,因此fake_SD_img_sparse_seek=1048576就相當于2G,如果想更改內(nèi)置虛擬SD卡大小就修改這個參數(shù)即可,修改塊大小也可以。經(jīng)試驗,2k的塊大小的速度是比較快的,因此不建議修改塊大小,只修改seek數(shù)就行。80M對應的seek=40960(80M×1024K÷2K)。
(4)虛擬SD卡的路徑如果放在/data下就不用改,如果放到自定義的目錄下就修改為相應的路徑。
需要注意的是,如果選擇預占用空間完整文件的方法,執(zhí)行安裝腳本的時候就會當場生成一個2G的大文件,這個過程很漫長,估計會接近10分鐘,因此建議開始做試驗的時候還是用缺省的稀疏文件方法,初始大小基本為0,生成速度快,便于反復試驗。
再次提醒每次改動文件后都要記得修改權限之后才能執(zhí)行成功。至此,已經(jīng)完成了的虛擬SD卡腳本的移植,怎么樣?快來試試充分利用上你的手機空間吧!