perf: ️ Improve the start APP experience

This commit is contained in:
viarotel 2024-11-06 10:29:08 +08:00
parent 9833932be3
commit 29e5e1b6eb
9 changed files with 71 additions and 32 deletions

View File

@ -95,6 +95,7 @@ Windows 及 Linux 端内部集成了 Gnirehtet 用于提供 PC 到安卓设
- 切换键 - 切换键
- 主屏幕 - 主屏幕
- 返回键 - 返回键
- 启动APP
- 关闭屏幕(实验性) - 关闭屏幕(实验性)
- 通知栏 - 通知栏
- 电源键 - 电源键
@ -107,7 +108,7 @@ Windows 及 Linux 端内部集成了 Gnirehtet 用于提供 PC 到安卓设
- 执行脚本 - 执行脚本
- 计划任务 - 计划任务
- 反向供网Gnirehtet - 反向供网Gnirehtet
- 多屏协同 - 多屏协同 (废弃)
## 偏好设置 ## 偏好设置
@ -222,8 +223,9 @@ Windows 及 Linux 端内部集成了 Gnirehtet 用于提供 PC 到安卓设
22. 图形化文件管理器 ✅ 22. 图形化文件管理器 ✅
23. 浮动操作栏 ✅ 23. 浮动操作栏 ✅
24. 增强录制功能 ✅ 24. 增强录制功能 ✅
25. 对设备进行分组 🚧 25. 启动APP(多线程) ✅
26. 游戏键位映射 🚧 26. 对设备进行分组 🚧
27. 游戏键位映射 🚧
## 常见问题 ## 常见问题

View File

@ -93,6 +93,7 @@ Refer to [scrcpy/doc/shortcuts](https://github.com/Genymobile/scrcpy/blob/master
- Switch - Switch
- Home - Home
- Back - Back
- Start APP
- Turn off screen (experimental) - Turn off screen (experimental)
- Notification - Notification
- Power - Power
@ -105,7 +106,7 @@ Refer to [scrcpy/doc/shortcuts](https://github.com/Genymobile/scrcpy/blob/master
- Execution Script - Execution Script
- Scheduled Task - Scheduled Task
- Gnirehtet - Gnirehtet
- Mirror Group - Mirror Group (discard)
## Preferences ## Preferences
@ -220,8 +221,9 @@ Refer to [scrcpy/doc/shortcuts](https://github.com/Genymobile/scrcpy/blob/master
22. Graphical file manager ✅ 22. Graphical file manager ✅
23. Floating control bar ✅ 23. Floating control bar ✅
24. Enhanced recording ✅ 24. Enhanced recording ✅
25. Device grouping 🚧 25. Start APP(Multi-threaded) ✅
26. Game key mapping 🚧 26. Device grouping 🚧
27. Game key mapping 🚧
## FAQ ## FAQ

View File

@ -1,3 +1,6 @@
import appStore from '$electron/helpers/store.js'
import { replaceIP } from '$renderer/utils/index.js'
/** /**
* Parse scrcpy app list output into structured data * Parse scrcpy app list output into structured data
* @param {string} rawText - Raw text output from scrcpy --list-apps command * @param {string} rawText - Raw text output from scrcpy --list-apps command
@ -41,3 +44,15 @@ export function parseScrcpyAppList(rawText) {
return [] return []
} }
} }
/**
* Get the --display-overlay value
* @param {*} serial
* @returns {string}
*/
export function getDisplayOverlay(serial) {
const value = appStore.get(`scrcpy.${replaceIP(serial)}.--display-overlay`)
|| appStore.get('scrcpy.global.--display-overlay')
|| ''
return value
}

View File

@ -2,10 +2,10 @@ import { exec as _exec, spawn } from 'node:child_process'
import util from 'node:util' import util from 'node:util'
import { adbPath, scrcpyPath } from '$electron/configs/index.js' import { adbPath, scrcpyPath } from '$electron/configs/index.js'
import appStore from '$electron/helpers/store.js' import appStore from '$electron/helpers/store.js'
import { replaceIP, sleep } from '$renderer/utils/index.js' import { sleep } from '$renderer/utils/index.js'
import commandHelper from '$renderer/utils/command/index.js' import commandHelper from '$renderer/utils/command/index.js'
import { parseScrcpyAppList } from './helper.js' import { getDisplayOverlay, parseScrcpyAppList } from './helper.js'
let adbkit let adbkit
@ -128,15 +128,12 @@ async function record(serial, { title, args = '', savePath, ...options } = {}) {
} }
async function mirrorGroup(serial, { openNum = 1, ...options } = {}) { async function mirrorGroup(serial, { openNum = 1, ...options } = {}) {
const overlayDisplay const displayOverlay = getDisplayOverlay(serial)
= appStore.get(`scrcpy.${replaceIP(serial)}.--display-overlay`)
|| appStore.get('scrcpy.global.--display-overlay')
|| '1080x1920/320,secure'
const command = `settings put global overlay_display_devices "${[ const command = `settings put global overlay_display_devices "${[
...Array.from({ length: openNum }).keys(), ...Array.from({ length: openNum }).keys(),
] ]
.map(() => overlayDisplay) .map(() => displayOverlay)
.join(';')}"` .join(';')}"`
await adbkit.deviceShell(serial, command) await adbkit.deviceShell(serial, command)
@ -205,7 +202,17 @@ async function getAppList(serial) {
async function startApp(serial, args = {}) { async function startApp(serial, args = {}) {
let { commands, packageName, ...options } = args let { commands, packageName, ...options } = args
commands += ` --new-display --start-app=${packageName}` const displayOverlay = getDisplayOverlay(serial)
commands += ` --new-display`
if (displayOverlay) {
commands += `=${displayOverlay}`
}
if (packageName) {
commands += ` --start-app=${packageName}`
}
const res = await mirror(serial, { ...options, args: commands, signal: /display id: (\d+)/i }) const res = await mirror(serial, { ...options, args: commands, signal: /display id: (\d+)/i })

View File

@ -3,7 +3,6 @@
:hide-on-click="false" :hide-on-click="false"
:disabled="loading || floating" :disabled="loading || floating"
max-height="300px" max-height="300px"
@command="handleCommand"
@mouseenter="getAppData" @mouseenter="getAppData"
> >
<slot :loading :trigger="handleTrigger" /> <slot :loading :trigger="handleTrigger" />
@ -14,6 +13,9 @@
v-for="item of options" v-for="item of options"
:key="item.value" :key="item.value"
:command="item.value" :command="item.value"
:divided="item.divided"
:icon="item.icon"
@click="handleCommand(item)"
> >
{{ $t(item.label) }} {{ $t(item.label) }}
</el-dropdown-item> </el-dropdown-item>
@ -47,6 +49,17 @@ export default {
label: item.name, label: item.name,
value: item.packageName, value: item.packageName,
})) }))
value.unshift({
label: this.$t('device.control.home'),
value: '',
icon: 'HomeFilled',
})
if (value[1]) {
value[1].divided = true
}
return value return value
}, },
}, },
@ -79,10 +92,10 @@ export default {
options, options,
}) })
}, },
async handleCommand(value) { async handleCommand({ label, value }) {
this.loading = true this.loading = true
const title = this.$store.device.getLabel(this.device, 'mirror') const title = `${this.$store.device.getLabel(this.device, 'synergy')}-${label}`
const commands = this.$store.preference.scrcpyParameter(this.device.id, { const commands = this.$store.preference.scrcpyParameter(this.device.id, {
excludes: ['--otg', '--mouse=aoa', '--keyboard=aoa'], excludes: ['--otg', '--mouse=aoa', '--keyboard=aoa'],

View File

@ -135,7 +135,7 @@
"device.control.name": "Control", "device.control.name": "Control",
"device.control.more": "More Controls", "device.control.more": "More Controls",
"device.control.install": "Install App", "device.control.install": "Install APP",
"device.control.install.placeholder": "Select app to install", "device.control.install.placeholder": "Select app to install",
"device.control.install.progress": "Installing app to {deviceName}...", "device.control.install.progress": "Installing app to {deviceName}...",
"device.control.install.success": "Successfully installed {totalCount} apps to {deviceName}, {successCount} succeeded, {failCount} failed", "device.control.install.success": "Successfully installed {totalCount} apps to {deviceName}, {successCount} succeeded, {failCount} failed",
@ -294,8 +294,8 @@
"preferences.device.control-in-stop-charging.placeholder": "Stop charging when controlling", "preferences.device.control-in-stop-charging.placeholder": "Stop charging when controlling",
"preferences.device.control-in-stop-charging.tips": "Stop charging when controlling", "preferences.device.control-in-stop-charging.tips": "Stop charging when controlling",
"preferences.device.display-overlay.name": "Simulated Display", "preferences.device.display-overlay.name": "Simulated Display",
"preferences.device.display-overlay.placeholder": "1080x1920/320,secure", "preferences.device.display-overlay.placeholder": "Device Size, Format: 1920x1080/420, 1920x1080, /240",
"preferences.device.display-overlay.tips": "Size and resolution of simulated secondary display, Mirroring group relies on this option", "preferences.device.display-overlay.tips": "Used to adjust the size and resolution of simulated auxiliary displays, launching applications and multi-screen collaboration (mirroring group) depend on this option",
"preferences.window.name": "Window", "preferences.window.name": "Window",
"preferences.window.borderless.name": "Borderless", "preferences.window.borderless.name": "Borderless",

View File

@ -135,7 +135,7 @@
"device.control.name": "Управление", "device.control.name": "Управление",
"device.control.more": "Дополнительные элементы управления", "device.control.more": "Дополнительные элементы управления",
"device.control.install": "Установить приложение", "device.control.install": "Установить APP",
"device.control.install.placeholder": "Выберите приложение для установки", "device.control.install.placeholder": "Выберите приложение для установки",
"device.control.install.progress": "Установка приложения на {deviceName}...", "device.control.install.progress": "Установка приложения на {deviceName}...",
"device.control.install.success": "Успешно установлено {totalCount} приложений на {deviceName}, успешно: {successCount}, неудачно: {failCount}", "device.control.install.success": "Успешно установлено {totalCount} приложений на {deviceName}, успешно: {successCount}, неудачно: {failCount}",
@ -169,7 +169,7 @@
"device.control.reboot": "Перезагрузить", "device.control.reboot": "Перезагрузить",
"device.control.turnScreenOff": "Выключить экран", "device.control.turnScreenOff": "Выключить экран",
"device.control.turnScreenOff.tips": "Отключение экрана с сохранением контроля (экспериментально): это действие создаст процесс EscrcpyHelper; при ручном завершении этого процесса экран снова включится.", "device.control.turnScreenOff.tips": "Отключение экрана с сохранением контроля (экспериментально): это действие создаст процесс EscrcpyHelper; при ручном завершении этого процесса экран снова включится.",
"device.control.startApp": "Start APP", "device.control.startApp": "Запустить APP",
"device.control.power": "Питание", "device.control.power": "Питание",
"device.control.power.tips": "Включить/выключить экран", "device.control.power.tips": "Включить/выключить экран",
"device.control.notification": "Уведомление", "device.control.notification": "Уведомление",
@ -294,8 +294,8 @@
"preferences.device.control-in-stop-charging.placeholder": "Остановить зарядку при управлении", "preferences.device.control-in-stop-charging.placeholder": "Остановить зарядку при управлении",
"preferences.device.control-in-stop-charging.tips": "Остановить зарядку при управлении", "preferences.device.control-in-stop-charging.tips": "Остановить зарядку при управлении",
"preferences.device.display-overlay.name": "Эмуляция дисплея", "preferences.device.display-overlay.name": "Эмуляция дисплея",
"preferences.device.display-overlay.placeholder": "1080x1920/320, secure", "preferences.device.display-overlay.placeholder": "Размер устройства, Формат: 1920x1080/420, 1920x1080, /240",
"preferences.device.display-overlay.tips": "Размер и разрешение эмулируемого вторичного дисплея, функция группы зеркалирования зависит от этой опции", "preferences.device.display-overlay.tips": "Используется для настройки размера и разрешения симулируемых вспомогательных дисплеев, запуск приложений и многоэкранное взаимодействие (группа зеркалирования) зависят от этой опции",
"preferences.window.name": "Окно", "preferences.window.name": "Окно",
"preferences.window.borderless.name": "Без рамки", "preferences.window.borderless.name": "Без рамки",

View File

@ -135,7 +135,7 @@
"device.control.name": "操作", "device.control.name": "操作",
"device.control.more": "设备交互", "device.control.more": "设备交互",
"device.control.install": "安装应用", "device.control.install": "安装APP",
"device.control.install.placeholder": "请选择要安装的应用", "device.control.install.placeholder": "请选择要安装的应用",
"device.control.install.progress": "正在为 {deviceName} 安装应用中...", "device.control.install.progress": "正在为 {deviceName} 安装应用中...",
"device.control.install.success": "已成功将应用安装到 {deviceName} 中,共 {totalCount}个,成功 {successCount}个,失败 {failCount}个", "device.control.install.success": "已成功将应用安装到 {deviceName} 中,共 {totalCount}个,成功 {successCount}个,失败 {failCount}个",
@ -169,7 +169,7 @@
"device.control.reboot": "重启设备", "device.control.reboot": "重启设备",
"device.control.turnScreenOff": "关闭屏幕", "device.control.turnScreenOff": "关闭屏幕",
"device.control.turnScreenOff.tips": "关闭屏幕且保持控制(实验功能):此操作将创建一个 EscrcpyHelper 进程,手动关闭进程将重新打开屏幕。", "device.control.turnScreenOff.tips": "关闭屏幕且保持控制(实验功能):此操作将创建一个 EscrcpyHelper 进程,手动关闭进程将重新打开屏幕。",
"device.control.startApp": "启动应用", "device.control.startApp": "启动APP",
"device.control.power": "电源键", "device.control.power": "电源键",
"device.control.power.tips": "可以用来开启或关闭屏幕", "device.control.power.tips": "可以用来开启或关闭屏幕",
"device.control.notification": "通知栏", "device.control.notification": "通知栏",
@ -294,8 +294,8 @@
"preferences.device.control-in-stop-charging.placeholder": "开启后控制设备时将禁用自动亮屏", "preferences.device.control-in-stop-charging.placeholder": "开启后控制设备时将禁用自动亮屏",
"preferences.device.control-in-stop-charging.tips": "开启后控制设备时将禁用自动亮屏", "preferences.device.control-in-stop-charging.tips": "开启后控制设备时将禁用自动亮屏",
"preferences.device.display-overlay.name": "模拟辅助显示器", "preferences.device.display-overlay.name": "模拟辅助显示器",
"preferences.device.display-overlay.placeholder": "1080x1920/320,secure", "preferences.device.display-overlay.placeholder": "设备大小格式1920x1080/4201920x1080/240",
"preferences.device.display-overlay.tips": "用于调整模拟辅助显示器的大小和分辨率,多屏协同(镜像组)依赖于此选项", "preferences.device.display-overlay.tips": "用于调整模拟辅助显示器的大小和分辨率,启动应用、多屏协同(镜像组)依赖于此选项",
"preferences.window.name": "窗口控制", "preferences.window.name": "窗口控制",
"preferences.window.borderless.name": "无边框模式", "preferences.window.borderless.name": "无边框模式",

View File

@ -135,7 +135,7 @@
"device.control.name": "操作", "device.control.name": "操作",
"device.control.more": "裝置互動", "device.control.more": "裝置互動",
"device.control.install": "安裝應用程式", "device.control.install": "安裝APP",
"device.control.install.placeholder": "請選擇要安裝的應用程式", "device.control.install.placeholder": "請選擇要安裝的應用程式",
"device.control.install.progress": "正在為 {deviceName} 安裝應用程式中...", "device.control.install.progress": "正在為 {deviceName} 安裝應用程式中...",
"device.control.install.success": "已成功將應用程式安裝到 {deviceName} 中,共 {totalCount} 個,成功 {successCount} 個,失敗 {failCount} 個", "device.control.install.success": "已成功將應用程式安裝到 {deviceName} 中,共 {totalCount} 個,成功 {successCount} 個,失敗 {failCount} 個",
@ -169,7 +169,7 @@
"device.control.reboot": "重啟裝置", "device.control.reboot": "重啟裝置",
"device.control.turnScreenOff": "關閉螢幕", "device.control.turnScreenOff": "關閉螢幕",
"device.control.turnScreenOff.tips": "關閉螢幕且保持控制(實驗功能):此操作將創建一個 EscrcpyHelper 進程,手動關閉該進程將重新打開螢幕。", "device.control.turnScreenOff.tips": "關閉螢幕且保持控制(實驗功能):此操作將創建一個 EscrcpyHelper 進程,手動關閉該進程將重新打開螢幕。",
"device.control.startApp": "Start APP", "device.control.startApp": "啟動APP",
"device.control.power": "電源鍵", "device.control.power": "電源鍵",
"device.control.power.tips": "可以用來開啟或關閉螢幕", "device.control.power.tips": "可以用來開啟或關閉螢幕",
"device.control.notification": "通知欄", "device.control.notification": "通知欄",
@ -294,8 +294,8 @@
"preferences.device.control-in-stop-charging.placeholder": "開啟後控制裝置時將停用自動亮螢幕", "preferences.device.control-in-stop-charging.placeholder": "開啟後控制裝置時將停用自動亮螢幕",
"preferences.device.control-in-stop-charging.tips": "開啟後控制裝置時將停用自動亮螢幕", "preferences.device.control-in-stop-charging.tips": "開啟後控制裝置時將停用自動亮螢幕",
"preferences.device.display-overlay.name": "模擬輔助顯示器", "preferences.device.display-overlay.name": "模擬輔助顯示器",
"preferences.device.display-overlay.placeholder": "1080x1920/320,secure", "preferences.device.display-overlay.placeholder": "設備大小格式1920x1080/4201920x1080/240",
"preferences.device.display-overlay.tips": "用於調整模擬輔助顯示器的大小和解析度,多螢幕協同(鏡像組)依於此選項", "preferences.device.display-overlay.tips": "用於調整模擬輔助顯示器的大小和解析度,啟動應用程式、多螢幕協同(鏡像組)依於此選項",
"preferences.window.name": "視窗控制", "preferences.window.name": "視窗控制",
"preferences.window.borderless.name": "無邊框模式", "preferences.window.borderless.name": "無邊框模式",