![](/img/trans.png)
[英]Android APK - How do applications connect to their servers without DNS queries
[英]How do I find the DNS servers in Android from a Java program?
java.net.InetAddress.GetByName(String host)
方法只能返回A
記錄,以便查找我需要能夠使用dnsjava
庫發送DNS查詢的其他記錄類型。
但是,這通常依賴於能夠解析/etc/resolv.conf
或類似內容來查找DNS服務器地址,這在Android上不起作用。
Android上的當前DNS設置顯然只能通過使用getprop
命令從shell中getprop
。
任何人都可以告訴我如何從Java獲取這些設置,而不是通過使用Runtime.exec()
生成shell並解析getprop
的輸出?
DNS協議並不復雜 - 你不能只使用原始套接字(TCP或UDP)進行DNS訪問嗎? 在快速瀏覽dnsjava doco之后,它似乎提供了低級別的DNS支持來幫助解決這個問題。
另一個可能的方向是,從dnsjava開始,刪除對/etc/resolv.conf
的依賴。 我會考慮在啟動腳本中使用getprop來設置JVM中的屬性,或者在應用程序的目錄中創建一個本地化的resolv.conf
文件,您可以從中讀取所需的信息。 換句話說,使用getprop將信息注入JVM,而不是在JVM運行時嘗試將其拉入。 當然,創建一個dnsjava可以直接使用的文件應該是可行的。
看起來android.net.ConnectivityManager
將使用getAllNetworkInfo()
為您提供NetworkInfo數組。 然后使用android.net.NetworkUtils.runDhcp()
為任何給定的網絡接口獲取DhcpInfo - DhcpInfo結構具有該接口的dns1和dns2的IP地址。 令人驚訝的是DNS是int,因此僅暗示IP4。
我不認為一般情況是可能的。 對於WiFi,我發現了這個:
WiFiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE);
DhcpInfo info = wifi.getDhcpInfo();
要獲取android系統的系統屬性,可以使用此類中的靜態方法( android.os.SystemProperties )。 由於它不是一個開放的api,你無法針對sdk進行編譯。 需要解決這個問題,例如從AOSP復制代碼以通過編譯。 由於此課程供內部使用,請自行承擔風險。 玩得開心。
我們應該能夠找到與我們連接的網絡(wifi或以太網)無關的DNS地址。 這是我的計划。
在AndroidManifest.xml文件中
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
你的代碼:
ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Service.CONNECTIVITY_SERVICE);
/* you can print your active network via using below */
Log.i("myNetworkType: ", connectivityManager.getActiveNetworkInfo().getTypeName());
WifiManager wifiManager= (WifiManager) getApplicationContext().getSystemService(getApplicationContext().WIFI_SERVICE);
Log.i("routes ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getRoutes().toString());
Log.i("domains ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDomains().toString());
Log.i("ip address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getLinkAddresses().toString());
Log.i("dns address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDnsServers().toString());
if(connectivityManager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI) {
Log.i("myType ", "wifi");
DhcpInfo d =wifiManager.getDhcpInfo();
Log.i("info", d.toString()+"");
}
else if(connectivityManager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_ETHERNET) {
/* there is no EthernetManager class, there is only WifiManager. so, I used this below trick to get my IP range, dns, gateway address etc */
Log.i("myType ", "Ethernet");
Log.i("routes ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getRoutes().toString());
Log.i("domains ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDomains().toString());
Log.i("ip address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getLinkAddresses().toString());
Log.i("dns address ", connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork()).getDnsServers().toString());
}
else {
}
您無法通過WifiManager
了解您是通過wifi還是網絡連接,因為WifiManager
僅處理wifi。 您必須使用ConnectivityManager
。 我再次更新了代碼,我合並了WifiManager
和ConnectivityManager
以生成您想要的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.