9 Mar 2010, 11:46am
Android
by lachesis

4 comments

[筆記]讓Android emulator連intranet

先說明,這算是某種特殊情況,一般Android開發者不見得會遇到同樣情形。總之在公司內部使用Android emu時,打開browser可以使用內部IP連上內部網站,但如果是使用domain name就會失敗,說是無法解析DN。試過使用官方說明的emulator下 -dns-server參數,但直接就在開模擬器時收到無法解析的錯誤了,當然browser一樣不認得內部網站的名稱。強者小Y同事建議改 hosts 檔看看,不過會得到 "failed to copy 'hosts' to '/system/etc/hosts': Read-only file system" 這樣的訊息。找到一篇blog文章提供的解法:Configure hosts File in Android。一開始嘗試是失敗的,後來小Y大人又給了些建議之後成功了。事實上,直接參考該文的做法對 Android 1.5, 1.6 的模擬器都是有效的,但偏偏我剛好正在用來測的是2.1。直接把作法寫在下面:

[通用部分]
如果開了一個以上的模擬器的話請自行加adb參數
0a. 先adb pull /system/etc/hosts hosts抓回local來修改。
0b. 在原本的 127.0.0.1 localhost 加上新的行,寫入你需要的對應如 192.168.1.15 mytestsite,存檔。
1. adb remount (才不會發生Read-only file system錯誤)
2. adb push hosts /system/etc/hosts

[2.0.1, 2.1 only]
這兩個版本會在這邊丟出錯誤訊息,分別為
failed to copy 'hosts' to '/system/etc/hosts': No space left on device
failed to copy 'hosts' to '/system/etc/hosts': Out of memory
解決方法是,開啟模擬器時不要直接從 AVD Manager介面開,請下指令:
$ emulator -avd youravdname -partition-size 128
接著再對這個模擬器使用上面的 hosts修改大法就不會出現錯誤了。

partition size的單位是MB,預設似乎是64。從adb shell 用 df 指令觀察的結果,/system 和 /data 都會被這個設定成這邊指定的值。而1.5, 1.6 的 image 因為剛好沒超過 64MB,還剩下一點空間,所以 hosts 還寫得進去,而 2.x 的 image 有 七萬多K,mount之後 /system 這個 partition 看起來就是全滿,剩下空間 0K。因此 hosts變肥後無法寫入,真的是因為partition爆了。事實上正常的手機確實也不需要留空間給user hack…模擬器還讓我們調參數已經很偷笑了,可惜AVD Manager 的 Start 沒地方可以設定 partition size。若有此需求的話只好麻煩一點手動下指定開emulator囉。

謝謝,解決了我的問題.

HI 想請問一下 我把東西adb push進emulator以後再重啟 他會回復到原本的檔案 請問有什麼辦法可以讓他記憶曾經adb push過的內容嗎??

如果你是指上面說的 /etc/hosts 那麼答案是不行。
官方文件說:
Temporary Images
The emulator creates two writeable images at startup that it deletes at device power-off. The images are:
* A writable copy of the Android system image
* The /cache partition image
The emulator does not permit renaming the temporary system image or persisting it at device power-off.
因為hosts是系統檔, 關機一定會殺掉。其他adb push到 /sdcard下面或是/data下面的檔案應該都會直接保留才是。

This method solved my problem, thanks!

 
*name

*e-mail

web site

leave a comment