diff --git a/common/src/main/java/com/microsoft/hydralab/common/management/AppiumServerManager.java b/common/src/main/java/com/microsoft/hydralab/common/management/AppiumServerManager.java index b441bdd92..7aec9ab5b 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/management/AppiumServerManager.java +++ b/common/src/main/java/com/microsoft/hydralab/common/management/AppiumServerManager.java @@ -55,7 +55,7 @@ public class AppiumServerManager { private final Map windowsAppDrivers = new ConcurrentHashMap<>(); private final Map driverCreateTime = new ConcurrentHashMap<>(); private AppiumDriverLocalService service; - private int appiumServerPort = 10086; + private int appiumServerPort = 10096; private String appiumServerHost = "127.0.0.1"; private String workspacePath; private String edgeDriverZipPath; @@ -147,7 +147,7 @@ public IOSDriver getIOSDriver(DeviceInfo deviceInfo, Logger logger) { caps.setCapability(IOSMobileCapabilityType.USE_PREBUILT_WDA, false); caps.setCapability("useXctestrunFile", false); caps.setCapability("skipLogCapture", true); - caps.setCapability("mjpegServerPort", IOSUtils.getMjpegServerPortByUdid(udid, logger, deviceInfo)); +// caps.setCapability("mjpegServerPort", IOSUtils.getMjpegServerPortByUdid(udid, logger, deviceInfo)); int tryTimes = 3; boolean sessionCreated = false; diff --git a/common/src/main/java/com/microsoft/hydralab/common/management/device/impl/IOSDeviceDriver.java b/common/src/main/java/com/microsoft/hydralab/common/management/device/impl/IOSDeviceDriver.java index 40b3cfecc..3417aa8f2 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/management/device/impl/IOSDeviceDriver.java +++ b/common/src/main/java/com/microsoft/hydralab/common/management/device/impl/IOSDeviceDriver.java @@ -64,8 +64,10 @@ public IOSDeviceDriver(AgentManagementService agentManagementService, @Override public void init() { try { - ShellUtils.killProcessByCommandStr("tidevice", classLogger); + ShellUtils.killProcessByCommandStr("t3", classLogger); + ShellUtils.killProcessByCommandStr("pymobiledevice3", classLogger); IOSUtils.startIOSDeviceWatcher(classLogger, this); + updateAllDeviceInfo(); } catch (Exception e) { throw new HydraLabRuntimeException(500, "IOSDeviceDriver init failed", e); } @@ -242,12 +244,12 @@ public void updateAllDeviceInfo() { public DeviceInfo parseJsonToDevice(JSONObject deviceObject) { DeviceInfo deviceInfo = new DeviceInfo(); - String udid = deviceObject.getString("udid"); + String udid = deviceObject.getString("Identifier"); deviceInfo.setSerialNum(udid); deviceInfo.setDeviceId(udid); - deviceInfo.setName(deviceObject.getString("name")); - deviceInfo.setModel(deviceObject.getString("market_name")); - deviceInfo.setOsVersion(deviceObject.getString("product_version")); + deviceInfo.setName(deviceObject.getString("DeviceName")); + deviceInfo.setModel(deviceObject.getString("ProductType")); + deviceInfo.setOsVersion(deviceObject.getString("ProductVersion")); deviceInfo.setBrand(iOSDeviceManufacturer); deviceInfo.setManufacturer(iOSDeviceManufacturer); deviceInfo.setOsSDKInt(""); @@ -261,7 +263,7 @@ public DeviceInfo parseJsonToDevice(JSONObject deviceObject) { public void updateDeviceDetailByUdid(DeviceInfo deviceInfo, String udid) { String deviceDetailJsonStr = IOSUtils.getIOSDeviceDetailInfo(udid, classLogger); JSONObject deviceDetailJson = JSON.parseObject(deviceDetailJsonStr); - deviceInfo.setAbiList(deviceDetailJson.getString("CPUArchitecture")); + deviceInfo.setAbiList(deviceDetailJson.getString("ProductVersion")); String productType = deviceDetailJson.getString("ProductType"); if ("-".equals(deviceInfo.getModel())) { diff --git a/common/src/main/java/com/microsoft/hydralab/common/screen/IOSAppiumScreenRecorderForWindows.java b/common/src/main/java/com/microsoft/hydralab/common/screen/IOSAppiumScreenRecorderForWindows.java index d3ceaf2d3..9adc7b1f9 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/screen/IOSAppiumScreenRecorderForWindows.java +++ b/common/src/main/java/com/microsoft/hydralab/common/screen/IOSAppiumScreenRecorderForWindows.java @@ -51,7 +51,7 @@ public void startRecord(int maxTimeInSecond) { int timeout = maxTimeInSecond > 0 ? maxTimeInSecond : DEFAULT_TIMEOUT_IN_SECOND; destPath = new File(recordDir, Const.ScreenRecoderConfig.DEFAULT_FILE_NAME).getAbsolutePath(); try { - iosDriver.startRecordingScreen(); +// iosDriver.startRecordingScreen(); recordProcess = ShellUtils.execLocalCommand("ffmpeg -f mjpeg -i http://127.0.0.1:" + IOSUtils.getMjpegServerPortByUdid(deviceInfo.getSerialNum(), CLASS_LOGGER, deviceInfo) + " -vf scale=720:360 -vcodec h264 -y " + destPath, false, CLASS_LOGGER); timer.schedule(new TimerTask() { @Override @@ -83,7 +83,7 @@ private String stopRecord() { ThreadUtils.safeSleep(5000); CLASS_LOGGER.info("Stopping recording"); synchronized (this) { - iosDriver.stopRecordingScreen(); +// iosDriver.stopRecordingScreen(); if (recordProcess != null) { long pid = recordProcess.pid(); ShellUtils.execLocalCommand(POWER_SHELL_PATH + " -Command " + scriptFile.getPath() + " " + pid, CLASS_LOGGER); diff --git a/common/src/main/java/com/microsoft/hydralab/common/util/IOSDeviceWatcher.java b/common/src/main/java/com/microsoft/hydralab/common/util/IOSDeviceWatcher.java index b871cda72..0ffdf22e0 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/util/IOSDeviceWatcher.java +++ b/common/src/main/java/com/microsoft/hydralab/common/util/IOSDeviceWatcher.java @@ -33,7 +33,7 @@ public void run() { if (iosDeviceDriverRef.get() == null) { break; } - if (line.contains("MessageType")) { + if (line.contains("tunnel --rsd")) { Objects.requireNonNull(iosDeviceDriverRef.get()).updateAllDeviceInfo(); } logger.info(line); diff --git a/common/src/main/java/com/microsoft/hydralab/common/util/IOSUtils.java b/common/src/main/java/com/microsoft/hydralab/common/util/IOSUtils.java index 3522a64aa..a78ec2fae 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/util/IOSUtils.java +++ b/common/src/main/java/com/microsoft/hydralab/common/util/IOSUtils.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; public class IOSUtils { - public static final String WDA_BUNDLE_ID = "com.microsoft.wdar.xctrunner"; + public static final String WDA_BUNDLE_ID = "com.microsoft.WebDriverAgentRunner.xctrunner"; private static final Map wdaPortMap = new ConcurrentHashMap<>(); private static final Map mjpegServerPortMap = new ConcurrentHashMap<>(); private static final Set PORT_BLACK_LIST = new HashSet<>() {{ @@ -30,24 +30,20 @@ public class IOSUtils { }}; public static void collectCrashInfo(String folder, DeviceInfo deviceInfo, Logger logger) { - ShellUtils.execLocalCommand("tidevice -u " + deviceInfo.getSerialNum() + " crashreport " + folder, logger); + ShellUtils.execLocalCommand("pymobiledevice3 crash pull " + folder + " --udid " + deviceInfo.getSerialNum(), logger); } @Nullable public static Process startIOSLog(String keyWord, String logFilePath, DeviceInfo deviceInfo, Logger logger) { Process logProcess = null; File logFile = new File(logFilePath); - if (ShellUtils.isConnectedToWindowsOS) { - logProcess = ShellUtils.execLocalCommandWithRedirect("tidevice -u " + deviceInfo.getSerialNum() + " syslog | findstr /i \"" + keyWord + "\"", logFile, false, logger); - } else { - logProcess = ShellUtils.execLocalCommandWithRedirect("tidevice -u " + deviceInfo.getSerialNum() + " syslog | grep -i \"" + keyWord + "\"", logFile, false, logger); - } + logProcess = ShellUtils.execLocalCommandWithRedirect("pymobiledevice3 syslog live -m " + keyWord + " --udid " + deviceInfo.getSerialNum(), logFile, false, logger); return logProcess; } public static void startIOSDeviceWatcher(Logger logger, IOSDeviceDriver deviceDriver) { Process process = null; - String command = "tidevice watch"; + String command = "pymobiledevice3 remote tunneld"; ShellUtils.killProcessByCommandStr(command, logger); try { process = Runtime.getRuntime().exec(command); @@ -63,29 +59,29 @@ public static void startIOSDeviceWatcher(Logger logger, IOSDeviceDriver deviceDr @Nullable public static String getIOSDeviceListJsonStr(Logger logger) { - return ShellUtils.execLocalCommandWithResult("tidevice list --json", logger); + return ShellUtils.execLocalCommandWithResult("t3 list --json", logger); } @Nullable public static String getAppList(String udid, Logger logger) { - return ShellUtils.execLocalCommandWithResult("tidevice -u " + udid + " applist", logger); + return ShellUtils.execLocalCommandWithResult("t3 -u " + udid + " app list", logger); } public static void installApp(String udid, String packagePath, Logger logger) { - ShellUtils.execLocalCommand(String.format("tidevice -u %s install \"%s\"", udid, packagePath.replace(" ", "\\ ")), logger); + ShellUtils.execLocalCommand(String.format("t3 -u %s install \"%s\"", udid, packagePath.replace(" ", "\\ ")), logger); } @Nullable public static String uninstallApp(String udid, String packageName, Logger logger) { - return ShellUtils.execLocalCommandWithResult("tidevice -u " + udid + " uninstall " + packageName, logger); + return ShellUtils.execLocalCommandWithResult("t3 -u " + udid + "app uninstall " + packageName, logger); } public static void launchApp(String udid, String packageName, Logger logger) { - ShellUtils.execLocalCommand("tidevice -u " + udid + " launch " + packageName, logger); + ShellUtils.execLocalCommand("t3 -u " + udid + "app launch " + packageName, logger); } public static void stopApp(String udid, String packageName, Logger logger) { - ShellUtils.execLocalCommand("tidevice -u " + udid + " kill " + packageName, logger); + ShellUtils.execLocalCommand("t3 -u " + udid + "app kill " + packageName, logger); } public static void proxyWDA(DeviceInfo deviceInfo, Logger logger) { @@ -95,11 +91,11 @@ public static void proxyWDA(DeviceInfo deviceInfo, Logger logger) { return; } // String command = "tidevice -u " + udid + " wdaproxy -B " + WDA_BUNDLE_ID + " --port " + getWdaPortByUdid(udid, logger); - String portRelayCommand = "tidevice -u " + udid + " relay " + wdaPort + " 8100"; - String startWDACommand = "tidevice -u " + udid + " xctest --bundle_id " + WDA_BUNDLE_ID; + String portRelayCommand = "t3 -u " + udid + " relay " + wdaPort + " 8100"; + String startWDACommand = "pymobiledevice3 developer dvt launch " + WDA_BUNDLE_ID + " --udid " + udid; - deviceInfo.addCurrentProcess(ShellUtils.execLocalCommand(portRelayCommand, false, logger)); deviceInfo.addCurrentProcess(ShellUtils.execLocalCommand(startWDACommand, false, logger)); + deviceInfo.addCurrentProcess(ShellUtils.execLocalCommand(portRelayCommand, false, logger)); if (!isWdaRunningByPort(wdaPort, logger)) { logger.error("Agent may not proxy WDA correctly. Port {} is not accessible", wdaPort); } @@ -110,8 +106,8 @@ public static void killProxyWDA(DeviceInfo deviceInfo, Logger logger) { int wdaPort = getWdaPortByUdid(udid, logger); // String command = "tidevice -u " + udid + " wdaproxy -B " + WDA_BUNDLE_ID + " --port " + getWdaPortByUdid(udid, logger); // We can still try to kill the process even the proxy is not running. - String portRelayCommand = "tidevice -u " + udid + " relay " + wdaPort + " 8100"; - String startWDACommand = "tidevice -u " + udid + " xctest --bundle_id " + WDA_BUNDLE_ID; + String portRelayCommand = "t3 -u " + udid + " relay " + wdaPort + " 8100"; + String startWDACommand = "t3 -u " + udid + " xctest --bundle_id " + WDA_BUNDLE_ID; ShellUtils.killProcessByCommandStr(portRelayCommand, logger); ShellUtils.killProcessByCommandStr(startWDACommand, logger); @@ -119,11 +115,11 @@ public static void killProxyWDA(DeviceInfo deviceInfo, Logger logger) { @Nullable public static String getIOSDeviceDetailInfo(String udid, Logger logger) { - return ShellUtils.execLocalCommandWithResult("tidevice -u " + udid + " info --json", logger); + return ShellUtils.execLocalCommandWithResult("t3 -u " + udid + " info", logger); } public static void takeScreenshot(String udid, String screenshotFilePath, Logger logger) { - ShellUtils.execLocalCommand("tidevice -u " + udid + " screenshot \"" + screenshotFilePath + "\"", logger); + ShellUtils.execLocalCommand("pymobiledevice3 developer dvt screenshot \"" + screenshotFilePath + "\"" + " --udid " + udid, logger); } public static boolean isWdaRunningByPort(int port, Logger logger) { @@ -153,7 +149,8 @@ public static int getMjpegServerPortByUdid(String serialNum, Logger classLogger, // Randomly assign a port int mjpegServerPor = generateRandomPort(classLogger); classLogger.info("Generate a new mjpeg port = " + mjpegServerPor); - Process process = ShellUtils.execLocalCommand("tidevice -u " + serialNum + " relay " + mjpegServerPor + " 9100", false, classLogger); + Process process = ShellUtils.execLocalCommand("t3 -u " + serialNum + " relay " + mjpegServerPor + " 9100", false, classLogger); + ThreadUtils.safeSleep(2000); deviceInfo.addCurrentProcess(process); mjpegServerPortMap.put(serialNum, mjpegServerPor); } @@ -164,7 +161,7 @@ public static int getMjpegServerPortByUdid(String serialNum, Logger classLogger, public static void releaseMjpegServerPortByUdid(String serialNum, Logger classLogger) { if (mjpegServerPortMap.containsKey(serialNum)) { int mjpegServerPor = mjpegServerPortMap.get(serialNum); - ShellUtils.killProcessByCommandStr("tidevice -u " + serialNum + " relay " + mjpegServerPor + " 9100", classLogger); + ShellUtils.killProcessByCommandStr("t3 -u " + serialNum + " relay " + mjpegServerPor + " 9100", classLogger); mjpegServerPortMap.remove(serialNum, mjpegServerPor); } } diff --git a/common/src/main/java/com/microsoft/hydralab/common/util/PkgUtil.java b/common/src/main/java/com/microsoft/hydralab/common/util/PkgUtil.java index f4d9e13fb..a66e48f50 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/util/PkgUtil.java +++ b/common/src/main/java/com/microsoft/hydralab/common/util/PkgUtil.java @@ -173,6 +173,9 @@ private static void analysisPlist(File plistFile, JSONObject res) throws Excepti version = parameters.toString(); //Application display name parameters = (NSString) rootDict.objectForKey("CFBundleDisplayName"); + if (parameters == null) { + parameters = (NSString) rootDict.objectForKey("CFBundleName"); + } name = parameters.toString(); //If necessary, the decompressed files should be deleted diff --git a/common/src/test/java/com/microsoft/hydralab/common/util/PkgUtilTest.java b/common/src/test/java/com/microsoft/hydralab/common/util/PkgUtilTest.java index b3f849fd2..16f3d1da4 100644 --- a/common/src/test/java/com/microsoft/hydralab/common/util/PkgUtilTest.java +++ b/common/src/test/java/com/microsoft/hydralab/common/util/PkgUtilTest.java @@ -33,7 +33,7 @@ public void analysisApkFile() throws IOException { @Test public void analysisIpaFile() { - File recordFile = new File("src/test/resources/uitestsample.ipa"); + File recordFile = new File("C:\\users\\zhoule\\Downloads\\LTW MSA.ipa"); JSONObject res = PkgUtil.analysisFile(recordFile, EntityType.APP_FILE_SET); logger.info(res.toString(SerializerFeature.PrettyFormat));