Перенаправление HTTP запросов с эмулятора Android на локальный компьютер
Занимаясь разработкой сетевых игр под Android столкнулся с такой проблемой - эмулятор андройда ни как не хочет воспринимать hosts локального компьютера, то есть, к примеру, перенаправить запросы с эмулятора на домен example.com на свой локальный web-сервер не получается через hosts-файл.
В интернете находил несколько вариантов решения проблемы: прописать переназначение адреса в hosts файл эмулятора, поменять записи в базе данных эмулятора через шел и т.п. Все испробованные варианты не приводили ни к чему - программа в эмуляторе упорно лезла в интернет (по-правде говоря, некторые из способов срабатывали, но только для Android-браузера, что меня ни как не устраивало).
После нескольких дней мучений пришел к решению описанному ниже.
Эмулятор андройда не использует системный файл hosts, о чем явно написано в мануале (http://developer.android.com/guide/developing/tools/emulator.html#emulatornetworking):
On Windows, the emulator obtains the addresses by calling the GetNetworkParams() API. Note that this usually means that the emulator <b>ignores</b> the content of your "hosts" file (/etc/hosts on Linux/OS X, %WINDOWS%/system32/HOSTS on Windows)
Не хочет - не надо, идем другим путем, который подсказан там же в мануале. По умолчанию эмулятор проверяет определенные IP адреса при старте, в нашем случае интересны адреса 10.0.2.3-6:
10.0.2.3 First DNS server 10.0.2.4 / 10.0.2.5 / 10.0.2.6 Optional second, third and fourth DNS server (if any)
то есть это адреса, где эмулятор при запуске ищет DNS сервера. То что нам и надо - мы сможем подменить системный ДНС на свой и направить Android эмулятор туда куда нам нужно.
Выполняем следующие шаги.
1) Устанавливаем «адаптер Майкрософт замыкания на себя», проще говоря виртуальный сетевой интерфейс по инструкции на странице http://support.microsoft.com/kb/839013
2) Меняем его настройки TCP/IP на следующие:
IP address: 10.0.2.3 Subnet mask: 255.0.0.0 Default gateway: берем из настроек физического сетевого интерфейса на локальной машине DNS servers: берем из настроек физического сетевого интерфейса на текущей машине (не обязательно, но это должно исключить обращение на наш DNS сервер запросов не из эмулятора)
3) Ставим DNS сервер, я ставил smallhttpd (http://smallsrv.com/), но на его установщик временами ругался антиврус, что там кейлогер, хотя на установленные файлы он не ругался. Выбор за вами, далее я буду описывать относительно smallhttpd.
4) Настраиваем разименовывание адресов в DNS сервере. Пример для smallhttpd:
Создаем файл hosts в каталоге, где установлен сервер, следующего содержания:
10.13.1.5 example.com # указываем другие адреса если необходимо #... # следующие строки нужны для использования основного ДНС сервера, # чтобы правильно разыменовывались все остальные запросы . IN NS a.root-servers.net a.root-servers.net IN A 10.13.0.3
где 10.13.1.5 – это ваш реальный локальный IP адрес, использовать 127.0.0.1 нельзя, т.к. эмулятор такой IP адрес воcпримет как локальный для самого себя и HTTP запросы вообще ни куда не уйдут.
example.com - адрес сайта, с которым мы хотим работать локально.
10.13.0.3 – адрес ДНС сервера который используется на компьютере, если не знаете какой адрес используется вместо
. IN NS a.root-servers.net a.root-servers.net IN A 10.13.0.3
можете указать список корневых ДНС серверов:
. IN NS a.root-servers.net a.root-servers.net IN A 198.41.0.4 . IN NS b.root-servers.net b.root-servers.net IN A 128.9.0.107 . IN NS c.root-servers.net c.root-servers.net IN A 192.33.4.12 . IN NS d.root-servers.net d.root-servers.net IN A 128.8.10.90 . IN NS e.root-servers.net e.root-servers.net IN A 192.203.230.10 . IN NS f.root-servers.net f.root-servers.net IN A 192.5.5.241 . IN NS g.root-servers.net g.root-servers.net IN A 192.112.36.4 . IN NS h.root-servers.net h.root-servers.net IN A 128.63.2.53
5) Запускаем smallhttpd сервер, открываем настройки, в меню выбираем в меню пункт DNS и меняем настройки:
-Убираем галку Disable DNS server
-Выбираем созданный хост файл
-Убираем галку Disable recursion
-Отмечаем Bind to all address (либо можно указать ip виртуального интерфейса 10.0.2.3)
- остальные параметры по умолчанию
Пример настроек:

Нажимаем в меню OK, перезапускаем сервер через контекстное меню в трее.
В окне лога должно появится сообщение вида:
DNS is enable. 2 hosts now are loaded.
Вместо значения 2 может быть другое число в зависимости от содержания файла hosts.
6) Запускаем эмулятор. Запускаем в эмуляторе браузер, пробуем зайти на example.com (не забываем что локальный вебсервер должен быть настроен на использование этого адреса). Если всё открылось и в окне лога сервера появилось сообщение вида
!->07/05 13:03:17 [10.13.1.5:2432>53] (t0 8) >example.com A(1)
значит всё работает, пробуем тестировать программу, которую нужно было направить на локальный веб-сайт.
Как всегда - вопросы и предложения приветствуются.
Комментарии
iKpPTO , [url=http://syfbmimobitw.com/]syfbmimobitw[/url], [link=http://dvlsknbvdhen.com/]dvlsknbvdhen[/link], http://nrkiwcqzhnus.com/
L9xbsA uakcvagnfxua
stkq5n , [url=http://seetyrqwvrez.com/]seetyrqwvrez[/url], [link=http://qjbnehngjbak.com/]qjbnehngjbak[/link], http://rxrlryierigq.com/
Отправить комментарий