refactor: mount ios developer image

This commit is contained in:
lilong.129
2024-12-12 16:47:53 +08:00
parent a5ab516a92
commit 9b0daf18fa
3 changed files with 24 additions and 58 deletions

View File

@@ -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)
}

View File

@@ -1 +1 @@
v5.0.0+2412121405
v5.0.0+2412121753

View File

@@ -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
}