diff --git a/skills/tester/scripts/mobile_bundle.py b/skills/tester/scripts/mobile_bundle.py index ddcfa92..484c0b9 100755 --- a/skills/tester/scripts/mobile_bundle.py +++ b/skills/tester/scripts/mobile_bundle.py @@ -304,6 +304,10 @@ def android_identity(path: Path, context: RuntimeContext) -> str: result = run_command(command, context=context) if result.code == 0: match = re.search(r"(?:name|application-id)[=:]['\"]?([A-Za-z0-9_.]+)", result.output) + if not match: + # apkanalyzer manifest application-id prints the bare package + # name, while aapt/aapt2 print a package: name=... record. + match = re.fullmatch(r"\s*([A-Za-z0-9_.]+)\s*", result.output) if match: return match.group(1) raise EnvironmentFailure("APK 身份读取失败;请检查 Android SDK build-tools") diff --git a/skills/tester/tests/test_mobile_bundle.py b/skills/tester/tests/test_mobile_bundle.py index 68f0631..53c2140 100755 --- a/skills/tester/tests/test_mobile_bundle.py +++ b/skills/tester/tests/test_mobile_bundle.py @@ -146,6 +146,16 @@ matrix: self.assertTrue(result["verified"]) self.assertTrue(any("install" in call for call in calls)) + def test_android_identity_accepts_bare_apkanalyzer_output(self): + with tempfile.TemporaryDirectory() as temp: + apk = Path(temp) / "app.apk" + apk.write_bytes(b"apk") + context = bundle.RuntimeContext(Path(temp)) + with mock.patch.object(bundle.shutil, "which", side_effect=lambda name: "apkanalyzer" if name == "apkanalyzer" else None), mock.patch.object( + bundle, "run_command", return_value=bundle.CommandResult(0, "page.writes\n") + ): + self.assertEqual(bundle.android_identity(apk, context), "page.writes") + def test_android_missing_device_is_environment_failure(self): context = bundle.RuntimeContext(Path(".")) with mock.patch.object(bundle.shutil, "which", return_value="/sdk/adb"), mock.patch.object(