Android-хосты используют файл
У меня есть следующая проблема:
Я создаю собственный файл hosts, чтобы протестировать некоторые функции моего приложения, а затем помещаю его в мой эмулятор Android. Дело в том, что эти настройки вступают в силу не сразу. Я должен ждать около 10 минут, прежде чем они станут активными.
Итак, мой вопрос: как сделать новый файл хостов активным мгновенно? У меня много разных настроек для тестирования, и я не могу ждать 10 минут каждый раз.
3 ответа
Java поддерживает свой собственный внутренний кеш DNS. Операционная система немедленно отобразит новый файл hosts (убедитесь, что с ping
в командной строке), но вам нужно будет указать java, что ничего не нужно кэшировать. Добавьте эти строки в ваше тестовое приложение:
System.setProperty("networkaddress.cache.ttl" , "0");
System.setProperty("networkaddress.cache.negative.ttl" , "0");
Для получения дополнительной информации об этих свойствах см. Здесь: http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html
Я только что отредактировал файл hosts на своем рутированном Samsung Galaxy S, и изменения вступили в силу немедленно. Возможно, проблема, которую вы видите, связана с АБР?
Я сделал это:
- Используя Busybox, скопируйте файл hosts в редактируемое место с
cp /etc/hosts /mnt/sdcard/hosts.new
; - редактировать
/mnt/sdcard/hosts.new
используя предустановленный текстовый редактор, добавив две записи, которые мне нужны. Я использовал IP, затем неполное имя хоста, затем FQDN, например192.168.2.81 siva siva.myinventeddomain.org.au
, но другие форматы должны теоретически работать; - Снова в BusyBox,
su
укорениться; /system
по умолчанию это ro, поэтому мне пришлось сделать это сmount -o remount,rw /system
;- Чтобы сохранить ввод позже,
cd /etc
(после чего подсказка оболочки показала/system/etc
скорее, чем/etc
, что заставляет меня подозревать мошенничество); - Создайте резервную копию файла hosts по умолчанию (который содержал только
127.0.0.1 localhost
) сmv hosts hosts.old
; - Установите новый файл hosts с помощью
mv /mnt/sdcard/hosts.new hosts
; - казнить
sync
(только потому, что я параноик - в этом не должно быть необходимости); - восходить
/system
фс ро сmount -o remount,ro /system
; - Выход из BusyBox;
- Запустил веб-браузер (FireFox) и вошел
siva
в комбинированном поле URL/ поискаsiva
будучи одним из двух записей хостов, которые я добавил).
До этих изменений шаг 11 приводил к глупому поиску в Google по запросу "siva" или что-то еще; сразу после них, как я и ожидал, я получаю первую полосу моего http http vhost.
Прошло не более 10 минут между тем, как он работал, и он не работал.
Ссылка на Java-доку Sun может быть или не иметь отношения (вероятно, это не так). Android вообще не содержит Java VM, не говоря уже о Sun. Он запускает другую виртуальную машину под названием Dalvik - см. Статью в Википедии: http://en.wikipedia.org/wiki/Dalvik_%28software%29
Тот факт, что вы можете программировать телефоны Android на языке, который очень похож на Java, не имеет значения.
Я не пробовал использовать файл hosts; но я попытался использовать пользовательский DNS...
- Запустите DNS-сервер где-нибудь (вы можете загрузить DD-WRT, иметь модный маршрутизатор или запустить демон на своем ПК).
- ДОПОЛНИТЕЛЬНО: Настройте локальный маршрутизатор (DHCP-сервер) с указанием местоположения работающего DNS-сервера (сделайте его первым в списке DNS-серверов).
- IF SKIPPING # 2: Настройте свой телефон для статического IP (Настройки Wi-Fi-> Кнопка меню-> Дополнительно). Установите DNS1 в качестве вашего сервера.
- Подключите телефон к этой сети через WIFI.
Вы сделали! Теперь вы можете управлять DNS-именами /IP-адресами, а также временем аренды (например, телефон будет обновлять IP каждые 30 секунд, если вам нужно). Немного сложно, но вам не нужно загружать файл hosts на телефон:-).