Android之經過adb shell 模擬器 error: more than one device and emulator 改ip dns

error: more than one device and emulatorjava

若是出現上面那種狀況 請關閉  ide linux

輸入下面的  再次從新啓動 模擬器android

若是實際上只有一個設備或模擬器,而且查到有offline的狀態;
那就說明是ADB自己的BUG所致使的,就須要用以下的方法處理下了:
C:\Users\gaojs>adb kill-server
C:\Users\gaojs>taskkill /f /im adb.exe
第一條命令是殺ADB的服務,第二條命令是殺ADB的進程!
若是第一條沒有用,才考慮用第二條命令再試試看的!git

 

adb connect 192.168.2.103:5555   ip地址 模擬器查看方法  下載一個wifi adb 給root權限 就能看到
adb devices  再次輸入 能看到有 上面ip列表github

 

 

 

當我連着手機充電的時候,啓動模擬器調試,執行ADB指令時,報錯。
C:\Users\gaojs>adb shell
error: more than one device and emulator
C:\Users\gaojs>adb install e:\good.apk
error: more than one device and emulatorshell

碰到這種狀況,首先要查一下,是否是真的有多個設備或模擬器。
C:\Users\gaojs>adb devices
List of devices attached
emulator-5554   device
4dfadcb86b00cf05        device
發現還真是多個設備,那就須要爲ADB命令指定設備的序列號了。
C:\Users\gaojs>adb -s emulator-5554 shell
也就是如上所示,給命令加上-s的參數就能夠了!ubuntu

若是實際上只有一個設備或模擬器,而且查到有offline的狀態;
那就說明是ADB自己的BUG所致使的,就須要用以下的方法處理下了:
C:\Users\gaojs>adb kill-server
C:\Users\gaojs>taskkill /f /im adb.exe
第一條命令是殺ADB的服務,第二條命令是殺ADB的進程!
若是第一條沒有用,才考慮用第二條命令再試試看的!緩存

---------------------
做者:杭州山不高
來源:CSDN
原文:https://blog.csdn.net/gaojinshan/article/details/9455193
版權聲明:本文爲博主原創文章,轉載請附上博文連接!服務器

 

經過shell命令設置(獲取)IP、網關、dns信息,須要獲取root權限markdown

查看全部網絡信息

  1.  
    C:\>adb shell
  2.  
    root@android :/ # netcfg
  3.  
    netcfg
  4.  
    ip6tnl 0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
  5.  
    00:00:00
  6.  
    gre 0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
  7.  
    00:00:00
  8.  
    eth 0 UP 192.168.0.180/24 0x00001043 00:00:00:
  9.  
    ec:0a:00
  10.  
    sit 0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
  11.  
    00:00:00
  12.  
    lo UP 127.0.0.1/8 0x00000049 00:00:00:
  13.  
    00:00:00
  14.  
    tunl 0 DOWN 0.0.0.0/0 0x00000080 00:00:00:
  15.  
    00:00:00

查看eth0

  1.  
    root@android :/ # ifconfig eth0
  2.  
    ifconfig eth 0
  3.  
    eth0: ip 192.168.0.180 mask 255.255.255.0 flags [up broadcast running multicast]

查看dns

  1.  
    root@android :/ # getprop net.eth0.dns1
  2.  
    getprop net.eth 0.dns1
  3.  
    8.8.8.8
  4.  
     
  5.  
    root@android :/ # getprop net.eth0.dns2
  6.  
    getprop net.eth 0.dns2
  7.  
    8.8.4.4

設置ip

  1.  
    root@android :/ # ifconfig eth0 192.168.0.173 netmask 255.255.255.0
  2.  
    ifconfig eth 0 192.168.0.173 netmask 255.255.255.0
  3.  
     
  4.  
    root@android :/ # ifconfig eth0
  5.  
    ifconfig eth 0
  6.  
    eth0: ip 192.168.0.173 mask 255.255.255.0 flags [up broadcast running multicast]

設置網關Gateway

  1.  
    root@android:/ # route add default gw 192.168.0.1 dev eth0
  2.  
    route add default gw 192.168.0.1 dev eth0

添加dns

  1.  
    root@android :/ # setprop net.eth0.dns1 8.8.8.8
  2.  
    setprop net.eth 0.dns1 8.8.8.8
  3.  
     
  4.  
    root@android :/ # setprop net.eth0.dns2 8.8.4.4
  5.  
    setprop net.eth 0.dns2 8.8.4.4

