public static bool AcpServiceIsRunning(DeviceSerialNumber device) { CheckInstallApp(device); var result = AcpCommunicator.GetAcpCommunicator(device).SendCommand(Acp.CMD_TEST); return(result.IsSuccessful); }
/// <summary> /// 清空app数据 /// </summary> /// <param name="device"></param> /// <param name="packageName"></param> /// <returns></returns> public static bool CleanAppData(DeviceSerialNumber device, string packageName) { var exeResult = PackageManagerShared.Executer.QuicklyShell(device, "pm clear " + packageName); Logger.Info(TAG, $"clean {packageName} data success?{exeResult.IsSuccessful}"); return(exeResult.IsSuccessful); }
/// <summary> /// 获取一个对远端设备的某个端口的本地转发端口 /// </summary> /// <param name="device">设备</param> /// <param name="remotePort">需要被转发的远程`端口</param> /// <returns></returns> public static ushort GetForwardByRemotePort(DeviceSerialNumber device, ushort remotePort) { //先获取所有的转发信息 var forwards = GetAllForward(); //在所有的转发信息里查找是否有需要被转发的端口 var forwardInfos = forwards.FindAll((info) => { return(info.Remote == remotePort); }); //声明好需要返回的转发后的本地端口号 ushort localPort; //如果需要被转发的端口已经被转发过了,并且是对当前设备的转发 if (forwardInfos.Count > 0 && forwardInfos.First().DeviceSerial.Equals(device)) { //就设定返回的本地端口为已转发的值 localPort = forwardInfos.First().Local; } else//否则,设置一个新的转发 { ushort idlePort = GetIdlePort(); Forward(device, idlePort, remotePort); localPort = idlePort; } return(localPort); }
private static void CheckInstallApp(DeviceSerialNumber device) { if (!IsInstallAutumnBoxApp(device)) { throw new AndroidAppIsNotInstallException(); } }
public CloseNetDebugging(DevicesPanel root, DeviceSerialNumber serial) { InitializeComponent(); _serial = serial; TBIP.Text = serial.ToString(); this.root = root; }
/// <summary> /// 构建一个使用adb.exe运行的命令,并且这个命令指定了设备 /// </summary> /// <param name="_serial">设备序列号</param> /// <param name="command">命令</param> /// <returns>命令对象</returns> public static Command MakeForAdb(DeviceSerialNumber _serial, string command) { return(new Command() { FileName = AdbConstants.FullAdbFileName, Args = $"-s {_serial} {command}", }); }
public static AcpCommunicator GetAcpCommunicator(DeviceSerialNumber device) { var communicator = communicators.Find((c) => { return(c.device.Equals(device)); }); return(communicator ?? new AcpCommunicator(device)); }
private AcpCommunicator(DeviceSerialNumber device, bool connectAfterCreate = true) { this.device = device; if (connectAfterCreate) { Connect(); } communicators.Add(this); }
/// <summary> /// 进行转发,不建议外部进行调用,建议使用GetForwardByRemotePort() 有效避免端口浪费 /// </summary> /// <param name="device">设备</param> /// <param name="localPort">本地端口</param> /// <param name="remotePort">远程端口</param> public static void Forward(DeviceSerialNumber device, ushort localPort, ushort remotePort) { var exeReuslt = executer.Execute(Command.MakeForAdb(device, $"forward tcp:{localPort} tcp:{remotePort}")); if (!exeReuslt.IsSuccessful) { throw new ExcutionException(exeReuslt); } }
/// <summary> /// 获取设备上的所有包 /// </summary> /// <param name="devSerial"></param> /// <returns></returns> public static List <PackageInfo> GetPackages(DeviceSerialNumber devSerial) { var result = PackageManagerShared.Executer.QuicklyShell(devSerial, $"pm list packages"); var matches = Regex.Matches(result.ToString(), packagesPattern); List <PackageInfo> packages = new List <PackageInfo>(); foreach (Match m in matches) { packages.Add(new PackageInfo(devSerial, m.Result("${package}"))); } return(packages); }
/// <summary> /// 便捷的执行一段shell代码,但更建议使用AndroidShellV2来完成 /// </summary> /// <param name="dev"></param> /// <param name="command"></param> /// <returns></returns> public AdvanceOutput QuicklyShell(DeviceSerialNumber dev, string command) { leastShellExitCode = null; var cmd = Command.MakeForAdb(dev, $"shell \"{command} ; echo exitcode$?\""); var result = Execute(cmd); var match = Regex.Match(result.ToString(), exitCodePattern); int exitCode = 1; if (match.Success) { exitCode = int.Parse(match.Result("${code}")); } return(new AdvanceOutput(result, leastShellExitCode ?? 1)); }
/// <summary> /// 构建 /// </summary> /// <param name="device"></param> public AndroidShellV2(DeviceSerialNumber device) { this.device = device; outputBuilder = new AdvanceOutputBuilder(); pStartInfo = new ProcessStartInfo() { StandardOutputEncoding = Encoding.UTF8, StandardErrorEncoding = Encoding.UTF8, CreateNoWindow = true, UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, FileName = AdbConstants.FullAdbFileName, }; }
public string GenerateRandomNumber() { var message = "Save"; var lastnumber = this.GetLastSerialNo(); var length = 600; if (this.IsAllDevicesUsed()) { for (int serialNo = lastnumber; serialNo < (lastnumber + length); serialNo++) { var prefix = ""; if (serialNo.ToString().Count() == 1) { prefix = "000"; } else if (serialNo.ToString().Count() == 2) { prefix = "00"; } else if (serialNo.ToString().Count() == 3) { prefix = "0"; } else { prefix = ""; } DeviceSerialNumber deviceSerialNumber = new DeviceSerialNumber { CreatedOn = DateTime.Now, UpdatedOn = DateTime.Now, IsActive = true, IsUsed = false, SerialNumber = FourDigitGenerateRandomNo().ToString() + FourDigitGenerateRandomNo().ToString() + FourDigitGenerateRandomNo().ToString() + (prefix + serialNo).ToString() }; context.DeviceSerialNumbers.Add(deviceSerialNumber); context.SaveChanges(); } } else { message = "Please Use All Number"; } return(message); }
private void UpdateDevice(object param) { try { if (SelectedDevice == null) { throw new Exception("Устройство не выбрано"); } if (string.IsNullOrEmpty(DeviceName.Trim()) || string.IsNullOrEmpty(DeviceSerialNumber.Trim()) || string.IsNullOrEmpty(DeviceIpAddress.Trim()) || PlatformId < 1) { throw new Exception("Не заполнены обязательные поля"); } using (var deviceService = _ppsClientViewModel.ServiceProxy.GetPpsChannelFactory <IDeviceService>()) { var channel = deviceService.CreateChannel(); var result = channel.UpdateDevice(SelectedDevice, new DeviceInfoDataContract { DeviceId = SelectedDevice.DeviceId, DeviceName = DeviceName.Trim(), DeviceSerialNumber = DeviceSerialNumber.Trim(), DeviceMacAddress = DeviceMacAddress.Trim(), DeviceIpAddress = DeviceIpAddress.Trim(), DevicePlatformId = PlatformId }); if (!result.BoolRes || !string.IsNullOrEmpty(result.ErrorRes)) { throw new Exception(result.ErrorRes); } _ppsClientViewModel.GetDeviceCollection(); _ppsClientViewModel.AddEvent(EventConstants.EVENT_UPD_DEVICE, SelectedDevice.DeviceSerialNumber); } } catch (Exception ex) { _ppsClientViewModel.WriteLogMessage("Не удалось изменить устройство - " + ex.Message); } }
/// <summary> /// 实例化 /// </summary> /// <param name="id"></param> public AndroidShell(DeviceSerialNumber serial) { _mainProcess = new Process { StartInfo = new ProcessStartInfo() { StandardOutputEncoding = Encoding.UTF8, StandardErrorEncoding = Encoding.UTF8, RedirectStandardError = true, RedirectStandardInput = true, RedirectStandardOutput = true, CreateNoWindow = true, UseShellExecute = false, FileName = AdbConstants.FullAdbFileName, Arguments = $" -s {serial.ToString()} shell" } }; _mainProcess.OutputDataReceived += (s, e) => { OnOutputReceived(new OutputReceivedEventArgs(e, false)); }; _mainProcess.ErrorDataReceived += (s, e) => { OnOutputReceived(new OutputReceivedEventArgs(e, true)); }; }
public MiFlashBatExecuteProcess(string batFileName, DeviceSerialNumber serial) { this.StartInfo = new ProcessStartInfo() { UseShellExecute = false, CreateNoWindow = true, Arguments = $"/q /c {batFileName} {serial.ToFullSerial()}", FileName = "cmd.exe", WorkingDirectory = AdbConstants.toolsPath, RedirectStandardError = true, RedirectStandardOutput = true, }; Logger.Warn(this, $"file path:{StartInfo.Arguments}"); OutputDataReceived += (s, e) => { OutputReceived?.Invoke(this, new OutputReceivedEventArgs(e, false)); }; ErrorDataReceived += (s, e) => { OutputReceived?.Invoke(this, new OutputReceivedEventArgs(e, true)); }; }
/// <summary> /// 获取所有的端口转发信息 /// </summary> /// <param name="device"></param> /// <returns></returns> public static List <ForwardInfo> GetAllForward(DeviceSerialNumber device = null) { List <ForwardInfo> forwards = new List <ForwardInfo>(); Command queryCommand = device == null? Command.MakeForAdb(device, "forward --list") : Command.MakeForAdb("forward --list"); var queryResult = executer.Execute(queryCommand); //Logger.D(queryResult.Output.ToString()); if (queryResult.IsSuccessful) { var matches = regex.Matches(queryResult.ToString()); foreach (Match match in matches) { forwards.Add(new ForwardInfo( new DeviceSerialNumber(match.Result("${serial}")), ushort.Parse(match.Result("${local}")), ushort.Parse(match.Result("${remote}")) )); } } return(forwards); }
private void MainWindow_Loaded(object sender, RoutedEventArgs e) { new TBLoadingEffect(TBLoading).Start(); Task.Run(() => { try { DeviceSerialNumber serial = null; this.Dispatcher.Invoke(() => { serial = ShowInfo.Serial; }); var product = new DeviceInfoGetterInFastboot(serial).GetProduct(); this.Dispatcher.Invoke(() => { TBSerial.Text += product == null ? null : "--" + product; }); } catch (Exception ex) { Logger.Warn(this, "A exception happend when getting product info on fastboot", ex); } }); }
public OpenNetDebugging(DevicesPanel root, DeviceSerialNumber serial) { InitializeComponent(); this.root = root; _serial = serial; }
/// <summary> /// 构建 /// </summary> /// <param name="owner"></param> /// <param name="name"></param> public PackageInfo(DeviceSerialNumber owner, string name) { this.Name = name; this.Owner = owner; }
public UserManagerWindow(DeviceSerialNumber device) { InitializeComponent(); userManager = new UserManager(device); ButtonRemove.Visibility = Visibility.Hidden; }
/// <summary> /// 卸载App /// </summary> /// <param name="device"></param> /// <param name="packageName"></param> /// <returns></returns> public static bool UninstallApp(DeviceSerialNumber device, string packageName) { var exeResult = PackageManagerShared.Executer.Execute(Command.MakeForAdb(device, "uninstall " + packageName)); return(!exeResult.Contains("Failure")); }
public static AdvanceOutput StopAcpService(DeviceSerialNumber device) { return(Broadcast.Send(device, BROADCAST_STOP_ACP_SERVICE)); }
/// <summary> /// 检查是否安装了某个APP /// </summary> /// <param name="devSerial">设备</param> /// <param name="packageName">应用名</param> /// <returns></returns> public static bool?IsInstall(DeviceSerialNumber devSerial, string packageName) { var result = PackageManagerShared.Executer.QuicklyShell(devSerial, $"pm path {packageName}"); return(result.IsSuccessful); }
/// <summary> /// 构造一个用户管理器 /// </summary> /// <param name="device"></param> public UserManager(DeviceSerialNumber device) { this.shell = new AndroidShellV2(device); }
public static bool IsInstallAutumnBoxApp(DeviceSerialNumber serial) { return(PackageManager.IsInstall(serial, PACKAGE_NAME) == true); }
public static AdvanceOutput StartMainActivity(DeviceSerialNumber device) { return(Activity.Start(device, PACKAGE_NAME, MAIN_ACTIVITY_NAME)); }
private static IPEndPoint GetEndPoint(DeviceSerialNumber serial) { return(new IPEndPoint(IPAddress.Parse("127.0.0.1"), ForwardManager.GetForwardByRemotePort(serial, Acp.STD_PORT))); }
/// <summary> /// 启动一个Activty /// </summary> /// <param name="device">设备</param> /// <param name="pkgName">包名</param> /// <param name="className">Activity的类名</param> /// <returns></returns> public static AdvanceOutput Start(DeviceSerialNumber device, string pkgName, string className) { return(ActivityManagerShared.Executer.QuicklyShell(device, $"am start {pkgName}/.{className}")); }
public static AdvanceOutput AwakeAcpService(DeviceSerialNumber device) { CheckInstallApp(device); StartMainActivity(device); return(Service.StartService(device, PACKAGE_NAME, SERVICE_NAME)); }