From 9b0daf18fa81e7faf45e3aa7a67cd5b55848cdca Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Thu, 12 Dec 2024 16:47:53 +0800 Subject: [PATCH] refactor: mount ios developer image --- hrp/cmd/ios/mount.go | 8 ++-- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/ios_device.go | 72 ++++++++++-------------------------- 3 files changed, 24 insertions(+), 58 deletions(-) diff --git a/hrp/cmd/ios/mount.go b/hrp/cmd/ios/mount.go index d18b6bba..c367759a 100644 --- a/hrp/cmd/ios/mount.go +++ b/hrp/cmd/ios/mount.go @@ -31,7 +31,7 @@ var mountCmd = &cobra.Command{ return err } - images, errImage := device.ListImage() + images, errImage := device.ListImages() if err != nil { return fmt.Errorf("list device images failed: %v", err) } @@ -43,7 +43,7 @@ var mountCmd = &cobra.Command{ } if errImage == nil && len(images) > 0 { - log.Info().Msg("ios developer image is already mounted") + log.Info().Strs("images", images).Msg("ios developer image is already mounted") return nil } @@ -53,7 +53,7 @@ var mountCmd = &cobra.Command{ return fmt.Errorf("developer disk image directory not exist: %s", developerDiskImageDir) } - if err = device.MountImage(developerDiskImageDir); err != nil { + if err = device.AutoMountImage(developerDiskImageDir); err != nil { return fmt.Errorf("mount developer disk image failed: %s", err) } @@ -71,7 +71,7 @@ var ( func init() { mountCmd.Flags().BoolVar(&listDeveloperDiskImage, "list", false, "list developer disk images") - mountCmd.Flags().StringVarP(&developerDiskImageDir, "dir", "d", defaultDeveloperDiskImageDir, "specify DeveloperDiskImage directory") + mountCmd.Flags().StringVarP(&developerDiskImageDir, "dir", "d", defaultDeveloperDiskImageDir, "specify developer disk image directory") mountCmd.Flags().StringVarP(&udid, "udid", "u", "", "specify device by udid") iosRootCmd.AddCommand(mountCmd) } diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index c24c3103..1bfea659 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0+2412121405 +v5.0.0+2412121753 diff --git a/hrp/pkg/uixt/ios_device.go b/hrp/pkg/uixt/ios_device.go index cd3295be..b783758c 100644 --- a/hrp/pkg/uixt/ios_device.go +++ b/hrp/pkg/uixt/ios_device.go @@ -331,7 +331,7 @@ const ( ) func (dev *IOSDevice) Init() error { - images, err := dev.ListImage() + images, err := dev.ListImages() if err != nil { return err } @@ -340,38 +340,13 @@ func (dev *IOSDevice) Init() error { return err } if len(images) == 0 && version.LessThan(ios.IOS17()) { + // Notice: iOS 17.0+ does not need to mount developer image err = dev.AutoMountImage(os.TempDir()) if err != nil { return err } } - if version.GreaterThan(semver.MustParse("17.4.0")) && dev.STUB { - info, err := tunnel.TunnelInfoForDevice( - dev.d.Properties.SerialNumber, - ios.HttpApiHost(), ios.HttpApiPort()) - if err != nil { - return err - } - dev.d.UserspaceTUNPort = info.UserspaceTUNPort - dev.d.UserspaceTUN = info.UserspaceTUN - rsdService, err := ios.NewWithAddrPortDevice(info.Address, info.RsdPort, dev.d) - if err != nil { - return err - } - defer rsdService.Close() - rsdProvider, err := rsdService.Handshake() - if err != nil { - return err - } - device, err := ios.GetDeviceWithAddress(dev.d.Properties.SerialNumber, info.Address, rsdProvider) - if err != nil { - return err - } - device.UserspaceTUN = dev.d.UserspaceTUN - device.UserspaceTUNPort = dev.d.UserspaceTUNPort - dev.d = device - } return nil } @@ -599,19 +574,17 @@ func (dev *IOSDevice) GetAppInfo(packageName string) (appInfo installationproxy. return installationproxy.AppInfo{}, nil } -func (dev *IOSDevice) ListImage() (images []string, err error) { +func (dev *IOSDevice) ListImages() (images []string, err error) { conn, err := imagemounter.NewImageMounter(dev.d) if err != nil { - log.Error().Err(err).Msg("failed to list image") - return + return nil, errors.Wrap(code.DeviceConnectionError, err.Error()) } defer conn.Close() + signatures, err := conn.ListImages() if err != nil { - log.Error().Err(err).Msg("failed to list image") - return + return nil, errors.Wrap(code.DeviceConnectionError, err.Error()) } - for _, sig := range signatures { images = append(images, fmt.Sprintf("%x", sig)) } @@ -619,38 +592,30 @@ func (dev *IOSDevice) ListImage() (images []string, err error) { } func (dev *IOSDevice) MountImage(imagePath string) (err error) { + log.Info().Str("imagePath", imagePath).Msg("mount ios developer image") conn, err := imagemounter.NewImageMounter(dev.d) if err != nil { - log.Error().Err(err).Msg("failed to mount image") - return + return errors.Wrap(code.DeviceConnectionError, err.Error()) } defer conn.Close() + err = conn.MountImage(imagePath) if err != nil { - log.Error().Err(err).Msg("failed to mount image") - return + return errors.Wrapf(code.DeviceConnectionError, + "mount ios developer image failed: %v", err) } + log.Info().Str("imagePath", imagePath).Msg("mount ios developer image success") return nil } -func (dev *IOSDevice) AutoMountImage(basedir string) (err error) { - imagePath, err := imagemounter.DownloadImageFor(dev.d, basedir) +func (dev *IOSDevice) AutoMountImage(baseDir string) (err error) { + log.Info().Str("baseDir", baseDir).Msg("auto mount ios developer image") + imagePath, err := imagemounter.DownloadImageFor(dev.d, baseDir) if err != nil { - log.Error().Err(err).Msg("failed to download ios developer image") - return + return errors.Wrapf(code.DeviceConnectionError, + "download ios developer image failed: %v", err) } - conn, err := imagemounter.NewImageMounter(dev.d) - if err != nil { - log.Error().Err(err).Msg("failed to init image mounter") - return - } - defer conn.Close() - err = conn.MountImage(imagePath) - if err != nil { - log.Error().Err(err).Msg("failed to mount ios developer image") - return - } - return nil + return dev.MountImage(imagePath) } func (dev *IOSDevice) RunXCTest(ctx context.Context, bundleID, testRunnerBundleID, xctestConfig string) (err error) { @@ -691,6 +656,7 @@ func (dev *IOSDevice) getVersion() (version *semver.Version, err error) { log.Error().Err(err).Msg("failed to get version") return nil, err } + log.Info().Str("version", version.String()).Msg("get ios device version") return version, nil }