From 7c92f23bf40111981c2dcbc2b8dbb7c9428411f0 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Sun, 29 Sep 2024 15:26:02 +0800 Subject: [PATCH 1/9] feat: add hrp code DeviceConfigureError --- hrp/code/code.go | 2 ++ hrp/internal/version/VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hrp/code/code.go b/hrp/code/code.go index e6301196..7b8b744c 100644 --- a/hrp/code/code.go +++ b/hrp/code/code.go @@ -67,6 +67,7 @@ var ( DeviceHTTPDriverError = errors.New("device HTTP driver error") // 51 DeviceUSBDriverError = errors.New("device USB driver error") // 52 DeviceGetInfoError = errors.New("device get info error") // 60 + DeviceConfigureError = errors.New("device configure error") // 61 DeviceShellExecError = errors.New("device shell exec error") // 62 DeviceOfflineError = errors.New("device offline") // 63 DeviceScreenShotError = errors.New("device screenshot error") // 65 @@ -159,6 +160,7 @@ var errorsMap = map[error]int{ DeviceHTTPDriverError: 51, DeviceUSBDriverError: 52, DeviceGetInfoError: 60, + DeviceConfigureError: 61, DeviceShellExecError: 62, DeviceOfflineError: 63, DeviceScreenShotError: 65, diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 9ede1e15..1db6eefb 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2409271505 +v5.0.0-beta-2409291526 From a4d45bbaa375a12c4c9d4f3927f104c64ac7a09d Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Tue, 1 Oct 2024 21:18:50 +0800 Subject: [PATCH 2/9] change: add ctx to driver --- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/ext.go | 2 ++ hrp/pkg/uixt/interface.go | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 1db6eefb..275ba70c 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2409291526 +v5.0.0-beta-2410012118 diff --git a/hrp/pkg/uixt/ext.go b/hrp/pkg/uixt/ext.go index cae5a85a..3d2ebbf2 100644 --- a/hrp/pkg/uixt/ext.go +++ b/hrp/pkg/uixt/ext.go @@ -1,6 +1,7 @@ package uixt import ( + "context" _ "image/gif" _ "image/png" @@ -13,6 +14,7 @@ import ( ) type DriverExt struct { + Ctx context.Context Device IDevice Driver IWebDriver ImageService IImageService // used to extract image data diff --git a/hrp/pkg/uixt/interface.go b/hrp/pkg/uixt/interface.go index 2b2ab451..adc4c578 100644 --- a/hrp/pkg/uixt/interface.go +++ b/hrp/pkg/uixt/interface.go @@ -481,6 +481,8 @@ type IDevice interface { Init() error // init android device UUID() string // ios udid or android serial LogEnabled() bool + + // TODO: add ctx to NewDriver NewDriver(...DriverOption) (driverExt *DriverExt, err error) StartPerf() error From 0e835be6511e286aa1d382139eadae3270783c06 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Thu, 3 Oct 2024 00:06:59 +0800 Subject: [PATCH 3/9] change: update code --- hrp/code/code.go | 4 ++-- hrp/internal/version/VERSION | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hrp/code/code.go b/hrp/code/code.go index 7b8b744c..cfdca007 100644 --- a/hrp/code/code.go +++ b/hrp/code/code.go @@ -97,7 +97,7 @@ var ( CVResponseError = errors.New("CV parse response error") // 83 CVResultNotFoundError = errors.New("CV result not found") // 84 - ContextUnknowError = errors.New("detect context failed") // 85 + StateUnknowError = errors.New("detect state failed") // 85 ) // trackings related: [90, 100) @@ -185,7 +185,7 @@ var errorsMap = map[error]int{ CVServiceConnectionError: 82, CVResponseError: 83, CVResultNotFoundError: 84, - ContextUnknowError: 85, + StateUnknowError: 85, // trackings related TrackingGetError: 90, diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 275ba70c..c4df1f16 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2410012118 +v5.0.0-beta-2410030007 From 56c2b33b79a4ea3c3f1ed253bde90733fa9fdb20 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Wed, 9 Oct 2024 15:09:08 +0800 Subject: [PATCH 4/9] feat: start/stop UIA2 server --- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/android_device.go | 39 +++++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index c4df1f16..2d31c894 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2410030007 +v5.0.0-beta-2410091526 diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 22b41b64..37d5a96f 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -29,11 +29,17 @@ import ( ) var ( - DouyinServerPort = 32316 - AdbServerHost = "localhost" - AdbServerPort = gadb.AdbServerPort // 5037 - UIA2ServerHost = "localhost" - UIA2ServerPort = 6790 + DouyinServerPort = 32316 + + // adb server + AdbServerHost = "localhost" + AdbServerPort = gadb.AdbServerPort // 5037 + + // uiautomator2 server + UIA2ServerHost = "localhost" + UIA2ServerPort = 6790 + UIA2ServerPackageName = "io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner" + EvalInstallerPackageName = "sogou.mobile.explorer" InstallViaInstallerCommand = "am start -S -n sogou.mobile.explorer/.PackageInstallerActivity -d" ) @@ -101,11 +107,12 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO } // uiautomator2 server must be started before -// adb shell am instrument -w io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner +// adb shell am instrument -w $UIA2ServerPackageName func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, err error) { device = &AndroidDevice{ - UIA2IP: UIA2ServerHost, - UIA2Port: UIA2ServerPort, + UIA2IP: UIA2ServerHost, + UIA2Port: UIA2ServerPort, + UIA2Package: UIA2ServerPackageName, } for _, option := range options { option(device) @@ -184,6 +191,7 @@ type AndroidDevice struct { UIA2 bool `json:"uia2,omitempty" yaml:"uia2,omitempty"` // use uiautomator2 UIA2IP string `json:"uia2_ip,omitempty" yaml:"uia2_ip,omitempty"` // uiautomator2 server ip UIA2Port int `json:"uia2_port,omitempty" yaml:"uia2_port,omitempty"` // uiautomator2 server port + UIA2Package string `json:"uia2_package,omitempty" yaml:"uia2_package,omitempty"` LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"` IgnorePopup bool `json:"ignore_popup,omitempty" yaml:"ignore_popup,omitempty"` } @@ -191,6 +199,11 @@ type AndroidDevice struct { func (dev *AndroidDevice) Init() error { dev.d.RunShellCommand("ime", "enable", "io.appium.settings/.UnicodeIME") dev.d.RunShellCommand("rm", "-r", env.DeviceActionLogFilePath) + + if dev.UIA2Package != "" { + // start uiautomator2 server + return dev.startUIA2Server() + } return nil } @@ -511,6 +524,16 @@ func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) { return "", errors.New("failed to get package md5") } +func (dev *AndroidDevice) startUIA2Server() error { + _, err := dev.d.RunShellCommand("am", "instrument", "-w", UIA2ServerPackageName) + return err +} + +func (dev *AndroidDevice) stopUIA2Server() error { + _, err := dev.d.RunShellCommand("am", "force-stop", UIA2ServerPackageName) + return err +} + type LineCallback func(string) type AdbLogcat struct { From ffb0eb6620a6b12d8df46d260b9cba69cb1461d0 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Wed, 9 Oct 2024 15:45:34 +0800 Subject: [PATCH 5/9] feat: restart uia2 server if crashed --- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/android_device.go | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 2d31c894..e08ce4cf 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2410091526 +v5.0.0-beta-2410091552 diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 37d5a96f..6e58e709 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -81,6 +81,12 @@ func WithUIA2Port(port int) AndroidDeviceOption { } } +func WithUIA2Package(packageName string) AndroidDeviceOption { + return func(device *AndroidDevice) { + device.UIA2Package = packageName + } +} + func WithAdbLogOn(logOn bool) AndroidDeviceOption { return func(device *AndroidDevice) { device.LogOn = logOn @@ -100,6 +106,9 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO if dev.UIA2Port != 0 { deviceOptions = append(deviceOptions, WithUIA2Port(dev.UIA2Port)) } + if dev.UIA2Package != "" { + deviceOptions = append(deviceOptions, WithUIA2Package(dev.UIA2Package)) + } if dev.LogOn { deviceOptions = append(deviceOptions, WithAdbLogOn(true)) } @@ -200,9 +209,9 @@ func (dev *AndroidDevice) Init() error { dev.d.RunShellCommand("ime", "enable", "io.appium.settings/.UnicodeIME") dev.d.RunShellCommand("rm", "-r", env.DeviceActionLogFilePath) - if dev.UIA2Package != "" { + if dev.UIA2 { // start uiautomator2 server - return dev.startUIA2Server() + go dev.startUIA2Server() } return nil } @@ -525,7 +534,11 @@ func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) { } func (dev *AndroidDevice) startUIA2Server() error { - _, err := dev.d.RunShellCommand("am", "instrument", "-w", UIA2ServerPackageName) + out, err := dev.d.RunShellCommand("am", "instrument", "-w", UIA2ServerPackageName) + if strings.Contains(out, "Process crashed") { + log.Error().Msg("uiautomator server crashed, restart...") + return dev.startUIA2Server() + } return err } From 7506ebcb3b54d9d65fad2f8f05f54b0321246547 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Wed, 9 Oct 2024 15:57:24 +0800 Subject: [PATCH 6/9] fix: uia2 port and ip --- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/android_device.go | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index e08ce4cf..0318f9a4 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2410091552 +v5.0.0-beta-2410091557 diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 6e58e709..4c8c84be 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -259,15 +259,15 @@ func (dev *AndroidDevice) NewDriver(options ...DriverOption) (driverExt *DriverE // NewUSBDriver creates new client via USB connected device, this will also start a new session. func (dev *AndroidDevice) NewUSBDriver(capabilities Capabilities) (driver IWebDriver, err error) { - localPort, err := dev.d.Forward(UIA2ServerPort) + localPort, err := dev.d.Forward(dev.UIA2Port) if err != nil { return nil, errors.Wrap(code.DeviceConnectionError, fmt.Sprintf("forward port %d->%d failed: %v", - localPort, UIA2ServerPort, err)) + localPort, dev.UIA2Port, err)) } rawURL := fmt.Sprintf("http://%s%d:%d/wd/hub", - forwardToPrefix, localPort, UIA2ServerPort) + forwardToPrefix, localPort, dev.UIA2Port) uiaDriver, err := NewUIADriver(capabilities, rawURL) if err != nil { _ = dev.d.ForwardKill(localPort) @@ -534,7 +534,8 @@ func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) { } func (dev *AndroidDevice) startUIA2Server() error { - out, err := dev.d.RunShellCommand("am", "instrument", "-w", UIA2ServerPackageName) + 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() @@ -543,7 +544,7 @@ func (dev *AndroidDevice) startUIA2Server() error { } func (dev *AndroidDevice) stopUIA2Server() error { - _, err := dev.d.RunShellCommand("am", "force-stop", UIA2ServerPackageName) + _, err := dev.d.RunShellCommand("am", "force-stop", dev.UIA2Package) return err } From 37cbfacc2debf16bb1efe4c91537771247ef471d Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 11 Oct 2024 20:57:09 +0800 Subject: [PATCH 7/9] 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) From f8da26776a38a45c750549ebb2dd552757c396af Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 11 Oct 2024 21:32:06 +0800 Subject: [PATCH 8/9] feat: check android uiautomator server running --- hrp/internal/version/VERSION | 2 +- hrp/pkg/gadb/device.go | 8 ++++++ hrp/pkg/uixt/android_device.go | 51 +++++++++++++++------------------- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 15bdb9c4..253fd1f9 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2410112057 +v5.0.0-beta-2410112132 diff --git a/hrp/pkg/gadb/device.go b/hrp/pkg/gadb/device.go index 7d6998e9..4d743214 100644 --- a/hrp/pkg/gadb/device.go +++ b/hrp/pkg/gadb/device.go @@ -687,6 +687,14 @@ func (d *Device) IsPackageInstalled(packageName string) bool { return builtin.Contains(packages, packageName) } +func (d *Device) IsPackageRunning(packageName string) bool { + output, err := d.RunShellCommand("pidof", packageName) + if err != nil { + return false + } + return strings.TrimSpace(output) != "" +} + func (d *Device) ScreenCap() ([]byte, error) { if d.HasFeature(FeatShellV2) { return d.RunShellCommandV2WithBytes("screencap", "-p") diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 35d4c3eb..99323307 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -36,9 +36,10 @@ var ( AdbServerPort = gadb.AdbServerPort // 5037 // uiautomator2 server - UIA2ServerHost = "localhost" - UIA2ServerPort = 6790 - UIA2ServerPackageName = "io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner" + UIA2ServerHost = "localhost" + UIA2ServerPort = 6790 + UIA2ServerPackageName = "io.appium.uiautomator2.server" + UIA2ServerTestPackageName = "io.appium.uiautomator2.server.test" EvalInstallerPackageName = "sogou.mobile.explorer" InstallViaInstallerCommand = "am start -S -n sogou.mobile.explorer/.PackageInstallerActivity -d" @@ -81,12 +82,6 @@ func WithUIA2Port(port int) AndroidDeviceOption { } } -func WithUIA2Package(packageName string) AndroidDeviceOption { - return func(device *AndroidDevice) { - device.UIA2Package = packageName - } -} - func WithAdbLogOn(logOn bool) AndroidDeviceOption { return func(device *AndroidDevice) { device.LogOn = logOn @@ -106,9 +101,6 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO if dev.UIA2Port != 0 { deviceOptions = append(deviceOptions, WithUIA2Port(dev.UIA2Port)) } - if dev.UIA2Package != "" { - deviceOptions = append(deviceOptions, WithUIA2Package(dev.UIA2Package)) - } if dev.LogOn { deviceOptions = append(deviceOptions, WithAdbLogOn(true)) } @@ -117,9 +109,8 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, err error) { device = &AndroidDevice{ - UIA2IP: UIA2ServerHost, - UIA2Port: UIA2ServerPort, - UIA2Package: UIA2ServerPackageName, + UIA2IP: UIA2ServerHost, + UIA2Port: UIA2ServerPort, } for _, option := range options { option(device) @@ -198,7 +189,6 @@ type AndroidDevice struct { UIA2 bool `json:"uia2,omitempty" yaml:"uia2,omitempty"` // use uiautomator2 UIA2IP string `json:"uia2_ip,omitempty" yaml:"uia2_ip,omitempty"` // uiautomator2 server ip UIA2Port int `json:"uia2_port,omitempty" yaml:"uia2_port,omitempty"` // uiautomator2 server port - UIA2Package string `json:"uia2_package,omitempty" yaml:"uia2_package,omitempty"` LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"` IgnorePopup bool `json:"ignore_popup,omitempty" yaml:"ignore_popup,omitempty"` } @@ -209,17 +199,20 @@ func (dev *AndroidDevice) Init() error { 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") + if !dev.d.IsPackageInstalled(UIA2ServerPackageName) { + return errors.Wrapf(code.MobileUIDriverAppNotInstalled, + "%s not installed", UIA2ServerPackageName) + } + if !dev.d.IsPackageInstalled(UIA2ServerTestPackageName) { + return errors.Wrapf(code.MobileUIDriverAppNotInstalled, + "%s not installed", UIA2ServerTestPackageName) + } + + // check uiautomator server package running + if dev.d.IsPackageRunning(UIA2ServerPackageName) { + return nil } // start uiautomator2 server @@ -552,12 +545,12 @@ func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) { func (dev *AndroidDevice) startUIA2Server() error { const maxRetries = 3 for attempt := 1; attempt <= maxRetries; attempt++ { - log.Info().Str("package", dev.UIA2Package). + log.Info().Str("package", UIA2ServerTestPackageName). Int("attempt", attempt).Msg("start uiautomator server") - // $ adb shell am instrument -w $UIA2ServerPackageName + // $ adb shell am instrument -w $UIA2ServerTestPackageName // -w: wait for instrumentation to finish before returning. // Required for test runners. - out, err := dev.d.RunShellCommand("am", "instrument", "-w", dev.UIA2Package) + out, err := dev.d.RunShellCommand("am", "instrument", "-w", UIA2ServerTestPackageName) if err != nil { return errors.Wrap(err, "start uiautomator server failed") } @@ -571,7 +564,7 @@ func (dev *AndroidDevice) startUIA2Server() error { } func (dev *AndroidDevice) stopUIA2Server() error { - _, err := dev.d.RunShellCommand("am", "force-stop", dev.UIA2Package) + _, err := dev.d.RunShellCommand("am", "force-stop", UIA2ServerPackageName) return err } From 0f22477a83b22d4a4e18ffb11ad15dd84ce8e884 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 11 Oct 2024 22:29:25 +0800 Subject: [PATCH 9/9] fix: wait for uiautomator2 server start --- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/android_device.go | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 253fd1f9..5ff48090 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2410112132 +v5.0.0-beta-2410112229 diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 99323307..e280bc3e 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -210,10 +210,10 @@ func (dev *AndroidDevice) Init() error { "%s not installed", UIA2ServerTestPackageName) } - // check uiautomator server package running - if dev.d.IsPackageRunning(UIA2ServerPackageName) { - return nil - } + // TODO: check uiautomator server package running + // if dev.d.IsPackageRunning(UIA2ServerPackageName) { + // return nil + // } // start uiautomator2 server go func() { @@ -221,6 +221,7 @@ func (dev *AndroidDevice) Init() error { log.Error().Err(err).Msg("start UIA2 failed") } }() + time.Sleep(5 * time.Second) // wait for uiautomator2 server start } return nil }