diff --git a/pkg/gadb/device.go b/pkg/gadb/device.go index 75bb376a..d616a654 100644 --- a/pkg/gadb/device.go +++ b/pkg/gadb/device.go @@ -728,7 +728,16 @@ func (d *Device) IsPackageInstalled(packageName string) bool { } func (d *Device) IsPackageRunning(packageName string) bool { - output, err := d.RunShellCommand("pidof", packageName) + packageName = strings.TrimSpace(packageName) + if packageName == "" { + log.Error().Msg("package name is empty, skip checking package running") + return false + } + + // Use ps -ef command with grep to check if package is running + // ps -ef shows full command line which includes package name as argument + // This works for both regular apps and instrumentation test processes + output, err := d.RunShellCommand("ps -ef | grep " + packageName + " | grep -v grep") if err != nil { return false } diff --git a/uixt/android_driver_uia2.go b/uixt/android_driver_uia2.go index d58aa3b0..7c1751ae 100644 --- a/uixt/android_driver_uia2.go +++ b/uixt/android_driver_uia2.go @@ -62,7 +62,7 @@ func (ud *UIA2Driver) Setup() error { localPort, ud.Device.Options.UIA2Port) ud.Session.SetBaseURL(baseURL) - // uiautomator2 server must be started before + // Notice: uiautomator2 server must be started before running test // check uiautomator server package installed if !ud.Device.IsPackageInstalled(ud.Device.Options.UIA2ServerPackageName) { @@ -74,19 +74,19 @@ func (ud *UIA2Driver) Setup() error { "%s not installed", ud.Device.Options.UIA2ServerTestPackageName) } - // TODO: check uiautomator server package running - // if dev.IsPackageRunning(UIA2ServerPackageName) { - // return nil - // } - - // start uiautomator2 server - // Todo: keep-alive - go func() { - if err := ud.startUIA2Server(); err != nil { - log.Fatal().Err(err).Msg("start UIA2 failed") - } - }() - time.Sleep(5 * time.Second) // wait for uiautomator2 server start + // check uiautomator server package running + if ud.Device.IsPackageRunning(ud.Device.Options.UIA2ServerTestPackageName) { + log.Info().Str("package", ud.Device.Options.UIA2ServerTestPackageName). + Msg("uiautomator2 server is already running, skip starting") + } else { + // start uiautomator2 server + go func() { + if err := ud.startUIA2Server(); err != nil { + log.Fatal().Err(err).Msg("start UIA2 failed") + } + }() + time.Sleep(5 * time.Second) // wait for uiautomator2 server start + } // create new session err = ud.InitSession(nil) @@ -604,7 +604,7 @@ func (ud *UIA2Driver) startUIA2Server() error { log.Error().Err(err).Int("retryCount", maxRetries).Msg("start uiautomator server failed, retrying...") } if strings.Contains(out, "Process crashed") { - log.Error().Msg("uiautomator server crashed, retrying...") + log.Error().Str("output", out).Msg("uiautomator server crashed, retrying...") } }