LoginSignup
6
5

More than 5 years have passed since last update.

Android2.3系でDNSキャッシュをクリアする

Posted at

suが使える環境が前提であるが、

setprop net.change `getprop net.change`

これだけでよい。ただし、HttpURLConnectionを使う場合、少なくとも

static {
    System.setProperty("networkaddress.cache.ttl", "0");
    System.setProperty("networkaddress.cache.negative.ttl", "0");
}

をやっている前提であること。

DNSのキャッシュはlibcの低レベルレイヤとDalvik上のINetAddressのレイヤの両方で行っており、INetAddress用の設定をSystem.setPropertyで行ってもlibcでキャッシュしているため、setprop net.changeを行う必要がある。(libcでnet.changeの変更時間とキャッシュを管理している)

プロセス単位でキャッシュされているようなので、そのプロセスが一旦死ねばキャッシュも当然ながら破棄される。

調査の経緯

通信が不安定なモバイルルーターに接続されているAndroid端末があり、通信が復帰してもアプリから通信ができない問題があった。原因としては、

  1. Androidから外にアクセスする際に、DNSの問い合わせを行う
  2. モバイルルーターが適当なIPアドレスを返す
  3. AndroidがそのURLに対して正しくないIPアドレスをキャッシュする
  4. そのIPに対してAndroidからHTTPリクエストを送る
  5. モバイルルータが「インターネッツに接続できないよ」的なページを200 OKで返す
  6. モバイルルーターがそのうち接続できるようになる
  7. AndroidからはずっとWIFIで接続できている状態であり、ネットワークの接続状態は変化なし
  8. Androidは正しくないIPアドレスを使用してインターネットに接続してしまう
  9. DNSレコードのTTLが何故か無視されている

という状態であった。setprop net.changeを実行して、やっと正しいIPアドレスで接続できるようになった。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5