☰
解决Appium安卓自动化测试中Uiautomator2安装卡死问题
2026/11/2 9:19:43 网站建设 项目流程

1. 问题现象与本质分析

当你在使用Appium进行安卓自动化测试时,如果遇到启动过程中卡死在"Installing Uiautomator2 server apk"阶段,而手机屏幕上恰好出现了APK安装确认弹窗,这其实是一个非常典型的控制权争夺问题。我在实际测试工作中遇到过不下20次这种情况,特别是在华为、小米等深度定制ROM的设备上。

问题的本质在于:Appium通过ADB命令向设备推送Uiautomator2相关的APK文件(通常是appium-uiautomator2-server和appium-uiautomator2-server-debug.apk)后,系统会触发标准的APK安装流程。此时如果设备开启了"安装未知来源应用"的安全限制,或者系统有额外的安装确认机制(如MIUI的纯净模式、EMUI的应用安全检测),就会弹出需要人工确认的对话框。

而此时Appium的测试会话正处于初始化阶段,它预期的是能够自动完成Uiautomator2服务的安装和启动。当系统弹窗出现时,实际上是将控制权从自动化流程转移到了人工交互界面。这就造成了:

  1. Appium进程在等待Uiautomator2服务响应
  2. Uiautomator2服务因为安装被弹窗阻塞而无法启动
  3. 系统弹窗又在等待人工操作 三者形成死锁状态,最终表现为Appium"卡死"。

2. 深度排查与验证方法

2.1 确认问题场景

首先需要通过以下步骤确认是否确实遇到了安装弹窗导致的卡死问题:

# 查看Appium日志中卡住的位置 grep -A 10 "Installing.*Uiautomator2" appium.log # 同时通过adb观察设备状态 adb shell dumpsys window | grep mCurrentFocus

典型的现象组合是:

  • Appium日志停留在"Installing Uiautomator2 server"相关输出
  • adb命令显示当前焦点窗口是com.android.packageinstaller/.InstallStart或类似包名
  • 手机屏幕上可见"是否允许安装来自未知来源的应用"等弹窗

2.2 不同ROM的弹窗差异

各厂商ROM对APK安装的处理方式不同,需要针对性处理:

厂商/ROM弹窗类型触发条件
原生Android单一安装确认弹窗仅当首次安装未知来源应用时
MIUI双重验证(纯净模式+安装确认)即使关闭"未知来源"仍可能弹出
EMUI安全扫描+安装确认会对APK进行云端校验
ColorOS密码验证+安装确认企业模式可能要求密码

3. 六种实战解决方案

3.1 方案一:预先安装APK(推荐)

最彻底的解决方法是提前手动安装好必要的APK:

# 查找Appium自带的uiautomator2 apk路径 find /usr/local/lib/node_modules/appium -name "*uiautomator2*.apk" # 手动安装 adb install -r -g appium-uiautomator2-server-v4.27.0.apk adb install -r -g appium-uiautomator2-server-debug-androidTest.apk

提示:使用-r参数允许覆盖安装,-g参数授予所有运行时权限

3.2 方案二:ADB授权自动安装

对于Android 8.0+设备,可以通过以下命令一次性授权:

adb shell settings put secure install_non_market_apps 1 adb shell pm grant io.appium.uiautomator2.server android.permission.INSTALL_PACKAGES

3.3 方案三:修改Desired Capabilities

在Capabilities中添加以下配置可规避部分弹窗:

{ "appium:allowTestPackages": true, "appium:enforceAppInstall": false, "appium:uiautomator2ServerInstallTimeout": 120000 }

3.4 方案四:使用自定义签名APK

部分厂商ROM会阻止未签名APK的安装,可以重新签名:

# 使用debug密钥重新签名 jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 \ -keystore ~/.android/debug.keystore \ appium-uiautomator2-server.apk androiddebugkey

3.5 方案五:自动化点击弹窗

作为兜底方案,可以通过ADB模拟点击:

# 监控弹窗并自动点击允许 while true; do adb shell input tap 800 1200 # 允许按钮坐标 sleep 2 done

3.6 方案六:使用系统镜像设备

对于模拟器或可刷机设备,推荐使用预装好所需APK的系统镜像:

# 创建包含uiautomator2的AVD镜像 avdmanager create avd -n uia2_ready -k "system-images;android-30;google_apis;x86" \ --device "pixel_xl" --force

4. 厂商定制ROM的特殊处理

4.1 小米MIUI设备

需要额外关闭以下设置:

  1. 设置→更多设置→开发者选项→"启用MIUI优化"(关闭)
  2. 设置→应用设置→权限→特殊权限设置→"安装未知应用"→允许测试工具
  3. 安全中心→应用管理→权限→自动启动管理→允许Appium相关应用

4.2 华为EMUI设备

在设置→系统和更新→开发人员选项中:

  1. 关闭"监控ADB安装应用"
  2. 开启"USB调试安全设置"
  3. 在设置→应用→权限管理→特殊访问权限→安装未知应用中授权

5. 持续集成环境下的解决方案

在CI/CD环境中,建议采用以下架构:

graph TD A[CI Runner] --> B{预装检查} B -->|已安装| C[正常启动Session] B -->|未安装| D[静默安装APK] D --> E[权限自动化配置] E --> F[验证服务状态] F --> G[启动测试]

具体实现脚本示例:

#!/bin/bash # check_if_apk_installed.sh package="io.appium.uiautomator2.server" if adb shell pm list packages | grep -q $package; then echo "APK already installed" else echo "Installing APK..." adb push appium-uiautomator2-server.apk /data/local/tmp adb shell pm install -r -g /data/local/tmp/appium-uiautomator2-server.apk # 处理华为设备特殊场景 if adb shell getprop ro.build.version.emui | grep -q .; then adb shell settings put secure install_non_market_apps 1 fi fi

6. 疑难问题排查指南

当上述方案仍不生效时,可按以下步骤深入排查:

  1. 检查APK兼容性:

    aapt dump badging appium-uiautomator2-server.apk | grep -E 'sdkVersion|targetSdk'
  2. 查看系统安装限制:

    adb shell dumpsys package installer | grep -A 10 "install restrictions"
  3. 监控安装过程日志:

    adb logcat -v time | grep -E 'PackageManager|AppOps'
  4. 验证签名证书:

    apksigner verify -v appium-uiautomator2-server.apk

我在实际项目中总结出一个经验:90%的安装问题都与设备特定的安全策略有关。特别是当测试机型和系统版本跨度较大时,建议建立设备策略矩阵表,记录各型号的特殊配置要求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询