修改Android中hosts文件的步驟詳解
前言
在開(kāi)發(fā)的時(shí)候我們可能會(huì)需要修改Android的hosts文件。Android的hosts文件路徑是/system/etc/hosts,在修改該文件前首先需要Android手機(jī)獲取root權(quán)限。至于如何root你的手機(jī),這里就不加詳述,可以自行在網(wǎng)絡(luò)上查找,很多也很簡(jiǎn)單。
本文將要闡述的是如何在命令行下通過(guò)adb程序訪問(wèn)root過(guò)的手機(jī),把hosts拖到電腦上修改,然后再?gòu)?fù)制回手機(jī)來(lái)實(shí)現(xiàn)修改hosts的方法。
下面就開(kāi)始具體的步驟:
C:\tools>adb pull /system/etc/hosts hosts.mod [100%] /system/etc/hosts
上面的命令是把手機(jī)上的hosts文件拖到電腦上,[100%]表明文件已經(jīng)傳輸完成,可以修改hosts文件了。在修改完成后就使用以下命令上傳到手機(jī):
C:\tools>adb push hosts.mod /system/etc/hosts adb: error: failed to copy 'hosts.mod' to '/system/etc/hosts': Read-only file system
從回顯的消息可以看到,文件系統(tǒng)是只讀的,所以不能直接上傳。
試試以下的命令看能不能成功?!
C:\tools>adb root # 幫助文檔說(shuō)該命令可以讓adbd守護(hù)進(jìn)程獲得root權(quán)限 C:\tools>adb push hosts.mod /system/etc/hosts adb: error: failed to copy 'hosts.mod' to '/system/etc/hosts': Read-only file system
還是不行,看來(lái)要重新掛載/system目錄才可以。
C:\tools>adb remount remount failed: Operation not permitted
沒(méi)有權(quán)限?這是必須祭起shell大法的節(jié)奏??!
C:\tools>adb shell * daemon not running. starting it now on port 5037 * * daemon started successfully * shell@maguro:/ $ ls -al /system/etc/hosts -rw-r--r-- root root 25 2013-08-14 07:00 hosts
從上面最后一行可以看出hosts這個(gè)文件只有它的擁有者能寫(xiě)入,對(duì)于其他人來(lái)說(shuō)都是只讀的。要想讓其他人也能做修改,必須使用以下命令進(jìn)行提權(quán),再改變hosts文件的屬性才行。
shell@maguro:/ $ su
如果是第一次執(zhí)行這個(gè)命令,手機(jī)會(huì)亮起,SuperSU應(yīng)用會(huì)提示你是否同意權(quán)限的分配。這里當(dāng)然是要同意的!接著你就可以看到終端下的提示符從$變成了#,@前的字符也由shell變成了root。然后我們就可以修改hosts文件的權(quán)限屬性了。
root@maguro:/ # chmod +666 /system/etc/hosts Bad mode root@maguro:/ # chmod 666 /system/etc/hosts Unable to chmod /system/etc/hosts: Read-only file system
又是Read-only file system!輸入以下命令看看/system目錄的文件系統(tǒng)詳情呢。
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...
看到ext4后面的ro了嗎?它是read only的縮寫(xiě),即只讀的意思。這說(shuō)明/system目錄是只讀的。接下來(lái)我們要把它改成可以讀寫(xiě)。
root@maguro:/ # mount -o rw,remount /system
上面的-o用于指定加載文件系統(tǒng)時(shí)的選項(xiàng)。這些選項(xiàng)包括:
- remount 重新加載設(shè)備。通常用于改變?cè)O(shè)備的設(shè)置狀態(tài)。
- ro 以只讀模式加載。
- rw 以可讀寫(xiě)模式加載。
再次查看,可以看到原來(lái)ro的位置已經(jīng)變成rw了。
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime...
不過(guò)到這里我們還不能向手機(jī)拷貝hosts文件,因?yàn)閔osts文件的權(quán)限屬性還沒(méi)被改過(guò),如果強(qiáng)行上傳的話(huà),會(huì)得到如下的錯(cuò)誤消息:
C:\tools>adb push hosts.mod /system/etc/hosts adb: error: failed to copy 'hosts.mod' to '/system/etc/hosts': Permission denied
運(yùn)行以下命令:
root@maguro:/ # chmod 666 /system/etc/hosts
然后查看hosts文件的屬性。
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 25 2013-08-14 07:00 hosts
可以看到所有人都可以讀寫(xiě)hosts文件了。
既然一切都準(zhǔn)備就緒,那就再來(lái)試試上傳修改后的hosts文件吧。
C:\tools>adb push hosts.mod /system/etc/hosts adb: error: failed to copy 'hosts.mod' to '/system/etc/hosts': Read-only file system
怎么回事,為什么還是拷貝失敗呢?不是已經(jīng)把文件系統(tǒng)改為可讀寫(xiě)了嗎?
并且在查找原因的過(guò)程中還發(fā)現(xiàn)一個(gè)奇怪的事情。在root模式下/system目錄是可讀寫(xiě)的,但在shell模式下/system卻是只讀的。
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime... root@maguro:/ # exit shell@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...
而且在手機(jī)上的Terminal Emulator中把/system目錄mount成可讀寫(xiě)之后,在adb shell的root模式下查看/system的狀態(tài)仍然顯示為只讀。
在網(wǎng)上找啊找啊找啊,都快要絕望了,終于找到可能之問(wèn)題所在。就是這個(gè)帖子:mount in shell as user or root with different output。有個(gè)回答提到mount namespace這樣?xùn)|西。然后才知道:
A mount namespace is the set of filesystem mounts that are visible to a process.
每個(gè)進(jìn)程的掛載點(diǎn)對(duì)其它進(jìn)程是不可見(jiàn)的。Terminal Emulator中mount后的掛載點(diǎn)屬于該進(jìn)程,而adb shell中shell模式和root模式的掛載點(diǎn)分別屬于各自的進(jìn)程。這就是前面root模式下修改/system目錄為可讀寫(xiě)后在shell模式下仍顯示為只讀的原因。
知道問(wèn)題的原因了,那如何解決呢?
在SuperSu應(yīng)用的設(shè)置中有個(gè)mount namespace separation的選項(xiàng),如下圖所示:
把勾選取消,然后mount的掛載點(diǎn)就是全局性的了,不再為mount它們的進(jìn)程所獨(dú)有。不過(guò)要記住的是,只有在重啟手機(jī)后該修改才有效。
下面是取消mount namespace separation后在上傳的結(jié)果:
C:\tools>adb push hosts.mod /system/etc/hosts [100%] /system/etc/hosts
可以看到[100%]的回顯,說(shuō)明文件已經(jīng)上傳完成。
查看hosts文件的屬性:
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 137679 2017-02-16 00:20 hosts
文件的大小已經(jīng)由25變成137679,說(shuō)明文件已經(jīng)替換完成。
下面就是恢復(fù)手機(jī)到原先的狀態(tài):
root@maguro:/ # chmod 644 /system/etc/hosts root@maguro:/ # ls -al /system/etc/hosts -rw-r--r-- root root 137679 2017-02-16 00:20 hosts root@maguro:/ # mount -o ro,remount /system
至此,修改hosts文件的工作就算大功告成。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
Android實(shí)現(xiàn)圖片輪播切換實(shí)例代碼
利用Android的ViewFlipper和AnimationUtils實(shí)現(xiàn)圖片帶有動(dòng)畫(huà)的輪播切換,其中當(dāng)點(diǎn)擊“上一張”圖片時(shí),切換到上一張圖片;當(dāng)點(diǎn)擊“下一張”圖片時(shí),切換到下一張圖片,本文給大家介紹Android實(shí)現(xiàn)圖片輪播切換實(shí)例代碼,需要的朋友參考下2015-12-12Flutter 全局點(diǎn)擊空白處隱藏鍵盤(pán)實(shí)戰(zhàn)
這篇文章主要介紹了Flutter 全局點(diǎn)擊空白處隱藏鍵盤(pán)實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09android view轉(zhuǎn)Bitmap生成截圖的方法
這篇文章主要介紹了android view轉(zhuǎn)Bitmap生成截圖的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Android Studio設(shè)置、改變字體和主題的方法
這篇文章主要介紹了Android Studio設(shè)置、改變字體和主題的方法,需要的朋友可以參考下2018-03-03Android媒體開(kāi)發(fā)之音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了Android媒體開(kāi)發(fā)之音樂(lè)播放器,播放SD卡中的音樂(lè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android?懸浮按鈕之實(shí)現(xiàn)兔兔按鈕示例
這篇文章主要為大家介紹了Android?懸浮按鈕之實(shí)現(xiàn)兔兔按鈕示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Android自定義view實(shí)現(xiàn)阻尼效果的加載動(dòng)畫(huà)
這篇文章主要介紹了Android自定義view實(shí)現(xiàn)阻尼效果的加載動(dòng)畫(huà)的相關(guān)資料,非常不錯(cuò),具有一定的參考借鑒加載,需要的朋友可以參考下2016-11-11實(shí)例分析Android中HandlerThread線程用法
本篇文章主要給大家介紹了Android HandlerThread使用介紹以及源碼解析,有需要的朋友參考學(xué)習(xí)下吧。2017-12-12