Androidワイヤレスデバッグをちょっと便利にするツール
はじめに
adb connect 192.168.x.x:xxxxx
してますか?
してますよね?私はしてます。
地味に面倒くさい問題
ワイヤレスデバッグ有効化する毎にポートが変わる
...めんどくせええええええぇぇぇぇぇ そう思ったことが1度はあるんじゃないでしょうか
今回はこの問題をシステム化で解決します
出来上がったもの
- ポートスキャン
adb connect
-
.vscode/launch.json
の更新
を行ってくれる
解決方法
前提条件
- 端末のIPアドレスを固定化する必要があります
- Node.js, namp, adbを導入する必要があります
- 自分用に作ったのでエラーハンドリングなど皆無です
作ったツール
今回は上記の通りツールを作る必要があるので.....
作ったものがこちらになります
適当な場所に保存してご利用ください
const fs = require('fs')
const path = require('path')
const { spawn, exec } = require('child_process')
const { promisify } = require('util')
const execAsync = promisify(exec)
const reRegExp = /[\\^$.*+?()[\]{}|]/g
const reHasRegExp = new RegExp(reRegExp.source)
function escapeRegExp(string) {
return (string && reHasRegExp.test(string))
? string.replace(reRegExp, '\\$&')
: string
}
const host = process.argv[2]
if (host === undefined) {
console.error(`Usage: node ${path.basename(__filename)} <host>`)
process.exit(1)
}
console.log(`Host: ${host}`)
console.log('Searching port...')
let portFound = false
let launchJson = null
const vscodeLaunchJsonFilePath = path.join(__dirname, '.vscode', 'launch.json')
try {
launchJson = fs.readFileSync(vscodeLaunchJsonFilePath, 'utf8')
} catch (err) {
// ファイル無いとかそういうエラーなので無視
}
const nmap = spawn('nmap', [host, '-p', '35000-44000', '-sS', '-oG', '-', '--defeat-rst-ratelimit'])
nmap.stdout.on('data', async (data) => {
const text = data.toString()
if (text.includes('/open/tcp/') === false) return
const result = text.match(/Ports: (?<port>[0-9]+)\/open\//)
const port = result.groups?.port
if (port === undefined) return
portFound = true
console.log(`Found port: ${port}`)
await execAsync(`adb connect ${host}:${port}`)
console.log(`Connected: ${host}:${port}`)
if (launchJson !== null) {
console.log('Updating launch.json...')
const replacedJson = launchJson.replace(new RegExp(`"deviceId": "${escapeRegExp(host)}:[0-9]+"`), `"deviceId": "${host}:${port}"`)
fs.writeFileSync(vscodeLaunchJsonFilePath, replacedJson, 'utf8');
}
})
nmap.on('close', (code) => {
if (portFound) return
console.log(`Port not found. (code: ${code})`)
})
使い方
-
adb_auto_connect.js
など適当に保存-
.vscode/launch.json
を自動更新する場合はプロジェクトルートに保存してください
-
- (vscodeのみ)
.vscode/launch.json
を編集(後述) - Terminalから
node ./adb_auto_connect.js 端末のIPアドレス
のように実行
以下のようになれば自動的にadb connect
されており、.vscode/launch.json
も更新されています
Host: 192.168.x.x
Searching port...
Found port: 43825
Connected: 192.168.x.x:43825
Updating launch.json...
.vscode/launch.json
の編集方法
こんなファイルを...
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "🤳 Pixel 7",
"request": "launch",
"type": "dart",
"deviceId": "IPアドレス:0"
},
]
}
以下のように編集しておく必要があります(flutterの場合です。他は試してません)
"deviceId": "IPアドレス:0"
この部分がキモで、指定したHostと一致したportを勝手に更新してくれます
※初回の1度だけでokです
おわりに
今回はnpmパッケージを使用しないという縛り付きで実装してみました。
というのも、ファイル一つで完結させたかったからです。
その為、.vscode/launch.json
の解析に正規表現を用いて実装しており、少しだけ悔いがあります。[1]
本ツールを使った方はぜひコメントやいいねお願いします!
よきDeveloper lifeを!!!
動作確認済みバージョン
Node.js: 20.10.0
Nmap: 7.92
adb: Windows 10.0.22631
参考
Auto-connect to ADB Wireless Debugging on Android 11 | Max Ammann
(実はこのページにshellワンライナー書いてあるがwindowsで使えないので作った)
-
.vscode/launch.json
はjsoncというjsonとは違うフォーマットなので安易にパースできない ↩︎
Discussion