diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index b0fc49d2a6..af838d8a58 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -73,6 +73,7 @@ asst::Controller::~Controller() } set_inited(false); + kill_adb_daemon(); #ifndef _WIN32 close(m_pipe_in[PIPE_READ]); @@ -1033,6 +1034,10 @@ bool asst::Controller::connect(const std::string& adb_path, const std::string& a if (connect_ret) { auto& connect_str = connect_ret.value(); is_connect_success = connect_str.find("error") == std::string::npos; + if (connect_str.find("daemon started successfully") != std::string::npos && + connect_str.find("daemon still not running") == std::string::npos) { + m_adb_release = cmd_replace(adb_cfg.release); + } } if (!is_connect_success) { json::value info = get_info_json() | json::object { @@ -1176,7 +1181,7 @@ bool asst::Controller::connect(const std::string& adb_path, const std::string& a m_adb.swipe = cmd_replace(adb_cfg.swipe); m_adb.screencap_raw_with_gzip = cmd_replace(adb_cfg.screencap_raw_with_gzip); m_adb.screencap_encode = cmd_replace(adb_cfg.screencap_encode); - m_adb.release = cmd_replace(adb_cfg.release); + m_adb_release = m_adb.release = cmd_replace(adb_cfg.release); m_adb.start = cmd_replace(adb_cfg.start); m_adb.stop = cmd_replace(adb_cfg.stop); @@ -1241,6 +1246,22 @@ bool asst::Controller::set_inited(bool inited) return true; } +void asst::Controller::kill_adb_daemon() { + if (m_instance_count) return; +#ifndef _WIN32 + if (m_child) +#endif + { + if (!m_adb_release.empty()) { + call_command(m_adb_release, 20000, false, false); + m_adb_release.clear(); + } + else if (!m_adb.release.empty()) { + call_command(m_adb.release, 20000, false, false); + } + } +} + bool asst::Controller::release() { try_to_close_socket(); diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index acfed957ee..e53292dcdd 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -78,6 +78,7 @@ namespace asst bool recv_by_socket = false, bool allow_reconnect = true); int push_cmd(const std::string& cmd); bool release(); + void kill_adb_daemon(); bool set_inited(bool inited); void try_to_close_socket() noexcept; @@ -158,6 +159,8 @@ namespace asst } m_adb; std::string m_uuid; + inline static std::string m_adb_release; // 开了 adb daemon,但是没连上模拟器的时候, + // m_adb 并不会存下 release 的命令,但最后仍然需要一次释放。 std::pair m_scale_size = { WindowWidthDefault, WindowHeightDefault }; double m_control_scale = 1.0; int m_width = 0;