| adb can be configured to work with systemd-style socket activation, |
| allowing the daemon to start automatically when the adb control port |
| is forwarded across a network. You need two files, placed in the usual |
| systemd service directories (e.g., ~/.config/systemd/user for a user |
| service). |
| |
| adb.service: |
| |
| --- START adb.service CUT HERE --- |
| [Unit] |
| Description=adb |
| After=adb.socket |
| Requires=adb.socket |
| [Service] |
| Type=simple |
| # FD 3 is part of the systemd interface |
| ExecStart=/path/to/adb server nodaemon -L acceptfd:3 |
| --- END adb.service CUT HERE --- |
| |
| --- START adb.socket CUT HERE --- |
| [Unit] |
| Description=adb |
| PartOf=adb.service |
| [Socket] |
| ListenStream=127.0.0.1:5037 |
| Accept=no |
| [Install] |
| WantedBy=sockets.target |
| --- END adb.socket CUT HERE --- |
| |
| After installing the adb service, the adb server will be started |
| automatically on any connection to 127.0.0.1:5037 (the default adb |
| control port), even after adb kill-server kills the server. |
| |
| Other "superserver" launcher systems (like macOS launchd) can be |
| configured analogously. The important part is that adb be started with |
| "server" and "nodaemon" command line arguments and that the listen |
| address (passed to -L) name a file descriptor that's ready to |
| accept(2) connections and that's already bound to the desired address |
| and listening. inetd-style pre-accepted sockets do _not_ work in this |
| configuration: the file descriptor passed to acceptfd must be the |
| serve socket, not the accepted connection socket. |