访问Android检测测试中的原始套接字

时间:2017-07-07 15:18:28

标签: android android-ndk

我已经在这里搜索了许多关于通过Android上的本机代码进行套接字访问的答案,以及其他关于“androidTest”检测测试的套接字访问的答案,但没有一个能够完全解释我所看到的一些奇怪的行为。 / p>

Windows 10上的Android Studio 2.3.3,NDK 15.1.x,构建工具25.0.3。用Cmake建设。我将一些本机代码移植到Android上,旨在作为包含在基于Java JNI的API中的库进行分发。这部分似乎工作正常;至少我可以调试并登录本机代码并查看出错的地方。

我已经创建了一些用于练习JNI的测试测试,但看起来本机端无法访问套接字,即使Android Studio为您的测试测试包装的测试应用程序也是如此(即,它具有应用了INTERNET权限,我可以看到它是测试应用程序的推送清单的一部分。我还在适当的时候应用了ACCESS_NETWORK_STATE烫发。)

也就是说,库的一部分知道如何设置和使用TCP套接字(数据报和流;在本例中为流)并解析DNS失败(这可能是我的端口中的错误,因为设备本身仍然似乎根据下面的adb shell输出解析DNS)。如果我使用IP地址进行测试,则会重试,直至失败。每次拨打socket()都会返回11 EAGAIN的ERRNO(“再试一次”)。

如果我使用adb shell登录通过USB测试的设备,我可以ping并使用curl等。但是,只要我run-as作为测试应用程序,我就不再允许使用任何网络设备。

shell@venice:/data/data/org.clvrmnky.library.test $ ping www.example.com
PING www.example.com (93.184.216.34) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
^C
--- www.example.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2004ms

1|shell@venice:/data/data/org.clvrmnky.library.test $ ping -I wlan0 www.example.com
ping: SO_BINDTODEVICE: Operation not permitted
2|shell@venice:/data/data/org.clvrmnky.library.test $ curl -4 --verbose www.example.com/
*   Trying 93.184.216.34...
* connect to 93.184.216.34 port 80 failed: Connection timed out
* Failed to connect to www.example.com port 80: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to www.example.com port 80: Connection timed out
7|shell@venice:/data/data/org.clvrmnky.library.test $

我不会在这里粘贴它,但是wlan0(和其他人)存在并且UP是一个有效的,可达的IP地址。这是“Link encap:UNSPEC”,我承认我并不完全理解。

我假设应用程序在连续的套接字调用上失败并且无法绑定到网络设备并在adb shell中使用它在某种程度上是相关的,但如果有人有理由这可能不是这样,请告诉我。

我试过了:

  • 在后台线程中调用测试方法,以防检测测试在测试应用程序主线程中运行。
  • 在测试类的StrictMode子句中将permitAll()线程策略设置为@Before
  • 使用和不使用测试清单中设置的INTERNET权限运行。如果没有此权限,它将到达本机代码,但在初始化时会更早失败。我必须深入到我的笔记中以获取更多有关该细节的细节。我假设我需要此权限。 (旁注:如果我启用INTERNET,则远程调试器无法再连接到设备,因此我只能通过日志进行调试。)

1 个答案:

答案 0 :(得分:1)

看起来像检测测试,至少在撰写本文时,不支持通过NDK访问原始套接字。自动创建的.test应用程序似乎拥有清单中所需的一切(我从设备上检查了base.apk)。

一旦使用相同的清单设置创建了DemoApp,我就能够打开套接字,连接它们,进行名称查找等。此外,我能够在运行时通过adb shell访问网络(“运行” -as“)DemoApp。

还有一些奇怪的事情发生,因为我创建了一个单独的JNI应用程序来打开套接字,并且针对它进行了一次检测测试。至少短暂的adb shell运行为ext.other.app.test 可以访问互联网。