查看eth配置信息

  1.  
    root@android:/ # getprop | grep eth0
  2.  
    getprop | grep eth0
  3.  
    [ dhcp.eth0.dns1]: [192.168.0.1]
  4.  
    [ dhcp.eth0.dns2]: []
  5.  
    [ dhcp.eth0.dns3]: []
  6.  
    [ dhcp.eth0.dns4]: []
  7.  
    [ dhcp.eth0.gateway]: [192.168.0.1]
  8.  
    [ dhcp.eth0.ipaddress]: [192.168.0.180]
  9.  
    [ dhcp.eth0.leasetime]: [3600]
  10.  
    [ dhcp.eth0.mask]: [255.255.255.0]
  11.  
    [ dhcp.eth0.pid]: [13800]
  12.  
    [ dhcp.eth0.reason]: [PREINIT]
  13.  
    [ dhcp.eth0.result]: [failed]
  14.  
    [ dhcp.eth0.server]: [192.168.0.1]
  15.  
    [ dhcp.eth0.vendorInfo]: []
  16.  
    [ net.change]: [net.eth0.dns2]
  17.  
    [ net.eth0.dns1]: [8.8.8.8]
  18.  
    [ net.eth0.dns2]: [8.8.4.4]
  19.  

 

        3)、getprop | grep dns 過濾dns

                   

           4) 、getprop | grep dns 輸出dns

                 

             5) 、修改dns  須要root ,而後輸入 adb shell 而後輸入su命令 而後set dhcp.wlan0.dns1 8.8.8.8

 

二、查看手機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.dns一、net.dns2以及wifi中的net.tiwlan0.dns1以及 net.tiwlan0.dns2,移動網絡中的net.rmnet0.dns1以及net.rmnet0.dns2等屬性。

 

