From 37cbfacc2debf16bb1efe4c91537771247ef471d Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 11 Oct 2024 20:57:09 +0800 Subject: [PATCH] feat: check android uiautomator server package installed --- hrp/code/code.go | 4 +++ hrp/internal/version/VERSION | 2 +- hrp/pkg/gadb/device.go | 2 +- hrp/pkg/gadb/device_test.go | 2 +- hrp/pkg/uixt/android_device.go | 47 ++++++++++++++++++++++++++-------- hrp/pkg/uixt/android_test.go | 1 + 6 files changed, 45 insertions(+), 13 deletions(-) diff --git a/hrp/code/code.go b/hrp/code/code.go index cfdca007..da2619da 100644 --- a/hrp/code/code.go +++ b/hrp/code/code.go @@ -77,6 +77,8 @@ var ( // UI automation related: [70, 80) var ( + MobileUIDriverAppNotInstalled = errors.New("mobile UI driver app not installed") // 68 + MobileUIDriverAppCrashed = errors.New("mobile UI driver app crashed") // 69 MobileUIDriverError = errors.New("mobile UI driver error") // 70 MobileUILaunchAppError = errors.New("mobile UI launch app error") // 71 MobileUITapError = errors.New("mobile UI tap error") // 72 @@ -168,6 +170,8 @@ var errorsMap = map[error]int{ DeviceUIResponseSlow: 67, // UI automation related + MobileUIDriverAppNotInstalled: 68, + MobileUIDriverAppCrashed: 69, MobileUIDriverError: 70, MobileUILaunchAppError: 71, MobileUITapError: 72, diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 0318f9a4..15bdb9c4 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2410091557 +v5.0.0-beta-2410112057 diff --git a/hrp/pkg/gadb/device.go b/hrp/pkg/gadb/device.go index 76d9371e..7d6998e9 100644 --- a/hrp/pkg/gadb/device.go +++ b/hrp/pkg/gadb/device.go @@ -675,7 +675,7 @@ func (d *Device) ListPackages() ([]string, error) { return packages, nil } -func (d *Device) IsPackagesInstalled(packageName string) bool { +func (d *Device) IsPackageInstalled(packageName string) bool { packages, err := d.ListPackages() if err != nil { return false diff --git a/hrp/pkg/gadb/device_test.go b/hrp/pkg/gadb/device_test.go index 9692f799..a8038e29 100644 --- a/hrp/pkg/gadb/device_test.go +++ b/hrp/pkg/gadb/device_test.go @@ -349,7 +349,7 @@ func TestDevice_ListPackages(t *testing.T) { t.Fatal(err) } t.Log(res) - installed := dev.IsPackagesInstalled("io.appium.uiautomator2.server") + installed := dev.IsPackageInstalled("io.appium.uiautomator2.server") if err != nil { t.Fatal(err) } diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 4c8c84be..35d4c3eb 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -115,8 +115,6 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO return } -// uiautomator2 server must be started before -// adb shell am instrument -w $UIA2ServerPackageName func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, err error) { device = &AndroidDevice{ UIA2IP: UIA2ServerHost, @@ -210,8 +208,26 @@ func (dev *AndroidDevice) Init() error { dev.d.RunShellCommand("rm", "-r", env.DeviceActionLogFilePath) if dev.UIA2 { + // uiautomator2 server must be started before + var packageName string + if strings.Contains(dev.UIA2Package, "/") { + packageName = strings.Split(dev.UIA2Package, "/")[0] + } else { + packageName = dev.UIA2Package + } + + // check uiautomator server package installed + if !dev.d.IsPackageInstalled(packageName) { + return errors.Wrap(code.MobileUIDriverAppNotInstalled, + "uiautomator server package not installed") + } + // start uiautomator2 server - go dev.startUIA2Server() + go func() { + if err := dev.startUIA2Server(); err != nil { + log.Error().Err(err).Msg("start UIA2 failed") + } + }() } return nil } @@ -378,7 +394,7 @@ func (dev *AndroidDevice) Install(appPath string, opts *InstallOptions) error { case "vivo": return dev.installVivoSilent(app, args...) case "oppo", "realme", "oneplus": - if dev.d.IsPackagesInstalled(EvalInstallerPackageName) { + if dev.d.IsPackageInstalled(EvalInstallerPackageName) { return dev.installViaInstaller(app, args...) } log.Warn().Msg("oppo not install eval installer") @@ -534,13 +550,24 @@ func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) { } func (dev *AndroidDevice) startUIA2Server() error { - log.Info().Msgf("start uiautomator server %s", dev.UIA2Package) - out, err := dev.d.RunShellCommand("am", "instrument", "-w", dev.UIA2Package) - if strings.Contains(out, "Process crashed") { - log.Error().Msg("uiautomator server crashed, restart...") - return dev.startUIA2Server() + const maxRetries = 3 + for attempt := 1; attempt <= maxRetries; attempt++ { + log.Info().Str("package", dev.UIA2Package). + Int("attempt", attempt).Msg("start uiautomator server") + // $ adb shell am instrument -w $UIA2ServerPackageName + // -w: wait for instrumentation to finish before returning. + // Required for test runners. + out, err := dev.d.RunShellCommand("am", "instrument", "-w", dev.UIA2Package) + if err != nil { + return errors.Wrap(err, "start uiautomator server failed") + } + if strings.Contains(out, "Process crashed") { + log.Error().Msg("uiautomator server crashed, retrying...") + } } - return err + + return errors.Wrapf(code.MobileUIDriverAppCrashed, + "uiautomator server crashed %d times", maxRetries) } func (dev *AndroidDevice) stopUIA2Server() error { diff --git a/hrp/pkg/uixt/android_test.go b/hrp/pkg/uixt/android_test.go index 8e6f4aa2..930b1d66 100644 --- a/hrp/pkg/uixt/android_test.go +++ b/hrp/pkg/uixt/android_test.go @@ -384,6 +384,7 @@ func TestDriver_AppLaunch(t *testing.T) { func TestDriver_IsAppInForeground(t *testing.T) { setupAndroidUIA2Driver(t) + // setupAndroidAdbDriver(t) err := driverExt.Driver.AppLaunch("com.android.settings") checkErr(t, err)