2017-07-07 74 views
1

我已经浏览了许多关于通过Android上的本机代码访问套接字以及其他人关于“androidTest”插装测试套接字访问的答案,但没有人能够完全解释一些奇怪的行为,我看到。访问Android插装测试中的原始套接字

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等。但是,只要我作为测试应用程序,我不再允许使用任何网络设备。

[email protected]:/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|[email protected]:/data/data/org.clvrmnky.library.test $ ping -I wlan0 www.example.com 
ping: SO_BINDTODEVICE: Operation not permitted 
2|[email protected]:/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|[email protected]:/data/data/org.clvrmnky.library.test $ 

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

我假设应用程序在连续的套接字调用上失败并且无法绑定到网络设备并在adb外壳中使用它们以某种方式关联,但如果有人有理由这样做可能并非如此,请让我知道。

我已经试过:

  • 在后台线程中调用的测试方法,以防万一仪器测试在测试程序主线程中运行。
  • 在测试类的@Before子句中将StrictMode线程策略设置为permitAll()
  • 在测试清单中设置或不设置INTERNET权限的情况下运行。如果没有此权限,它会到达本机代码,但在初始化过程中会失败很多。我不得不深入笔记以获取更多关于这方面的细节。我假设,我需要这个权限。 (附注:如果我启用Internet然后远程调试器无法再连接到设备上,这样我就可以通过仅记录调试。)

回答

1

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

一旦使用相同的清单设置创建了一个DemoApp,我就可以打开套接字,连接到它们,进行名称查询等。此外,我可以通过adb shell以(“run-as” )DemoApp。

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