轉自 [(http://blog.csdn.net/ganyue803/article/details/51646284)]

1、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地址

2、和dns相關libc代碼路徑以下: 
kk-4.x/bionic/libc/netbsd

3、netd模塊,netd是一個守護進程 
kk-4.x/system/netd

4、其餘命令設置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

5、第一次開機起來後獲取DNS:

/data/data/com.android.providers.settings/databases/Settings.db 裏面有保存dns數據

在開機狀態下,獲取DNS: 
EthernetManager能夠設置獲取DNS,這個dns是保存在內存的鍵值對中。

6、流程 
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

一、ndc經過本地socket將命令傳給netd 
二、經過netd調用res_cache將dns1和dns2等信息保存到cache中 
三、 netd調用bionic libc下netbsd中函數getaddrinfo 
四、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 \n」,propname); 
printf(「propvalue dns: %s \n」,propvalue); 
char* p = propvalue; 
while (*p == ’ ’ || *p == ‘\t’) 
p++; 
p[strcspn(p, 「;# \t\n」)] = ‘\0’; 
if (getaddrinfo(propvalue, sbuf, &hints, &ai) != 0){ 
memcpy(&statp->nsaddr_list[nserv],&set->sin, size); 
}else{ 
memcpy(&statp->nsaddr_list[nserv],ai->ai_addr, ai->ai_addrlen); 
}

若是不修改底層代碼,是能夠經過ndc命令修改DNS服務器的。原理就是第一個圖。

基本請求流程以下:

android apk上從dns服務器獲取ip方式以下:

new Thread( networkTask).start();

Runnable networkTask = new Runnable() { 
@Override 
public void run() { 
try { 
InetAddress inetAddress = InetAddress.getByName( 「www.baidu.com」); 
Log. i( TAG, 「Address is getHostName:」 + inetAddress.getHostName()); 
Log. i( TAG, 「Address is 」 + inetAddress.getHostAddress()); 
} catch (Exception e) { 
e.printStackTrace(); 
Log. i( TAG, 「Address is Exception」); 


};

< uses-permission android:name = 「android.permission.INTERNET」 />

 

 

shell命令

文件操做相關命令
  1. cd : 進入文件目錄內 至關於咱們雙擊某個文件夾 進入內部
  2. cat: 查看文件的內容,好比 .txt文件中的文本;
    -b -n -s:顯示行號,-b會忽略空行,-s連續空行記爲一行
  3. df: 列出分區列表 好比 系統分區,sdcard分區等
  4. du: 查看文件或者目錄的磁盤使用空間
  5. ls: 列出目錄內容
    -a: 列出全部文件,包括隱藏文件
    -i: 輸出文件的i節點的索引信息
    -l: 列出文件的詳細信息
    -n: 用數字的GUID代替名稱
    -s: 輸出文件的大小
  6. grep: 指定文件中搜索特定內容,並將含有這些內容的行標準輸出
  7. mkdir: 建立目錄,-p,--parents:遞歸建立目錄
  8. touch: 建立文件 語法:touch [-alm] [-t XXXX[.YYY]] <file>
  9. rm: 刪除文件 語法:rm[-f|-i] [-dPRrvWx] file
    -f: 強制刪除文件,系統不提示
    -i: 交互式刪除,刪除前有提示
    -d: 改變硬連接數據刪成0,刪除該文件
    -r,-R: 遞歸刪除全部子目錄下的文件和目錄
  10. rmdir: 刪除目錄,-p: 遞歸刪除目錄,只能刪除空目錄
  11. mv: 移動文件 語法:mv [-fiv] directory
    -f: 強制移動,若已經存在目標則直接覆蓋
    -i: 若目標文件已經存在,會詢問是否覆蓋
  12. dd: 複製文件 語法:dd if=source of=target
  13. chmod: 文件權限修改 語法:chmod[OPTION]<MODE><FILE>
    -R: 遞歸的改變文件和目錄
    -h: 不遵循符號鏈接
  14. chown: 更改某個文件或者目錄的屬主或屬組 語法:chown [-R[-H|-L|-P]] [-fhv] owner:group|owner|:group file
  15. md5: 查詢文件的md5值 語法:md5 file
  16. mount: 掛載設備信息 語法:mount [-r] [-w] [-o options] [-t type] device directory
  17. remount: 從新掛載設備,能夠改變可訪問權限 語法: mount -o remount,[rw/ro/..權限] [設備名] [文件路徑]
  18. umount: 卸載分區掛載 語法:umount <path>
  19. cmp: 要指出兩個文件是否存在差別 語法:cmp [-b] [-l] [-n count] file1 file2
  20. ln: 用來在文件之間建立鏈接 語法:ln [-fhinsv] [-s] file1 file2
    有[-s]是軟鏈接(鏈接文件不會複製一份被鏈接文件的內容)
    沒有爲硬鏈接
信息查詢相關命令
  1. dumpstate: 系統狀態信息 包括手機當前的內存信息、CPU信息、logcat緩存、kernel緩存等等
//-e : 表示虛擬機 //path : 將信息打印到path路徑文件下 adb -e shell dumpstate > path 
  1. bugreport: 裏邊包含dmesg、dumpstate和dumpsys
//-e : 表示虛擬機 //path : 將信息打印到path路徑文件下 adb -e shell bugreport> path 
  1. dmesg: kernel(內核)的log
//-d : 表示USB外接設備 adb -d shell dmesg 
  1. logcat: 打印日誌緩衝區日誌
//-d : 表示USB外接設備 adb -d shell logcat 
  1. dumpsys: 獲取系統各項服務信息
//-d : 表示USB外接設備 //meminfo: 內存信息 adb -d shell dumpsys meminfo //cpuinfo: cpu信息 adb -d shell dumpsys cpuinfo //activity: activity信息 //find "mF": 過濾當前前臺activity adb -d shell dumpsys activity | find "mF" 
  1. getevent: 獲取按鍵信息
//-d : 表示USB外接設備 adb -d shell getevent 
  1. getprop: 獲取系統屬性
//-d : 表示USB外接設備 adb -d shell getprop 
  1. setprop: 設置系統屬性(須要root權限)
  2. pm: 安裝包管理,查詢安裝包的各類信息 pm還包含不少其餘指令 好比安裝 卸載等等
//-d : 表示USB外接設備 adb -d shell pm //列舉全部的安裝包 adb -d shell pm list packages 
  1. ps: 查看進程信息
//-d : 表示USB外接設備 adb -d shell ps 
  1. top: 獲取CPU使用狀況
//顯示全部cpu使用狀況並每隔幾秒更新一次 adb -d shell top //-m: 最大顯示條數 //-n: 更新次數 //-d: 更新時間間隔幾秒 //-s: 排序依據(cpu vss rss thr) //-t: 顯示線程信息而不是進程 //-h: 顯示幫助文檔 adb -d shell top -m 10 -n 10 -d 2 -s rss -t -h 
  1. procrank: 查看各進程內存消耗狀況(須要root權限)
//-d : 表示USB外接設備 adb -d shell procrank 
做者:Cats_eat_fish 連接:https://www.jianshu.com/p/4386d14d2783 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索