error: more than one device and emulator
如果出现上面那种情况 请关闭 ide
输入下面的 再次重新启动 模拟器
如果实际上只有一个设备或模拟器,并且查到有offline的状态;
那就说明是ADB本身的BUG所导致的,就需要用如下的方法处理下了:
C:Usersgaojs>adb kill-server
C:Usersgaojs>taskkill /f /im adb.exe
第一条命令是杀ADB的服务,第二条命令是杀ADB的进程!
如果第一条没有用,才考虑用第二条命令再试试看的!
adb connect 192.168.2.103:5555 ip地址 模拟器查看方法 下载一个wifi adb 给root权限 就能看到
adb devices 再次输入 能看到有 上面ip列表
当我连着手机充电的时候,启动模拟器调试,执行ADB指令时,报错。
C:Usersgaojs>adb shell
error: more than one device and emulator
C:Usersgaojs>adb install e:good.apk
error: more than one device and emulator
碰到这种情况,首先要查一下,是不是真的有多个设备或模拟器。
C:Usersgaojs>adb devices
List of devices attached
emulator-5554 device
4dfadcb86b00cf05 device
发现还真是多个设备,那就需要为ADB命令指定设备的序列号了。
C:Usersgaojs>adb -s emulator-5554 shell
也就是如上所示,给命令加上-s的参数就可以了!
如果实际上只有一个设备或模拟器,并且查到有offline的状态;
那就说明是ADB本身的BUG所导致的,就需要用如下的方法处理下了:
C:Usersgaojs>adb kill-server
C:Usersgaojs>taskkill /f /im adb.exe
第一条命令是杀ADB的服务,第二条命令是杀ADB的进程!
如果第一条没有用,才考虑用第二条命令再试试看的!
---------------------
作者:杭州山不高
来源:CSDN
原文:https://blog.csdn.net/gaojinshan/article/details/9455193
版权声明:本文为博主原创文章,转载请附上博文链接!
通过shell命令设置(获取)IP、网关、dns信息,需要获取root权限
查看所有网络信息
-
C:>adb shell
-
root@android:/ # netcfg
-
netcfg
-
ip6tnl0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
-
00:00:00
-
gre0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
-
00:00:00
-
eth0 UP 192.168.0.180/24 0x00001043 00:00:00:
-
ec:0a:00
-
sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
-
00:00:00
-
lo UP 127.0.0.1/8 0x00000049 00:00:00:
-
00:00:00
-
tunl0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
-
00:00:00
查看eth0
-
root@android:/ # ifconfig eth0
-
ifconfig eth0
-
eth0: ip 192.168.0.180 mask 255.255.255.0 flags [up broadcast running multicast]
查看dns
-
root@android:/ # getprop net.eth0.dns1
-
getprop net.eth0.dns1
-
8.8.8.8
-
-
root@android:/ # getprop net.eth0.dns2
-
getprop net.eth0.dns2
-
8.8.4.4
设置ip
-
root@android:/ # ifconfig eth0 192.168.0.173 netmask 255.255.255.0
-
ifconfig eth0 192.168.0.173 netmask 255.255.255.0
-
-
root@android:/ # ifconfig eth0
-
ifconfig eth0
-
eth0: ip 192.168.0.173 mask 255.255.255.0 flags [up broadcast running multicast]
设置网关Gateway
-
root@android:/
-
route add default gw 192.168.0.1 dev eth0
添加dns
-
root@android:/ # setprop net.eth0.dns1 8.8.8.8
-
setprop net.eth0.dns1 8.8.8.8
-
-
root@android:/ # setprop net.eth0.dns2 8.8.4.4
-
setprop net.eth0.dns2 8.8.4.4
查看eth配置信息
-
root@android:/
-
getprop | grep eth0
-
[dhcp.eth0.dns1]: [192.168.0.1]
-
[dhcp.eth0.dns2]: []
-
[dhcp.eth0.dns3]: []
-
[dhcp.eth0.dns4]: []
-
[dhcp.eth0.gateway]: [192.168.0.1]
-
[dhcp.eth0.ipaddress]: [192.168.0.180]
-
[dhcp.eth0.leasetime]: [3600]
-
[dhcp.eth0.mask]: [255.255.255.0]
-
[dhcp.eth0.pid]: [13800]
-
[dhcp.eth0.reason]: [PREINIT]
-
[dhcp.eth0.result]: [failed]
-
[dhcp.eth0.server]: [192.168.0.1]
-
[dhcp.eth0.vendorInfo]: []
-
[net.change]: [net.eth0.dns2]
-
[net.eth0.dns1]: [8.8.8.8]
-
[net.eth0.dns2]: [8.8.4.4]
-
3)、getprop | grep dns 过滤dns
4) 、getprop | grep dns 输出dns
5) 、修改dns 需要root ,然后输入 adb shell 然后输入su命令 然后set dhcp.wlan0.dns1 8.8.8.8
2、查看手机ip
输入netstat
Android一般是通过设置界面来配置各种网络信息,今天讲一下当不方便使用设置的时候,通过shell命令来查看和配置网络的方法。
注:以下shell命令在不同版本Android系统上可能存在差异。
查看网络连接信息
查看全部连接
#netcfg
ccmni2 DOWN 0.0.0.0/0 0x00000080 11:22:22:33:44:11
ccmni0 DOWN 0.0.0.0/0 0x00000080 2a:3d:e1:22:5d:11
ccmni1 DOWN 0.0.0.0/0 0x00000080 1e:bc:dd:5a:32:11
wlan0 UP 192.168.1.151/24 0x00001043 5c:f7:c3:dd:44:11
tunl0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00
sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
p2p0 UP 0.0.0.0/0 0x00001003 5e:f7:c3:dd:44:11
ifb0 DOWN 0.0.0.0/0 0x00000082 e6:a9:76:38:04:11
ifb1 DOWN 0.0.0.0/0 0x00000082 96:d6:f4:59:10:11
ip6tnl0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:11
1
2
3
4
5
6
7
8
9
10
11
12
查看指定连接
#ifconfig wlan0
wlan0: ip 192.168.1.151 mask 255.255.255.0 flags [up broadcast running multicast]
1
2
设置IP
方法1:
//ifconfig <dev> <ip> netmask <value>
例:ifconfig wlan0 192.168.1.10 netmask 255.255.255.0
1
2
方法2:
//ip address add <ip> dev <value>
例:ip address add 192.168.1.10/24 dev wlan0
1
2
设置默认网关
设置默认网关主要是通过路由表
ip route add 192.168.1.0/24 via 192.168.1.1
1
也可以直接使用dhcp命令来自动获取
netcfg wlan0 dhcp
1
设置DNS
设置dns的方法比较多,但是不同环境,以及不同的系统版本,能生效的方式不一定相同,可以多试几种,这里提供一种我用的方式,适用于Android 5.1,其他系统参照https://github.com/ukanth/afwall/wiki/DNS#resolver-commands
ndc resolver setnetdns <netid> <domain> <dns1> <dns2>
例:ndc resolver setnetdns wlan0 "" 8.8.8.8 8.8.4.4
1
2
之前在xda论坛上看到过其他方式,如果以上方式无效,也可以看一下这个论坛里的方法https://forum.xda-developers.com/general/xda-university/guide-how-to-change-dns-android-device-t3273769
这些命令有的比较简单,用法也比较单一,比如netcfg,但是有的就要复杂一些,比如路由表的配置。Android 的shell环境里没有man的命令,查看具体的命令用法一般就是在命令后加-h 或者help。
参考:
DNS-commands
ifconfig vs ip
[GUIDE] How to Change DNS in Android Device (8 methods)
---------------------
作者:feiniao8651
来源:CSDN
原文:https://blog.csdn.net/feiniao8651/article/details/81664039
版权声明:本文为博主原创文章,转载请附上博文链接!
android 4.1系统上,通过usb以太网进行上网,发现udhcpc获取到ip和dns,并且ip设置到网络节点成功,dns server也配置到/etc/resolv.conf文件中成功,但总是ping IP正常,而ping domain失败:unkown host.
最后,有同事发现原来android上的dns配置与linux上有所不同,android上还需要通过设置属性net.dns1,net.dns2,setprop后即可正常工作了。。。
附参考:http://blog.163.com/my_ywj/blog/static/1812035592011730104753938/
通过ubuntu等Linux系统都是通过resolve.conf文件进行域名解析的,通过man resolve.conf可以查看到:
The resolver is a set of routines in the C library that provide access to the Internet Domain Name System (DNS). The resolver configuration file contains information that is read by the resolver routines the first time they are invoked by a process. The file is designed to be human readable and contains a list of keywords with values that provide various types of resolver information. If this file doesn't exist the only name server to be queried will be on the local machine; the domain name is determined from the hostname and the domain search path is constructed from the domain name.
所以DNS解析是由C库函数进行解析的,在Android中bionic/libc/docs/overview.txt文件中我们也可以看到:
NS resolver:
Bionic uses a NetBSD-derived resolver library which has been modified in the following ways:
- don't implement the name-server-switch feature (a.k.a. <nsswitch.h>)
- read /system/etc/resolv.conf instead of /etc/resolv.conf
- read the list of servers from system properties. the code looks for 'net.dns1', 'net.dns2', etc.. Each property should contain the IP address of a DNS server.
these properties are set/modified by other parts of the Android system (e.g. the dhcpd daemon).
the implementation also supports per-process DNS server list, using the properties 'net.dns1.<pid>', 'net.dns2.<pid>', etc... Where <pid> stands for the numerical ID of the current process.
- when performing a query, use a properly randomized Query ID (instead of a incremented one), for increased security.
- when performing a query, bind the local client socket to a random port for increased security.
- get rid of *many* unfortunate thread-safety issues in the original code
Bionic does *not* expose implementation details of its DNS resolver; the content of <arpa/nameser.h> is intentionally blank. The resolver implementation might change completely in the future.
所以android关注的是resolv.conf以及net.dns1等属性。
通 过adb shell中通过getprop查看属性,确实有net.dns1、net.dns2以及wifi中的net.tiwlan0.dns1以及 net.tiwlan0.dns2,移动网络中的net.rmnet0.dns1以及net.rmnet0.dns2等属性。
转自 [(http://blog.csdn.net/ganyue803/article/details/51646284)]
一、android中代码
framework端,设置dns服务器代码路径如下:
kk-4.x/libcore/luni/src/main/java/java/net/InetAddress.java
kk-4.x/frameworks/base/services/java/com/android/server/NetworkManagementService.java
kk-4.x/frameworks/base/services/java/com/android/server/NativeDaemonConnector.java
NetworkManagementService中函数setDnsServersForInterface
最终会通过本地socket传输命令到守护进程netd
所以framework层还可以使用INetworkManagementService mNetd 来更改dns地址
二、和dns相关libc代码路径如下:
kk-4.x/bionic/libc/netbsd
三、netd模块,netd是一个守护进程
kk-4.x/system/netd
四、其他命令设置dns
iptables -t nat -A OUTPUT -p udp –dport 53 -j DNAT –to-destination 202.96.134.33:53
取消设置的DNS:
iptables -t nat -L OUTPUT -n -v –line-numbers
iptables -t nat -D OUTPUT linenumber
五、第一次开机起来后获取DNS:
/data/data/com.android.providers.settings/databases/Settings.db 里面有保存dns数据
在开机状态下,获取DNS:
EthernetManager可以设置获取DNS,这个dns是保存在内存的键值对中。
六、流程
android 4.3之后通过DNS获取ip,采用netd代理,netd是一个守护进程。
通过ndc命令可以配置DNS服务器:
ndc resolver setifdns eth0 “” 8.8.8.8 8.8.4.4
各个版本支持的ndc命令:
https://github.com/bparmentier/DNSSetter/wiki/ndc-resolver-commands
1、ndc通过本地socket将命令传给netd
2、通过netd调用res_cache将dns1和dns2等信息保存到cache中
3、 netd调用bionic libc下netbsd中函数getaddrinfo
4、libc更新要访问的dns服务器ip地址
android中请求DNS服务器,获取ip流程如下
上层应用设置dns
NativeDaemonConnector通过java本地socket,将命令
发送给NetD
如果不走netd,流程如下:
注:lbc为android下bionic里面的libc
如果4.3之后有需求,需要和4.3之前一样,通过属性配置DNS。
那么可以合并4.0.3代码,即res_init.c中合并通过属性获取DNS
服务器ip地址代码,通过在自己的程序中设置环境变量:
setenv(“ANDROID_DNS_MODE”, “local”, 1);不要export。
当然不合并代码也是可以的,只需要修改dns服务器地址。
在res_init中res_setservers里面可以修改
struct addrinfo hints, *ai;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_NUMERICHOST;
sprintf(sbuf, “%u”, NAMESERVER_PORT);
sprintf(propname, “net.dns%d”, i+1);
__system_property_get(propname,propvalue);
printf(” propname: %s
”,propname);
printf(“propvalue dns: %s
”,propvalue);
char* p = propvalue;
while (*p == ’ ’ || *p == ‘ ’)
p++;
p[strcspn(p, “;#
”)] = ‘