refactor: Device struct

This commit is contained in:
lilong.129
2025-02-10 20:42:52 +08:00
parent c6b0aefc56
commit 2d6e1fb5e4
11 changed files with 94 additions and 91 deletions

View File

@@ -80,45 +80,45 @@ func NewAndroidDevice(opts ...option.AndroidDeviceOption) (device *AndroidDevice
}
device = &AndroidDevice{
Device: gadbDevice,
AndroidDeviceOptions: androidOptions,
Logcat: NewAdbLogcat(androidOptions.SerialNumber),
Device: gadbDevice,
Options: androidOptions,
Logcat: NewAdbLogcat(androidOptions.SerialNumber),
}
log.Info().Str("serial", device.SerialNumber).Msg("init android device")
log.Info().Str("serial", device.Options.SerialNumber).Msg("init android device")
return device, nil
}
type AndroidDevice struct {
*gadb.Device
*option.AndroidDeviceOptions
Logcat *AdbLogcat
Options *option.AndroidDeviceOptions
Logcat *AdbLogcat
}
func (dev *AndroidDevice) Setup() error {
dev.RunShellCommand("ime", "enable", option.UnicodeImePackageName)
dev.RunShellCommand("rm", "-r", config.DeviceActionLogFilePath)
dev.Device.RunShellCommand("ime", "enable", option.UnicodeImePackageName)
dev.Device.RunShellCommand("rm", "-r", config.DeviceActionLogFilePath)
// setup evalite
evalToolRaw, err := evalite.ReadFile("evalite")
if err != nil {
return errors.Wrap(code.LoadFileError, err.Error())
}
err = dev.Push(bytes.NewReader(evalToolRaw), "/data/local/tmp/evalite", time.Now())
err = dev.Device.Push(bytes.NewReader(evalToolRaw), "/data/local/tmp/evalite", time.Now())
if err != nil {
return errors.Wrap(code.DeviceShellExecError, err.Error())
}
if dev.UIA2 {
if dev.Options.UIA2 {
// uiautomator2 server must be started before
// check uiautomator server package installed
if !dev.IsPackageInstalled(dev.UIA2ServerPackageName) {
if !dev.Device.IsPackageInstalled(dev.Options.UIA2ServerPackageName) {
return errors.Wrapf(code.MobileUIDriverAppNotInstalled,
"%s not installed", dev.UIA2ServerPackageName)
"%s not installed", dev.Options.UIA2ServerPackageName)
}
if !dev.IsPackageInstalled(dev.UIA2ServerTestPackageName) {
if !dev.Device.IsPackageInstalled(dev.Options.UIA2ServerTestPackageName) {
return errors.Wrapf(code.MobileUIDriverAppNotInstalled,
"%s not installed", dev.UIA2ServerTestPackageName)
"%s not installed", dev.Options.UIA2ServerTestPackageName)
}
// TODO: check uiautomator server package running
@@ -142,16 +142,16 @@ func (dev *AndroidDevice) Teardown() error {
}
func (dev *AndroidDevice) UUID() string {
return dev.SerialNumber
return dev.Options.SerialNumber
}
func (dev *AndroidDevice) LogEnabled() bool {
return dev.LogOn
return dev.Options.LogOn
}
func (dev *AndroidDevice) NewDriver() (driverExt IDriverExt, err error) {
var driver IDriver
if dev.UIA2 || dev.LogOn {
if dev.Options.UIA2 || dev.Options.LogOn {
driver, err = NewUIA2Driver(dev)
} else {
driver, err = NewADBDriver(dev)
@@ -160,7 +160,7 @@ func (dev *AndroidDevice) NewDriver() (driverExt IDriverExt, err error) {
return nil, errors.Wrap(err, "failed to init UIA driver")
}
if dev.LogOn {
if dev.Options.LogOn {
err = driver.StartCaptureLog("hrp_adb_log")
if err != nil {
return nil, err
@@ -200,7 +200,7 @@ func (dev *AndroidDevice) StopPcap() string {
func (dev *AndroidDevice) Install(apkPath string, opts ...option.InstallOption) error {
installOpts := option.NewInstallOptions(opts...)
brand, err := dev.Brand()
brand, err := dev.Device.Brand()
if err != nil {
return err
}
@@ -218,7 +218,7 @@ func (dev *AndroidDevice) Install(apkPath string, opts ...option.InstallOption)
case "vivo":
return dev.installVivoSilent(apkPath, args...)
case "oppo", "realme", "oneplus":
if dev.IsPackageInstalled(EvalInstallerPackageName) {
if dev.Device.IsPackageInstalled(EvalInstallerPackageName) {
return dev.installViaInstaller(apkPath, args...)
}
log.Warn().Msg("oppo not install eval installer")
@@ -236,13 +236,13 @@ func (dev *AndroidDevice) installVivoSilent(apkPath string, args ...string) erro
verifyCode = verifyCode[:8]
verifyCode = "-V" + verifyCode
args = append([]string{verifyCode}, args...)
_, err := dev.InstallAPK(apkPath, args...)
_, err := dev.Device.InstallAPK(apkPath, args...)
return err
}
func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) error {
appRemotePath := "/data/local/tmp/" + strconv.FormatInt(time.Now().UnixMilli(), 10) + ".apk"
err := dev.PushFile(apkPath, appRemotePath, time.Now())
err := dev.Device.PushFile(apkPath, appRemotePath, time.Now())
if err != nil {
return err
}
@@ -250,7 +250,7 @@ func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) er
defer func() {
close(done)
}()
logcat := NewAdbLogcatWithCallback(dev.Serial(), func(line string) {
logcat := NewAdbLogcatWithCallback(dev.Device.Serial(), func(line string) {
re := regexp.MustCompile(`\{.*?}`)
match := re.FindString(line)
if match == "" {
@@ -280,7 +280,7 @@ func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) er
// 需要监听是否完成安装
command := strings.Split(InstallViaInstallerCommand, " ")
args = append(command, appRemotePath)
_, err = dev.RunShellCommand("am", args[1:]...)
_, err = dev.Device.RunShellCommand("am", args[1:]...)
if err != nil {
return err
}
@@ -295,18 +295,18 @@ func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) er
}
func (dev *AndroidDevice) installCommon(apkPath string, args ...string) error {
_, err := dev.InstallAPK(apkPath, args...)
_, err := dev.Device.InstallAPK(apkPath, args...)
return err
}
func (dev *AndroidDevice) Uninstall(packageName string) error {
_, err := dev.RunShellCommand("uninstall", packageName)
_, err := dev.Device.RunShellCommand("uninstall", packageName)
return err
}
func (dev *AndroidDevice) GetCurrentWindow() (windowInfo types.WindowInfo, err error) {
// adb shell dumpsys window | grep -E 'mCurrentFocus|mFocusedApp'
output, err := dev.RunShellCommand("dumpsys", "window", "|", "grep", "-E", "'mCurrentFocus|mFocusedApp'")
output, err := dev.Device.RunShellCommand("dumpsys", "window", "|", "grep", "-E", "'mCurrentFocus|mFocusedApp'")
if err != nil {
return types.WindowInfo{}, errors.Wrap(err, "get current window failed")
}
@@ -332,7 +332,7 @@ func (dev *AndroidDevice) GetCurrentWindow() (windowInfo types.WindowInfo, err e
}
// adb shell dumpsys activity activities | grep mResumedActivity
output, err = dev.RunShellCommand("dumpsys", "activity", "activities", "|", "grep", "mResumedActivity")
output, err = dev.Device.RunShellCommand("dumpsys", "activity", "activities", "|", "grep", "mResumedActivity")
if err != nil {
return types.WindowInfo{}, errors.Wrap(err, "get current activity failed")
}
@@ -386,7 +386,7 @@ func (dev *AndroidDevice) GetPackageInfo(packageName string) (types.AppInfo, err
}
func (dev *AndroidDevice) getPackageVersion(packageName string) (string, error) {
output, err := dev.RunShellCommand("dumpsys", "package", packageName, "|", "grep", "versionName")
output, err := dev.Device.RunShellCommand("dumpsys", "package", packageName, "|", "grep", "versionName")
if err != nil {
return "", errors.Wrap(err, "get package version failed")
}
@@ -401,7 +401,7 @@ func (dev *AndroidDevice) getPackageVersion(packageName string) (string, error)
}
func (dev *AndroidDevice) getPackagePath(packageName string) (string, error) {
output, err := dev.RunShellCommand("pm", "path", packageName)
output, err := dev.Device.RunShellCommand("pm", "path", packageName)
if err != nil {
return "", errors.Wrap(err, "get package path failed")
}
@@ -414,7 +414,7 @@ func (dev *AndroidDevice) getPackagePath(packageName string) (string, error) {
}
func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) {
output, err := dev.RunShellCommand("md5sum", packagePath)
output, err := dev.Device.RunShellCommand("md5sum", packagePath)
if err != nil {
return "", errors.Wrap(err, "get package md5 failed")
}
@@ -428,12 +428,13 @@ 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.UIA2ServerTestPackageName).
log.Info().Str("package", dev.Options.UIA2ServerTestPackageName).
Int("attempt", attempt).Msg("start uiautomator server")
// $ adb shell am instrument -w $UIA2ServerTestPackageName
// -w: wait for instrumentation to finish before returning.
// Required for test runners.
out, err := dev.RunShellCommand("am", "instrument", "-w", dev.UIA2ServerTestPackageName)
out, err := dev.Device.RunShellCommand("am", "instrument", "-w",
dev.Options.UIA2ServerTestPackageName)
if err != nil {
return errors.Wrap(err, "start uiautomator server failed")
}
@@ -447,7 +448,7 @@ func (dev *AndroidDevice) startUIA2Server() error {
}
func (dev *AndroidDevice) stopUIA2Server() error {
_, err := dev.RunShellCommand("am", "force-stop", dev.UIA2ServerPackageName)
_, err := dev.Device.RunShellCommand("am", "force-stop", dev.Options.UIA2ServerPackageName)
return err
}