perf: 使用 devices 判断是否需要连接 (#10606)

* perf: 使用 devices 判断是否需要连接

* chore: 判断是否存在捕获组
This commit is contained in:
uye
2024-09-14 14:29:01 +08:00
committed by GitHub
parent a99c900658
commit 34a2b083d8
4 changed files with 51 additions and 14 deletions

View File

@@ -83,6 +83,8 @@ bool asst::GeneralConfig::parse(const json::value& json)
const AdbCfg& base_cfg = base_name.empty() ? AdbCfg() : m_adb_cfg.at(base_name);
AdbCfg& adb = m_adb_cfg[cfg_json.at("configName").as_string()];
adb.devices = cfg_json.get("devices", base_cfg.devices);
adb.address_regex = cfg_json.get("addressRegex", base_cfg.address_regex);
adb.connect = cfg_json.get("connect", base_cfg.connect);
adb.display_id = cfg_json.get("displayId", base_cfg.display_id);
adb.uuid = cfg_json.get("uuid", base_cfg.uuid);

View File

@@ -65,6 +65,8 @@ struct Options
struct AdbCfg
{
/* command */
std::string devices;
std::string address_regex;
std::string connect;
std::string display_id;
std::string uuid;

View File

@@ -21,6 +21,8 @@
#include "Utils/Platform.hpp"
#include "Utils/StringMisc.hpp"
#include <regex>
asst::AdbController::AdbController(const AsstCallback& callback, Assistant* inst, PlatformType type)
: InstHelper(inst)
, m_callback(callback)
@@ -754,29 +756,58 @@ bool asst::AdbController::connect(
/* connect */
{
m_adb.connect = cmd_replace(adb_cfg.connect);
m_adb.release = cmd_replace(adb_cfg.release);
auto connect_ret =
call_command(m_adb.connect, 60LL * 1000, false /* adb 连接时不允许重试 */);
bool is_connect_success = false;
if (connect_ret) {
auto& connect_str = connect_ret.value();
// 检查连接字符串是否包含 "connected" 或 "device"
is_connect_success = connect_str.find("connected") != std::string::npos ||
connect_str.find("device") != std::string::npos;
if (connect_str.find("daemon started successfully") != std::string::npos
&& connect_str.find("daemon still not running") == std::string::npos) {
// 先用 devices 读取输出
m_adb.devices = cmd_replace(adb_cfg.devices);
m_adb.address_regex = cmd_replace(adb_cfg.address_regex);
auto devices_ret = call_command(m_adb.devices, 60LL * 1000, false);
bool need_connect = true;
if (devices_ret) {
const auto& devices_str = devices_ret.value();
const std::regex address_regex(m_adb.address_regex);
for (std::sregex_iterator iter(devices_str.begin(), devices_str.end(), address_regex), end; iter != end; ++iter) {
if (iter->size() > 1 && iter->str(1) == address) {
need_connect = false;
break;
}
}
}
if (!is_connect_success) {
// 如果不包含 `:` 且需要连接connect 命令也不会成功
if (address.find(':') == std::string::npos && need_connect) {
json::value info = get_info_json()
| json::object {
{ "what", "ConnectFailed" },
{ "why", "Connection command failed to exec" },
{ "why", "Address does not contain ':' and no devices found" },
};
callback(AsstMsg::ConnectionInfo, info);
return false;
}
if (need_connect) {
m_adb.connect = cmd_replace(adb_cfg.connect);
m_adb.release = cmd_replace(adb_cfg.release);
auto connect_ret =
call_command(m_adb.connect, 60LL * 1000, false /* adb 连接时不允许重试 */);
bool is_connect_success = false;
if (connect_ret) {
auto& connect_str = connect_ret.value();
// 检查连接字符串是否包含 "connected"
is_connect_success = connect_str.find("connected") != std::string::npos;
// NOTE:这玩意啥都没干,有什么用吗?
if (connect_str.find("daemon started successfully") != std::string::npos
&& connect_str.find("daemon still not running") == std::string::npos) {
}
}
if (!is_connect_success) {
json::value info = get_info_json()
| json::object {
{ "what", "ConnectFailed" },
{ "why", "Connection command failed to exec" },
};
callback(AsstMsg::ConnectionInfo, info);
return false;
}
}
}
if (need_exit()) {

View File

@@ -119,6 +119,8 @@ protected:
struct AdbProperty
{
/* command */
std::string devices;
std::string address_regex;
std::string connect;
std::string call_minitouch;
std::string call_maatouch;