fix: listen install result by callback

This commit is contained in:
余泓铮
2024-05-06 19:45:27 +08:00
parent e903d2be8e
commit 996bcab705
+28 -40
View File
@@ -320,50 +320,38 @@ func (dev *AndroidDevice) installViaInstaller(app io.ReadSeeker, args ...string)
if err != nil { if err != nil {
return err return err
} }
quit := make(chan struct{})
done := make(chan error) done := make(chan error)
defer func() { close(quit) }() defer func() {
// 需要监听是否完成安装 close(done)
go func() { }()
logcat := NewAdbLogcat(dev.d.Serial()) logcat := NewAdbLogcatWithCallback(dev.d.Serial(), func(line string) {
err = logcat.CatchLogcat("PackageInstallerCallback") re := regexp.MustCompile(`\{.*?}`)
if err != nil { match := re.FindString(line)
done <- err if match == "" {
return return
} }
scanner := bufio.NewScanner(logcat.reader) var result InstallResult
defer func() { err := json.Unmarshal([]byte(match), &result)
close(done) if err != nil {
_ = logcat.Stop() log.Warn().Msg("parse Install msg line error: " + match)
}() return
for scanner.Scan() {
select {
case <-quit:
break
default:
line := scanner.Text()
re := regexp.MustCompile(`\{.*?}`)
match := re.FindString(line)
if match == "" {
continue
}
var result InstallResult
err := json.Unmarshal([]byte(match), &result)
if err != nil {
log.Warn().Msg("parse Install msg line error: " + match)
continue
}
if result.Result == 0 {
// 安装成功
done <- nil
return
} else {
done <- errors.New(match)
}
}
} }
done <- errors.New("install failed by installer") if result.Result == 0 {
// 安装成功
done <- nil
} else {
done <- errors.New(match)
}
})
err = logcat.CatchLogcat("PackageInstallerCallback")
if err != nil {
return err
}
defer func() {
_ = logcat.Stop()
}() }()
// 需要监听是否完成安装
args = strings.Split(InstallViaInstallerCommand, " ") args = strings.Split(InstallViaInstallerCommand, " ")
args = append(args, appRemotePath) args = append(args, appRemotePath)
_, err = dev.d.RunShellCommand("am", args[1:]...) _, err = dev.d.RunShellCommand("am", args[1:]...)
@@ -374,7 +362,7 @@ func (dev *AndroidDevice) installViaInstaller(app io.ReadSeeker, args ...string)
timeout := 1 * time.Minute timeout := 1 * time.Minute
select { select {
case err := <-done: case err := <-done:
return err // 返回安装结果或错误 return err
case <-time.After(timeout): case <-time.After(timeout):
return fmt.Errorf("installation timed out after %v", timeout) return fmt.Errorf("installation timed out after %v", timeout)
} }