Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@kacchan6

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

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アドレスで接続できるようになった。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?