AVD и локальный веб-сервер

Думаю, большинству мобильных разработчиков под андроид известно, что эмулятор андроида не умеет подхватывать записи из hosts файла ОС, т.е. делать запросы к локальному веб-серверу из эмулятора просто так не получится. Недолгий поиск приводит к нескольким аналогичным решениям, в которых описано, как можно отредактировать hosts файл эмулятора. Вводим несколько команд в командную строку (все используемые программы входят в состав Android SDK) сохраняем файл hosts к себе, редактируем и заливаем обратно. PS. вместо обычного 127.0.0.1 mysite.com нужно писать 10.0.2.2 mysite.com, так как эмулятор работает изолированно и 127.0.0.1 — его внутренний адрес, никак не связанный с аналогичным адресом вашего компьютера (подробнее об этом здесь).

Решение всем хорошо, и даже работает. Только после каждой перезагрузки/падения эмулятора эти действия придется повторить(. Таким образом оно нам, мягко говоря, не очень подходит. Оказывается, потери этих изменений можно избежать, если внести эти изменения в образ ОС Андроид. Данное решение похоже на предыдущее, за исключением того, что сначала нужно скопировать образ системы system.img из папки с SDK в папку с вашим avd и запустить эмулятор в режиме записи. Остальные действия идентичны первому решению. Стало гораздо лучше, но при каждом добавлении нового хоста или создании нового avd придется повторять все снова, плюс ко всему system.img весит более 150 mb.

Так как эмулятор андроида позволяет при запуске указать адрес dns сервера, этим мы и воспользуемся. Нужно установить и настроить локальный dns сервис. В качестве локального web-сервера я использую OpenServer, то скачивать и устанавливать дополнительный софт не пришлось, так как в состав OpenServer входят два dns модуля Bind и Unbound. Включив второй модуль, перезапустив OpenServer и добавив в опциях avd -dns-server 127.0.0.1, я запустил эмулятор в надежде, что все заработает. Но надежда не оправдалась(. Судя по логам dns-сервера, все работало, и IP адрес отдавался правильно, но в эмуляторе все равно была ошибка. После некоторых танцев с бубнами, выяснилось, что ничего не работает из-за того, что 127.0.0.1, как уже писалось выше, это внутренний адрес эмулятора. Таким образом, чтобы все заработало, нужно, что бы dns сервер выдавал 10.0.2.2 вместо него. Идем в конфигурационный файл Unbound сервера в моей версии это Unbound-1.4_zone.conf и добавляем строку наподобие этой:

local-data: «%domain%. %ttl% IN A 10.0.2.2»

или, если у вас конкретный хост, то:

local-data: mysite.com IN A 10.0.2.2″.

Сохраняем конфиг и перезагружаем OpenServer. Вуаля! Заработало).

One comment

  • Денис
    29.08.2015 - 16:42 | Permalink

    Спасибо! ) Помогло

  • Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *