3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Delphi】[小ネタ] WiFi 経由で Android のアプリをデプロイする方法

3
Posted at

はじめに

Android でアプリを作ってデプロイするとき、わざわざ USB で繋がないといけないの面倒くさくないですか!

ADB を使ってデプロイするわけですが、実は ADB は WiFi で端末と接続できます!
じゃあ、Delphi でも WiFi でデプロイすれば良いのでは~!?

準備

ADB に端末と WiFi で繋がってね、とお願いします。
この作業は、Windows を再起動したりして ADB のサービスが起動した時や、端末の IP が変わった時に必要です。
(この後は ADB のサービスが起動している限り有効です)

ですので、その日の開発始める最初にやる感じですかね。

以下のバッチファイルで、この設定が完了します!
全自動です!

※ChatGPT 作
※長いのでコードを折りたたんでいます
↓↓↓

ADB WiFi Connect
ADB_WiFi_Connect.bat
@echo off
setlocal EnableExtensions EnableDelayedExpansion

REM ==================================================
REM ADB のパスを設定してください
REM ==================================================
set "REAL_ADB=C:\Android\SDK\platform-tools\adb.exe"

set "PORT=5555"

"%REAL_ADB%" start-server

set "FOUND=0"
set "SUCCESS=0"
set "FAILED=0"
set "CONNECTED_COUNT=0"

REM ==================================================
REM USB 接続されている端末だけを対象にする
REM WiFi ADB 接続済みの 192.168.x.x:5555 は除外する
REM ==================================================
for /f "skip=1 tokens=1,2" %%A in ('"%REAL_ADB%" devices') do (
    if "%%B"=="device" (
        echo %%A | find ":" >nul
        if errorlevel 1 (
            set /a FOUND+=1

            call :setup_device "%%A"

            if errorlevel 1 (
                set /a FAILED+=1
            ) else (
                set /a SUCCESS+=1
            )
        )
    )
)

echo.
echo ==============================
echo Result
echo   USB devices : !FOUND!
echo   Success     : !SUCCESS!
echo   Failed      : !FAILED!
echo ==============================

echo.
echo ==============================
echo Connected WiFi devices
echo ==============================

if "!CONNECTED_COUNT!"=="0" (
    echo None
) else (
    for /l %%N in (1,1,!CONNECTED_COUNT!) do (
        echo USB !CONNECTED_USB_%%N!  -^>  WiFi !CONNECTED_WIFI_%%N!
    )
)

echo.
REM 必要なら全 ADB 接続一覧も表示
REM echo ==============================
REM echo All ADB devices, including USB
REM echo ==============================
REM "%REAL_ADB%" devices
REM echo.

echo 何かキーを押すと終了します
pause >nul
exit /b 0

REM ==================================================
REM 指定された USB 端末を WiFi ADB 接続に切り替える
REM %1 = USB serial
REM ==================================================
:setup_device
set "USB_SERIAL=%~1"
set "DEVICE_IP="

echo.
echo ==============================
echo USB device: %USB_SERIAL%
echo ==============================

REM ==================================================
REM WiFi の IP アドレスを取得
REM ==================================================
for /f "usebackq tokens=2,4" %%A in (`
    "%REAL_ADB%" -s %USB_SERIAL% shell ip -o -4 addr show scope global
`) do (
    echo %%A | findstr /B /C:"wlan" >nul
    if not errorlevel 1 (
        for /f "tokens=1 delims=/" %%I in ("%%B") do (
            set "DEVICE_IP=%%I"
            goto :got_ip
        )
    )
)

:got_ip
if "%DEVICE_IP%"=="" (
    echo WiFiIP アドレスを取得できませんでした
    echo 端末が WiFi に接続されているか確認してください
    exit /b 1
)

set "WIFI_SERIAL=%DEVICE_IP%:%PORT%"

echo WiFi IP: %DEVICE_IP%
echo TCP/IP モードに切り替え中...
"%REAL_ADB%" -s "%USB_SERIAL%" tcpip %PORT%

