【问题标题】:Android Q /system/bin/ip no longer executableAndroid Q /system/bin/ip 不再可执行
【发布时间】:2021-03-12 11:28:57
【问题描述】:

我们的应用中有一个功能 (TargetSDK = 30),它可以扫描当前 wifi 网络中的设备。 我们做的其中一件事就是调用

Runtime.getRuntime().exec("/system/bin/ip neigh show")

end 从标准输出中提取 MAC 地址。 该代码在 Android Q/10 之前运行良好,但在运行 Anroid 11 的 Pixel 2 上,外部进程立即退出,退出代码为 1(不引发异常)

另一方面,调用 /system/bin/ping 运行没有任何问题。

我查看了 Android 11 文档 (https://developer.android.com/about/versions/11),但是 找不到有关新限制的任何提示。

有人知道吗?

【问题讨论】:

  • 请注意,任何特定的设备型号都不需要任何特定的命令行二进制文件,更不用说在任何特定的目录中了。
  • @CommonsWare 我知道,但是二进制文件在那里并且可以从 adb shell 运行而没有问题
  • “但二进制文件在那里”——在您正在测试的特定设备上,是的。大约有 25 亿台 Android 设备。 “我检查了 Android 11 文档”——设备上的命令行二进制文件不是 SDK 的一部分。一般来说,那里的变化不会被记录下来。 “有人有线索吗?” -- 识别附近 WiFi 设备的能力代表了隐私泄露,因为您可以使用该信息来识别设备的位置。因此,他们可能只是限制了哪些进程可以运行该二进制文件。
  • @CommonsWare 你说的一切都是对的,但这不是我问的,你是在告诉我我已经知道的事情。谢谢,不过

标签: android networking


【解决方案1】:

自 Android 11 (SDK 30) 起

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

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

NetworkInterface.getHardwareAddress() 为每个返回 null 界面。应用程序无法在 NETLINK_ROUTE 上使用 bind() 函数 插座。

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

应用无法发送 RTM_GETLINK 消息。请注意,大多数开发人员 应该使用 ConnectivityManager 的更高级别的 API,而不是 较低级别的 API,例如 NetworkInterface、getifaddrs() 或 Netlink 插座。例如,一个需要最新信息的应用程序 当前路由可以通过监听网络来获取这些信息 使用 ConnectivityManager.registerNetworkCallback() 和 调用网络关联的 LinkProperties.getRoutes()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-05
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多