Android 5.x系统nfs挂载系统启动记录 nfs挂载文件记录
應(yīng)該有不少開發(fā)Android系統(tǒng)的人有這樣的感覺,修改好了hal或者jni后,編譯,驗證的時候需要把編譯的文件發(fā)到機器上去,那么發(fā)送的時候使用什么方式,應(yīng)該是adb吧,我也是使用該方法。可是實際使用的時候是很煩心的,比如,adb有時候的識別問題,這次發(fā)送成功了下次可能就出點毛病,再搗鼓搗鼓,幾分鐘過去了,程序還沒驗證,毫無效率;還比如識別還好,在一次發(fā)送過程中識別的速度也并不快,如果驗證的文件需要重啟機器,那么下次發(fā)送還是需要慢的識別。總之調(diào)試起來不是很舒服。不知道大神是怎么玩這個的,如果有好的方法,告訴我一下。
于是為了方便的調(diào)試編譯結(jié)果,就想使用nfs方式掛載Android系統(tǒng),這樣就不需要往機器上頻繁的發(fā)送文件了。想法是美好的,現(xiàn)實是骨感的。
思路上是可以的,可是問題是,Android使用nfs怎么跑起來呢。
網(wǎng)上搜索了很多的資料,大多都是一個意思,在out的板級目錄下,找到rootfs和system組合成文件系統(tǒng)目錄,然后放到建立的nfs文件下,在Android開發(fā)板上設(shè)置u-boot的啟動環(huán)境,來掛載nfs。思路上沒問題,然而這樣的思路只是在跑Linux的過程中有用,開始啟動Android的時候就掛了,網(wǎng)絡(luò)中斷。
下面是我使用的環(huán)境設(shè)置:
setenv bootargs root=/dev/nfs console=ttyAMA0,115200 androidboot.hardware=s5p4418_realv1c androidboot.console=ttyAMA0 androidboot.serialno=0123456789abcdef init=/init nfsroot=172.16.24.7:/wsh-space/nfsboot/4418/android/system ip=172.16.24.6:172.16.24.7:172.16.24.254:255.255.255.0::eth0:oninit.rc文件內(nèi)容需要注釋掉下面 # once everything is setup, no need to modify /#mount rootfs rootfs / ro remount注意在init.rc文件中務(wù)必確定有下面兩句,一般在on boot下:
class_start core #star core class class_start main #star main class這兩個是用來表示啟動的類型,每一個服務(wù)下都有一個class字段,后邊跟的就是類型,一般為core、main。如下: service vold /system/bin/voldclass coresocket vold stream 0660 root mountioprio be 2service netd /system/bin/netdclass mainsocket netd stream 0660 root systemsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inet
做了上面的修改后理論上應(yīng)該可以掛載了,可是實際上是不行的,前面也說了,走Linux啟動部分時掛載正常無問題,可是走到Android啟動各種服務(wù)后就掛掉了,網(wǎng)絡(luò)失去聯(lián)系。經(jīng)過各種跟蹤排查(接觸的不夠深刻,開始不知道從哪里查起,走了不少的彎路),總算是定位到問題所在了,是netd服務(wù)的問題。
找到netd服務(wù)很不容易,走了很多的彎路,不過也值得,認(rèn)識的更多了。
在查找的時候有個問題,怎么查看Android系統(tǒng)的日志,也就是想看Android啟動的log,進而查看死在了什么地方,由于Android系統(tǒng)未啟動,在啟動過程中卡主了,那么logcat命令也就無法輸入了,怎么辦呢。于是想使用重定位的功能,把log輸出到文件,可是行不通,因為讀取的main日志為空,不知道為什么,可能是外部獨立的進程無法讀取。這個行不通就想使用往文件寫入數(shù)據(jù)來代替log,也就是使用open、read、write函數(shù)實現(xiàn)的,這個方法確實可以,可以得到想要的輸出,但是需要修改源碼不少,目前還不想這么整,因為偶然想到了另外的方法,不過該方法在其他都不可使用時用來調(diào)試jni和hal(僅限系統(tǒng)無法啟動的過程,能夠啟動就不需要了)還是可以的,很笨的方法。
那么偶然想到的方法是什么呢。Linux系統(tǒng)啟動部分nfs掛載是沒問題的,在加載Android庫和虛擬機的時候會有一個時間差,大概有幾秒的時間吧,應(yīng)該不超過五秒,這個時候是可以接受終端輸入的命令的,這時候手動或者直接粘貼的方式,輸入logcat命令就可以打印log信息了,即使是卡主也不會影響日志的輸出了。試了一下果然可以,嘿嘿。
隨著系統(tǒng)的啟動發(fā)現(xiàn)啟動netd服務(wù)后Android的nfs就掛掉了,看來是netd服務(wù)修改了Linux的網(wǎng)絡(luò)數(shù)據(jù),導(dǎo)致ip等信息改變,進而使網(wǎng)絡(luò)中斷,無法進行系統(tǒng)的掛載。
既然這樣那么試試不讓netd啟動,看看結(jié)果是什么,做如下修改:
service netd /system/bin/netd#class mainsocket netd stream 0660 root systemsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inet注釋掉class main那一行,重啟后發(fā)現(xiàn)可以過了,而且進入了Android啟動的界面,在更新app,當(dāng)然了,沒有netd服務(wù)Android系統(tǒng)是無法啟動的,因為網(wǎng)絡(luò)的相關(guān)服務(wù)netd是必須的,Android系統(tǒng)就卡在了更新完app狀態(tài)下,打印logcat,日志提示網(wǎng)絡(luò)服務(wù)的相關(guān)問題,再次以失敗告終。
離目標(biāo)很近了,看來是需要修改netd的源碼了,不過沒精力搞了,以后再研究吧。
需要補充一下,如果可以實現(xiàn)了應(yīng)該還需要做如下的工作:
在調(diào)試過程中為了保證Android啟動后網(wǎng)絡(luò)就是打開的,修改了源碼EthernetServiceImpl.java(路徑/frameworks/opt/net/ethernet/java/com/android/server/ethernet)中的star函數(shù),添加了下面的一行,來默認(rèn)開啟以太網(wǎng):
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ETHERNET_ON,EthernetManager.ETH_STATE_ENABLED);另外還需要一個配置文件ipconfig.txt,路徑為data/misc/ethernet/ipconfig.txt,該文件用來設(shè)置Android啟動后為靜態(tài)IP,讓其與u-boot中的IP一致。 ipconfig.txt文件的獲得方法就不多說了,可以按照源碼的格式寫一個出來(源碼位置frameworks/base/services/core/java/com/android/server/net/IpConfigStore.java),函數(shù)是readIpAndProxyConfigurations。也可以在Android系統(tǒng)中設(shè)置為靜態(tài)保存,然后把文件拷貝出來。以上為nfs掛載的記錄,有了解的朋友可以一起交流。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面為另外一種相對來說調(diào)試方便的方法。應(yīng)該可以對以太網(wǎng)和wifi網(wǎng)絡(luò)都有效,我只使用了以太網(wǎng)方式。
該方法是使用nfs掛載PC上的一個目錄,把編譯的文件復(fù)制到pc的nfs目錄,在開發(fā)板上再執(zhí)行一個復(fù)制命令拷貝到指定位置即可完成傳輸,相對使用adb應(yīng)該快一些,但是弊端是網(wǎng)絡(luò)換得好,以及支持局域網(wǎng),也就是需要有wifi或者以太網(wǎng)。
在使用nfs之前我們需要一個工具,就是busybox,原因是Android自帶的mount工具是閹割版,功能不全,nfs的文件系統(tǒng)無法掛載,所以只能使用busybox工具來實現(xiàn)了,busybox自帶mount命令和umount命令。把busybox通過adb方式push到/system/xbin目錄下,并修改為777權(quán)限,保證可執(zhí)行。
掛載的命令如下,注意在執(zhí)行下面命令前確保網(wǎng)絡(luò)是通的。
busybox mount -t nfs -o nolock 172.16.24.7:/work-space/nfsboot/4418/android/workspace_nfs /data/work其中/data/work為開發(fā)板上的目錄,可以自由設(shè)置,不過最好在data目錄下,避免因為權(quán)限引起的問題。這樣在開發(fā)板操作/data/work目錄即是在操作PC上的目錄,拷貝文件什么的就很方便了。也無需USB連接的需要,沒有識別不穩(wěn)定的問題了。
為了掛載和卸載方便,可以做成.sh腳本的形式,比如:
my_mount.sh
#!/bin/sh busybox mount -t nfs -o nolock 172.16.24.7:/work-space/nfsboot/4418/android/workspace_nfs /data/work</span>my_umount.sh#!/bin/sh busybox umount /data/work把這兩個文件放到/system/xbin目錄下即可直接調(diào)用了,更加方便,對于調(diào)試的庫文件,也可以寫成腳本的形式,編譯完直接執(zhí)行腳本即可完成傳輸。
記錄完畢。
總結(jié)
以上是生活随笔為你收集整理的Android 5.x系统nfs挂载系统启动记录 nfs挂载文件记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 编译环境的依赖库安装
- 下一篇: android sina oauth2.