Android10以上 如何实现无根用户访问ARP表?
BufferedReader br = new BufferedReader(new FileReader("proc/net/arp"));
getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
Android10以上 如何实现无根用户访问ARP表?
BufferedReader br = new BufferedReader(new FileReader("proc/net/arp"));
getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
在Android 10及以上的版本中,由于Android系统的安全性增强,应用程序不能直接读取ARP表。这是由于网络隐私和安全性因素所致。因此,应用程序不能直接使用ARP协议访问本地ARP表。
但是,可以使用Android系统提供的ConnectivityManager类中的API。可以使用getLinkProperties()方法获取与设备连接的所有网络的网络参数,包括ARP表。您可以使用getLinkAddresses()方法或getInterfaceAddresses()方法获取IP地址/子网掩码/广播地址/MTU等详细信息。然后,您可以使用NetworkUtils中的方法解析网络中设备的MAC地址。
以下是一个示例代码:
用java实现:
public static String getMacAddressFromArpCache(String ipAddress) {
String macAddress = null;
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network network = connMgr.getActiveNetwork();
LinkProperties linkProperties = connMgr.getLinkProperties(network);
for (LinkAddress linkAddress : linkProperties.getLinkAddresses()) {
InetAddress inetAddress = linkAddress.getAddress();
if (inetAddress instanceof Inet4Address) {
try {
String ip = inetAddress.getHostAddress();
if (ipAddress.equals(ip)) {
macAddress = NetworkUtils.resolveEthernetDevMac(ip);
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return macAddress;
}
请注意,此类访问ARP缓存的方法可能会更改或停止工作,因为这些方法不属于公共API,而且可能随时受到Android系统更新的影响。