https://www.jianshu.com/p/dc6898380e38
0x0 前言
Android開發肯定要連接pc的adb進行調試,傳統的方法是用usb與pc進行連接,操作簡單即插即用,缺點是pc上必須得有對應手機的usb驅動程序,對于谷歌親兒子系列和三星摩托等外國品牌而言這不是什么問題,通常sdk里面就自帶了,然而想華為小米這種自帶魔改rom的國產貨就很難說了,通常需要安裝廠家自己出的usb驅動程序才能連接adb,然而一想到雷猴王的wps全家桶多么喪病我就不想在電腦上裝任何他家的東西。
當然后來有了更加先進的連接adb的方式——wifi連接。只需要敲入幾行命令開啟手機端的adb服務,pc端即可根據手機的ip地址進行adb連接,不用依賴驅動程序,所有品牌的手機都適用,唯一的前提條件是————
ROOT
我去,對Android開發者而言這也算個事?
下面就來介紹怎么使用這種連接方法。
0x1 手動輸入秘笈
首先在手機上安裝一個模擬shell的app,隨便是什么,能像linux的shell一樣執行命令行就可以。
秘笈很簡單:
su
setprop service.adb.tcp.port 5555 stop adbd start adbd
第一行,和linux一樣獲取root權限,我剛才說過你的手機應該已經root了,否則這里會報錯。
第二行設置adb服務端口為5555,這是adb的默認端口。
第三行第四行,重啟adb服務。
如果執行到這里都沒有問題,那么用你覺得方便的方法獲取手機在無線網絡中的ip地址,比如最常見的192.168.0.100
到你的pc機上,打開cmd.exe或其他什么類似的東西,找到adb的存放的路徑,執行以下代碼
adb connect 192.168.0.100
如果你隨后看到
connected to 192.168.0.100
類似的字樣,說明已經連接成功了,你在Android Studio的Android Monitor窗口中應該就能看到你的手機了。
0x2 讓app自動輸入秘笈
在制作粗糙的模擬shell app里用手機觸摸屏上的軟鍵盤輸入了3次這種秘笈以后,我終于不能忍了。為什么不能一鍵讓程序自動替我們輸入這些命令呢?
于是現在我假設在某個布局文件中我們已經有了一個Button,名字叫btn_su,在某個Activity中我們加載了這個布局文件,并且綁定給一個Button對象btnSu
下面設置這個btnSu的點擊事件監聽器
btnSu.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) { // TODO } });
在事件監聽器里面實現啟動adb服務的功能。
首先開啟一個具有root權限的進程:
Process localProcess = Runtime.getRuntime().exec("su");
打開該進程的輸入流
DataOutputStream os = new DataOutputStream(localProcess.getOutputStream());
向該輸入流中寫入如下字符串
os.writeBytes("setprop service.adb.tcp.port 5555\n");
os.writeBytes("stop adbd\n");
os.writeBytes("start adbd\n");
os.flush();
以上代碼相當于向一個具有root權限的shell中寫入如下命令
setprop service.adb.tcp.port 5555 stop adbd start adbd
下面為了更方便的連接電腦進行調試,順便就獲取一下手機的ip地址顯示在屏幕上:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
//判斷wifi是否開啟WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = intToIp(ipAddress);Toast.makeText(MainActivity.this, ip, Toast.LENGTH_LONG).show();
其中intToIp方法想必誰都會寫,這里就不貼出來了。
完整的監聽器onClick實現代碼如下:
@Override
public void onClick(View v) { DataOutputStream os = null; try { Process localProcess = Runtime.getRuntime().exec("su"); os = new DataOutputStream(localProcess.getOutputStream()); os.writeBytes("setprop service.adb.tcp.port 5555\n"); os.writeBytes("stop adbd\n"); os.writeBytes("start adbd\n"); os.flush(); WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); //判斷wifi是否開啟 WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); String ip = intToIp(ipAddress); Toast.makeText(MainActivity.this, ip, Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (os != null) { os.close(); } } catch (IOException e) { } } }
0x3 吐槽
阿里的價值觀到底是什么摸不太透,不過想來我這個玩意極大的提升操作效率豈不是對那些手敲命令行的人不公平,隱約覺得說起價值觀貌似也是分分鐘藥丸。幸好不在阿里工作,否則早就被叉出去了哈哈。
0x4 other
?也可以在手機上安裝豌豆莢app設置無線連接。
?
0x5 other2
1,? 確認本機PC 沒有任何adb 設備連接,包括模擬器和usb連接, 即 使用
“adb devices” 命令后, 列表顯示為空, 這個是為了后面敲命令容易一些
2,? 將遠程android設備接入wifi, 并查看其IP地址:設置—〉無線或網絡---〉WLAN設置—〉按menu鍵并選擇“高級”選項---〉IP 地址? 例如192.168.2.11
3,? 本機command 命令下執行 ping ?192.168.2.11, 如果ping成功,說明可以連接
4,? 執行 adb connect 192.168.2.11
如果顯示連接成功,則可繼續執行后面的操作;如果不成功,如顯示:
unable to connect to 192.168.2.11:5555
有可能是設備監聽端口的問題,則可以在手機終端執行如下命令:
su ?//獲取root權限
setprop service.adb.tcp.port?5555 ? //設置監聽的端口,端口可以自定義,如5554,5555是默認的
stop adbd ? //關閉adbd
start adbd ? //重新啟動adbd
手機終端的下載程序可以在這里下載:http://as.baidu.com/a/item?docid=437072506&f=web_alad_1
?
執行這個的前提是你手機可以root權限,如果沒有root權限仍然不能執行su
獲得root權限的方法很多,手機型號不同,獲取方法也有差別,網上很多方法,這里不再細述(對調試開發者,獲得root權限是非常必要的)
?
5, ?adb connect ip 成功以后可以執行原來usb連接時的所有命令,如adb install, adb logcat等。
?
下面附上adb的常用命令:
?
1,? 開啟adb ?服務
adb start-server
2,? 關閉adb 服務
adb kill-server
3,? 查看設備
adb devices
4,? 安裝軟件
adb install xxx.apk
5,? 卸載軟件
adb uninstall xxx.apk
6,? 進入設備或模擬器
adb shell ?devicename
如果當前只有一個設備,devicename也可以為空
7,? 從電腦上發送文件到設備
adb push? PCfilepath?devicepath
8,? 從設備上copy文件到電腦
adb pull devicepath? PCpath
9,? 查看bug報告
adb bugreport
10, 獲得設備序列ID
adb get-product
11, 查看log
adb logcat