if errorlevel 1 (
    echo TCP/IP モードへの切り替えに失敗しました
    exit /b 1
)

timeout /t 2 >nul

echo WiFi 接続中...
"%REAL_ADB%" connect "%WIFI_SERIAL%"

if errorlevel 1 (
    echo WiFi 接続に失敗しました: %WIFI_SERIAL%
    exit /b 1
)

echo 接続完了: %WIFI_SERIAL%

REM ==================================================
REM 今回このバッチで接続した対応関係を記録する
REM 空白区切りのリストではなく、疑似配列にする
REM ==================================================
set /a CONNECTED_COUNT+=1
set "CONNECTED_USB_!CONNECTED_COUNT!=%USB_SERIAL%"
set "CONNECTED_WIFI_!CONNECTED_COUNT!=%WIFI_SERIAL%"

exit /b 0
↑↑↑

注意
ソースのコメントにあるように ADB のパスを設定してください。

REM ==================================================
REM ADB のパスを設定してください
REM ==================================================
set "REAL_ADB=C:\Android\SDK\platform-tools\adb.exe"

Delphi が使う ADB と同じパスを指定してください。
(別の ADB インスタンスだと Delphi がワイヤレスで接続できません)

image.png

実行方法

  1. 端末を USB で接続
  2. 上記のバッチファイル ADB_WiFi_Connect.bat を実行

ADB_WiFi_Connect.bat は、Delphi の「ツール」に登録しておくと便利です。
メニューからワンクリックで実行できます。
image.png

これを実行すると WiFi 経由でアプリをデプロイできます!

Delphi は内部で ADB を呼んでいるだけなので、ADB が WiFi 接続されていれば、ワイヤレスで使えます。

iOS も教えてよ!

iOS は何もしなくても WiFi で繋がります!
実は、実機デバッグは Xcode 17 以降では仕組みが変わっています。

従来は「ケーブル接続」か「WiFi 接続(Connect via network)」を明示的に切り替える必要がありましたが、現在、その設定は不要になりました。

Xcode 17 以降は常にネットワーク経由で実機と通信しています(ケーブル接続の場合でも「USB ネットワーク」として通信しています)。
そのため、特別な設定をしなくても WiFi 経由でデプロイ可能です。

ただし、最初の 1 回だけはケーブルを繋いで Xcode にデバイスを認識させる必要があります。
この初回接続さえ完了すれば、ケーブルなしで自動的に接続されます。

ですが…

Delphi では PAServer / Xcode Command Line Tools のせいでケーブル無し接続ができません!!!!!!
具体的には、PAServer はケーブルが繋がっていないとターゲットデバイスを認識できないため、ワイヤレスだとデバイスが表示されずデプロイできません!!

ターゲットデバイスが表示された後はケーブル抜いても大丈夫ですけどね…

まとめ

Android は ADB の機能でワイヤレスでデプロイできます。
iOS は PAServer のせいでワイヤレスだと端末が認識できません。
(端末を認識した後はワイヤレスでデプロイできます)

終わりに

USB ケーブルで端末と接続するの地味にストレスだったんですよね。
取り回しづらくなるし、机の上がケーブルだらけになるし…
ということで、Android アプリを開発している方はワイヤレスで開発してみてください!

ちなみに、ケーブルだらけ対策としてこんなことしてます。

おまけ

切断用スクリプト

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "REAL_ADB=ADBのパスを指定"

"%REAL_ADB%" start-server

set "COUNT=0"

for /f "skip=1 tokens=1,2" %%A in ('"%REAL_ADB%" devices') do (
    if "%%B"=="device" (
        echo %%A | find ":" >nul
        if not errorlevel 1 (
            echo Disconnect: %%A
            "%REAL_ADB%" disconnect %%A
            set /a COUNT+=1
        )
    )
)

echo.
echo ==============================
echo Disconnected WiFi devices: %COUNT%
echo ==============================
echo.

"%REAL_ADB%" devices

pause
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?