🔌

Androidワイヤレスデバッグをちょっと便利にするツール

2024/01/07に公開

はじめに

adb connect 192.168.x.x:xxxxx してますか?
してますよね?私はしてます。

地味に面倒くさい問題

ワイヤレスデバッグ有効化する毎にポートが変わる

...めんどくせええええええぇぇぇぇぇ そう思ったことが1度はあるんじゃないでしょうか
今回はこの問題をシステム化で解決します

出来上がったもの

  1. ポートスキャン
  2. adb connect
  3. .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})`)
})

使い方

  1. adb_auto_connect.jsなど適当に保存
    • .vscode/launch.jsonを自動更新する場合はプロジェクトルートに保存してください
  2. (vscodeのみ) .vscode/launch.jsonを編集(後述)
  3. 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で使えないので作った)

脚注
  1. .vscode/launch.jsonjsoncというjsonとは違うフォーマットなので安易にパースできない ↩︎

Discussion