public static APKInfo ParseAPK(string apkFilePath) { APKInfo info = new APKInfo(); ZipFile apkFile = new ZipFile(apkFilePath); var manifestEntry = apkFile.GetEntry("AndroidManifest.xml"); var manifestInputStream = apkFile.GetInputStream(manifestEntry); var bytes = new byte[manifestEntry.Size]; manifestInputStream.Read(bytes, 0, (int)manifestEntry.Size); var ms = new MemoryStream(bytes); var reader = new AndroidXmlReader(ms); XDocument doc = XDocument.Load(reader); // get packge info info.VersionCode = doc.Root.FindAttribute("versionCode").Value.ToString(); info.VersionName = doc.Root.FindAttribute("versionName").Value.ToString(); info.PackgeName = doc.Root.FindAttribute("package").Value.ToString(); var application = doc.Root.FindSingleElement("application"); var activities = application.FindElements("activity"); var launchActivity = activities.Single((activity) => { var intent_filter = activity.FindSingleElement("intent-filter"); if (intent_filter == null) { return(false); } // 是否存在 <action p1:name="android.intent.action.MAIN"></action> bool hasActionMain = intent_filter.FindElements("action").Any((ele) => { string actionName = ele.FindAttribute("name").Value.ToString(); return(actionName == "android.intent.action.MAIN"); }); // 是否存在 <category p1:name="android.intent.category.LAUNCHER"></category> bool hasLauncher = intent_filter.FindElements("category").Any((ele) => { string actionName = ele.FindAttribute("name").Value.ToString(); return(actionName == "android.intent.category.LAUNCHER"); }); return(hasActionMain && hasLauncher); }); info.LauncherActivity = launchActivity.FindAttribute("name").Value.ToString(); return(info); }
private void button_install_Click_1(object sender, EventArgs e) { button_install.Enabled = false; List <DeviceTask> tasks = new List <DeviceTask>(); string packgeName = ""; if (radioButton_install.Checked) { string apkFilePath = textBox_apk.Text; var installTask = new InstallTask(apkFilePath); tasks.Add(installTask); var info = APKInfo.ParseAPK(apkFilePath); packgeName = info.PackgeName; } else { packgeName = textBox_apk.Text; } WeTestTask wtTask = new WeTestTask(textBox_python.Text, textBox_wt.Text, packgeName); tasks.Add(wtTask); var devices = DeviceManager.Instance.Devices; int complateCount = 0; for (int i = 0; i < devices.Length; i++) { var device = devices[i]; device.TaskMgr.TaskEnd += (task, result) => { if (device.TaskMgr.RunningTaskIndex == device.TaskMgr.Tasks.Length - 1 || !result.ok) { complateCount++; if (complateCount == devices.Length) { LogWrapper.LogInfo("所有任务已完成"); RunInMainthread(() => { button_install.Enabled = true; }); } } }; device.TaskMgr.RunTasks(tasks.ToArray()); } }
public override TaskResult Run(Managed.Adb.Device adbDevice) { TaskResult result = new TaskResult(); //un install var apkInfo = APKInfo.ParseAPK(mPackgeLocation); try { if (adbDevice.PackageManager.Exists(apkInfo.PackgeName)) { adbDevice.UninstallPackage(apkInfo.PackgeName); } } catch { } LogWrapper.LogInfo("CanuSU:" + adbDevice.SerialNumber + ":" + adbDevice.CanSU()); string remoteFilePath = adbDevice.SyncPackageToDevice(mPackgeLocation); InstallReceiver receiver = new InstallReceiver(); String cmd = String.Format("pm install {1}{0}", remoteFilePath, true ? "-r " : String.Empty); if (adbDevice.CanSU()) { adbDevice.ExecuteRootShellCommand(cmd, receiver); } else { adbDevice.ExecuteShellCommand(cmd, receiver); } if (!String.IsNullOrEmpty(receiver.ErrorMessage)) { result.ok = false; result.Msg = receiver.ErrorMessage; } return(result); }