0

我正在尝试运行一个进程并从 InputStreamReader 读取它的数据,但它以一种奇怪的方式失败。

可执行文件是“ip neigh show”

当尝试通过 adb shell 从连接的设备运行命令时,该命令执行正常并正确显示数据。

但是当试图从 kotlin 代码中执行它时,它会以退出代码 1 退出,并且 InputStreamReader 也显示空数据。

这就是我正在尝试的方式:

val p = Runtime.getRuntime().exec("ip neigh show")
InputStreamReader(p!!.inputStream).forEachLine fori@{ line ->
                    val teDhenat = line.split("\\s+".toRegex())
                    if (teDhenat[0] == ip) {
                        if (teDhenat.size < 4) {
                            return@fori
                        } else {
                            uGjet = true
                            macAddress = teDhenat[4]
                            return@fori
                        }
                    }
                }

问题似乎发生在该行:val p = Runtime.getRuntime().exec("ip neigh show")但我不明白为什么。

也试过了val p = Runtime.getRuntime().exec("/system/bin/ip neigh show"),还是一样。

我也尝试过使用ProcessBuilder()它也不起作用。

编译和目标 SDK 为 31 手机是运行 Android 11 (SDK 30) 的小米

PS:我也对其他可执行文件使用相同的逻辑,它们工作得很好,比如“ping”、“top”等......

4

1 回答 1

0

从 Android 11 (SDK 30) 开始:

此外,非特权应用无法访问设备的 MAC 地址;只有具有 IP 地址的网络接口可见。这会影响 getifaddrs() 和 NetworkInterface.getHardwareAddress() 方法,以及发送 RTM_GETLINK Netlink 消息。

以下是应用程序受此更改影响的方式列表:

NetworkInterface.getHardwareAddress() 为每个接口返回 null。

应用程序不能在 NETLINK_ROUTE 套接字上使用 bind() 函数。

ip 命令不返回有关接口的信息。

应用无法发送 RTM_GETLINK 消息。请注意,大多数开发人员应该使用 ConnectivityManager 的高级 API,而不是 NetworkInterface、getifaddrs() 或 Netlink 套接字等低级 API。例如,需要有关当前路由的最新信息的应用程序可以通过使用 ConnectivityManager.registerNetworkCallback() 侦听网络更改并调用网络的关联 LinkProperties.getRoutes() 来获取此信息。

于 2021-12-05T22:23:49.527 回答