Перенаправление 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)
- остальные параметры по умолчанию
Пример настроек:
android-smallhttpd.jpg

Нажимаем в меню 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)

значит всё работает, пробуем тестировать программу, которую нужно было направить на локальный веб-сайт.

Как всегда - вопросы и предложения приветствуются.

Комментарии

Отправить комментарий

  • Доступны HTML теги: <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Search Engines will index and follow ONLY links to allowed domains.

Подробнее о форматировании

Введите решение задачи