From c81a130b3cd61ac1730c597d343596f3ccf74d07 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 13 Sep 2024 22:51:22 +0800 Subject: [PATCH] refactor: get package info for android --- hrp/pkg/uixt/android_device.go | 71 +++++++++++++++++++++++++++++----- hrp/pkg/uixt/interface.go | 2 + 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 29080689..39e65a7c 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -442,21 +442,74 @@ func (dev *AndroidDevice) GetPackageInfo(packageName string) (AppInfo, error) { appInfo := AppInfo{ Name: packageName, } - output, err := dev.d.RunShellCommand("dumpsys", "package", packageName, "|", "grep", "versionName") - if err != nil { + // get package version + appVersion, err := dev.getPackageVersion(packageName) + if err == nil { + appInfo.AppBaseInfo.VersionName = appVersion + } else { + log.Warn().Msg("failed to get package version") return appInfo, err } + + // get package path + packagePath, err := dev.getPackagePath(packageName) + if err == nil { + appInfo.AppBaseInfo.AppPath = packagePath + } else { + log.Warn().Msg("failed to get package path") + return appInfo, err + } + + // get package md5 + packageMD5, err := dev.getPackageMD5(packagePath) + if err == nil { + appInfo.AppBaseInfo.AppMD5 = packageMD5 + } else { + log.Warn().Msg("failed to get package md5") + return appInfo, err + } + + return appInfo, nil +} + +func (dev *AndroidDevice) getPackageVersion(packageName string) (string, error) { + output, err := dev.d.RunShellCommand("dumpsys", "package", packageName, "|", "grep", "versionName") + if err != nil { + return "", errors.Wrap(err, "get package version failed") + } + appVersion := "" re := regexp.MustCompile(`versionName=(.+)`) matches := re.FindStringSubmatch(output) if len(matches) > 1 { - appInfo.AppBaseInfo = AppBaseInfo{ - PackageName: packageName, - VersionName: matches[1], - } - log.Info().Interface("appInfo", appInfo).Msg("get app info") - return appInfo, nil + appVersion = matches[1] + return appVersion, nil } - return appInfo, errors.New("failed to get package version") + return "", errors.New("failed to get package version") +} + +func (dev *AndroidDevice) getPackagePath(packageName string) (string, error) { + output, err := dev.d.RunShellCommand("pm", "path", packageName) + if err != nil { + return "", errors.Wrap(err, "get package path failed") + } + re := regexp.MustCompile(`package:(.+)`) + matches := re.FindStringSubmatch(output) + if len(matches) > 1 { + return matches[1], nil + } + return "", errors.New("failed to get package path") +} + +func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) { + output, err := dev.d.RunShellCommand("md5sum", packagePath) + if err != nil { + return "", errors.Wrap(err, "get package md5 failed") + } + matches := strings.Split(output, " ") + if len(matches) > 1 { + return matches[0], nil + } + return "", errors.New("failed to get package md5") } type LineCallback func(string) diff --git a/hrp/pkg/uixt/interface.go b/hrp/pkg/uixt/interface.go index 4c02be0c..2b2ab451 100644 --- a/hrp/pkg/uixt/interface.go +++ b/hrp/pkg/uixt/interface.go @@ -263,6 +263,8 @@ type AppBaseInfo struct { VersionName string `json:"versionName,omitempty"` VersionCode int `json:"versionCode,omitempty"` AppName string `json:"appName,omitempty"` + AppPath string `json:"appPath,omitempty"` + AppMD5 string `json:"appMD5,omitempty"` // AppIcon string `json:"appIcon,omitempty"` }