Android手機用wifi連接adb調試的方法
ic_adb_green_black_48dp.png
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窗口中應該就能看到你的手機了。
wifiConnector.JPG
0x2 讓app自動輸入秘笈
在制作粗糙的模擬shell app里用手機觸摸屏上的軟鍵盤輸入了3次這種秘笈以后,我終于不能忍了。為什么不能一鍵讓程序自動替我們輸入這些命令呢?
于是現在我假設在某個布局文件中我們已經有了一個Button,名字叫btn_su,在某個Activity中我們加載了這個布局文件,并且綁定給一個Button對象btnSu
下面設置這個btnSu的點擊事件監聽器
btnSu.setOnClickListener(new View.OnClickListener() {
@Override
public 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 吐槽
阿里的價值觀到底是什么摸不太透,不過想來我這個玩意極大的提升操作效率豈不是對那些手敲命令行的人不公平,隱約覺得說起價值觀貌似也是分分鐘藥丸。幸好不在阿里工作,否則早就被叉出去了哈哈。
來自:http://www.jianshu.com/p/dc6898380e38