From 1d95e5c1f3dce16c6db8f099b2e07cccff5cb51c Mon Sep 17 00:00:00 2001 From: lixf6 Date: Wed, 4 Jun 2025 18:30:34 +0800 Subject: [PATCH] app info add VersionName and VersionCode --- .gitignore | 2 +- uiautodev/driver/android.py | 39 +++++++++++++++++++++++++++++++++++-- uiautodev/model.py | 6 ++++-- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 7a45561..a5e645a 100644 --- a/.gitignore +++ b/.gitignore @@ -157,7 +157,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ poetry.lock window_dump.xml diff --git a/uiautodev/driver/android.py b/uiautodev/driver/android.py index a53883e..b616f3e 100644 --- a/uiautodev/driver/android.py +++ b/uiautodev/driver/android.py @@ -126,13 +126,48 @@ def volume_down(self): def volume_mute(self): self.adb_device.keyevent("VOLUME_MUTE") - + + def get_app_version(self, package_name: str) -> Optional[dict]: + """ + Get the version information of an app, including mainVersion and subVersion. + + Args: + package_name (str): The package name of the app. + + Returns: + dict: A dictionary containing mainVersion and subVersion. + """ + output = self.adb_device.shell(["dumpsys", "package", package_name]) + + # versionName + m = re.search(r"versionName=(?P[^\s]+)", output) + version_name = m.group("name") if m else "" + if version_name == "null": # Java dumps "null" for null values + version_name = None + + # versionCode + m = re.search(r"versionCode=(?P\d+)", output) + version_code = m.group("code") if m else "" + version_code = int(version_code) if version_code.isdigit() else None + + return { + "versionName": version_name, + "versionCode": version_code + } + def app_list(self) -> List[AppInfo]: results = [] output = self.adb_device.shell(["pm", "list", "packages", '-3']) for m in re.finditer(r"^package:([^\s]+)\r?$", output, re.M): packageName = m.group(1) - results.append(AppInfo(packageName=packageName)) + # get version + version_info = self.get_app_version(packageName) + app_info = AppInfo( + packageName=packageName, + versionName=version_info.get("versionName"), + versionCode=version_info.get("versionCode") + ) + results.append(app_info) return results def open_app_file(self, package: str) -> Iterator[bytes]: diff --git a/uiautodev/model.py b/uiautodev/model.py index c7fcad0..0081e06 100644 --- a/uiautodev/model.py +++ b/uiautodev/model.py @@ -33,7 +33,7 @@ class Rect(BaseModel): class Node(BaseModel): key: str - name: str # can be seen as description + name: str # can be seen as description bounds: Optional[Tuple[float, float, float, float]] = None rect: Optional[Rect] = None properties: Dict[str, Union[str, bool]] = {} @@ -50,4 +50,6 @@ class WindowSize(typing.NamedTuple): class AppInfo(BaseModel): - packageName: str \ No newline at end of file + packageName: str + versionName: Optional[str] = None # Allow None values + versionCode: Optional[int] = None