用Python脚本+PyInstaller打造轻量级scrcpy启动器(含文件传输)
在Android开发与调试过程中,scrcpy无疑是一款神器——它能够通过USB或Wi-Fi将手机屏幕投射到电脑上,并支持低延迟的鼠标键盘操作。但原生的scrcpy命令行工具缺乏一些实用功能,比如文件传输,而且每次启动都需要输入复杂的参数。市面上虽然有不少GUI封装工具,但往往体积臃肿,功能冗余。
本文将带你用Python脚本封装scrcpy的核心功能,并通过PyInstaller打包成独立的可执行文件。最终产物体积不到7MB,却集成了投屏、录屏、文件传输等实用功能,完全可以替代那些50MB+的GUI工具。
1. 为什么需要自定义scrcpy启动器
scrcpy本身已经非常优秀,但在日常使用中仍有一些痛点:
- 缺乏文件传输功能:虽然adb本身支持文件传输,但每次都需要手动输入命令
- 启动参数复杂:息屏模式、录屏模式等需要记忆不同的参数组合
- 依赖命令行:非技术用户可能对命令行感到畏惧
- GUI工具臃肿:第三方GUI封装往往体积庞大,且功能不一定符合个人需求
我们的Python脚本方案具有以下优势:
| 特性 | 原生scrcpy | 第三方GUI | 我们的方案 |
|---|---|---|---|
| 文件传输 | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
| 体积 | ~15MB | ~50MB | ~7MB |
| 启动便捷性 | 需要命令行 | 一键启动 | 一键启动 |
| 可定制性 | 低 | 中等 | 高 |
| 依赖项 | 需要adb环境 | 自带adb | 自带adb |
2. 核心功能设计
我们的启动器将实现以下核心功能:
- 基础投屏模式:普通显示+触控操作
- 息屏模式:手机屏幕关闭但仍可操作
- 录屏功能:自动保存为带时间戳的mp4文件
- 文件传输:通过拖放操作将文件传输到手机
2.1 项目结构准备
在开始编码前,需要准备好以下目录结构:
scrcpy_launcher/ ├── main.py # 主脚本文件 ├── adb.exe # adb工具 ├── scrcpy.exe # scrcpy主程序 └── file/ # 录屏保存目录提示:确保scrcpy和adb的可执行文件与脚本放在同一目录下,这样可以避免路径问题。
3. Python脚本实现
下面是完整的Python实现代码,我们分段解析关键部分:
import os from datetime import datetime import subprocess def send_command(cmd): """执行adb/scrcpy命令""" subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) def transfer_file(): """处理文件传输""" while True: filepath = input("拖入要传输的文件:") if not filepath: break filename = os.path.basename(filepath) cmd = f".\\adb.exe push \"{filepath}\" /sdcard/Download/scrcpy/{filename}" os.system(cmd)这段代码定义了两个核心函数:
send_command():用于执行scrcpy命令transfer_file():处理文件传输逻辑,支持拖放操作
3.1 模式选择与执行
def normal_mode(): print("普通投屏模式") send_command("scrcpy") transfer_file() def screen_off_mode(): print("息屏投屏模式") send_command("scrcpy -S") transfer_file() def record_mode(): print("录屏模式") timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") send_command(f"scrcpy -r file/{timestamp}.mp4") transfer_file() def record_screen_off_mode(): print("息屏录屏模式") timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") send_command(f"scrcpy -S -r file/{timestamp}.mp4") transfer_file()每种模式都对应不同的scrcpy参数组合:
- 普通模式:
scrcpy - 息屏模式:
scrcpy -S - 录屏模式:
scrcpy -r 文件名 - 息屏录屏:组合使用
-S和-r参数
3.2 用户交互与主逻辑
if __name__ == "__main__": print("scrcpy启动器 v1.0") print("请选择模式:") print("1. 普通模式") print("2. 息屏模式") print("3. 录屏模式") print("4. 息屏录屏模式") choice = input("输入数字选择(默认2): ").strip() if choice == "1": normal_mode() elif choice == "3": record_mode() elif choice == "4": record_screen_off_mode() else: # 默认选择息屏模式 screen_off_mode()4. 使用PyInstaller打包
将Python脚本打包成exe可以方便分享和使用,以下是详细步骤:
4.1 安装PyInstaller
pip install pyinstaller4.2 打包配置
创建打包配置文件build.spec:
# build.spec block_cipher = None a = Analysis(['main.py'], pathex=['.'], binaries=[], datas=[('adb.exe', '.'), ('scrcpy.exe', '.')], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='scrcpy_launcher', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='scrcpy_launcher')关键配置说明:
datas:将adb.exe和scrcpy.exe包含在最终打包文件中upx=True:使用UPX压缩可执行文件,减小体积console=True:保留控制台窗口,方便调试
4.3 执行打包
pyinstaller --onefile --clean build.spec打包完成后,你会在dist目录下得到scrcpy_launcher.exe文件,体积通常在6-8MB之间。
5. 高级功能扩展
基础功能已经足够日常使用,但我们可以进一步扩展:
5.1 添加更多adb功能
def adb_shell(): """进入adb shell""" os.system(".\\adb.exe shell") def screenshot(): """截图并保存到电脑""" timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") os.system(f".\\adb.exe exec-out screencap -p > screenshot_{timestamp}.png") print(f"截图已保存为 screenshot_{timestamp}.png")5.2 支持无线连接
def wireless_connect(): """切换到无线连接模式""" ip = input("输入手机IP地址: ") port = input("输入端口(默认5555): ") or "5555" # 先通过USB连接执行adb tcpip os.system(f".\\adb.exe tcpip {port}") # 断开USB连接 os.system(f".\\adb.exe connect {ip}:{port}") print(f"已连接到 {ip}:{port},现在可以断开USB线")5.3 配置文件支持
添加config.ini支持自定义参数:
[default] resolution = 1280 bitrate = 8M max_fps = 60然后在Python代码中读取配置:
import configparser config = configparser.ConfigParser() config.read('config.ini') resolution = config.get('default', 'resolution', fallback='1280') bitrate = config.get('default', 'bitrate', fallback='8M') max_fps = config.get('default', 'max_fps', fallback='60')6. 实际使用技巧
经过几个月的实际使用,我总结出一些实用技巧:
- 文件传输优化:在手机Download目录创建scrcpy文件夹,所有传输文件都放在这里,方便管理
- 录屏管理:定期清理file目录中的录屏文件,避免占用过多空间
- 无线连接:在家使用时可以设置为无线模式,摆脱线缆束缚
- 快捷键组合:scrcpy本身支持很多快捷键,如:
Ctrl+o:返回Ctrl+h:主页Ctrl+s:切换息屏模式
遇到无法触控的问题时,可以尝试以下adb命令修复:
adb shell pm grant com.android.shell android.permission.WRITE_SECURE_SETTINGS这个轻量级启动器已经成为了我日常开发的必备工具,特别是它的文件传输功能大大提升了工作效率。相比那些庞大的GUI工具,这个6MB的小程序反而更能满足我的实际需求。