adb shell stop surfaceflinger # 停止渲染服务,我执行这个命令后,手机确实黑屏了,但是我运行appium框架写的用例文件,报错获取驱动时出错: Message: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'D:\\python\\auto_deploy_hytest\\androidsdk\\platform-tools\\adb.exe -P 5037 -s 5YLBB25604200149 shell 'settings delete global hidden_api_policy_pre_p_apps;settings delete global hidden_api_policy_p_apps;settings delete global hidden_api_policy'' exited with code 20'; Stderr: 'cmd: Can't find service: settings cmd: Can't find service: settings cmd: Can't find service: settings'; Code: '20' Stacktrace: UnknownError: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'D:\\python\\auto_deploy_hytest\\androidsdk\\platform-tools\\adb.exe -P 5037 -s 5YLBB25604200149 shell 'settings delete global hidden_api_policy_pre_p_apps;settings delete global hidden_api_policy_p_apps;settings delete global hidden_api_policy'' exited with code 20'; Stderr: 'cmd: Can't find service: settings cmd: Can't find service: settings cmd: Can't find service: settings'; Code: '20' at getResponseForW3CError (C:\Program Files\Appium\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\protocol\errors.js:804:9) at asyncHandler (C:\Program Files\Appium\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\protocol\protocol.js:380:37)
时间: 2025-08-07 08:07:15 AIGC 浏览: 21
<think>我们遇到的问题是:执行了`adb shell stop surfaceflinger`导致手机黑屏,然后运行Appium测试用例时出现错误。
错误信息显示,Appium在执行adb命令时失败,具体是尝试删除一些settings配置,但返回了错误码20,并且提示"Can't find service: settings"。
原因分析:
1. `surfaceflinger`是Android系统的图形合成服务,停止它会导致屏幕黑屏,并且可能影响系统服务。
2. 错误信息中显示执行`settings delete ...`命令失败,提示“找不到服务: settings”。这是因为`settings`服务依赖于系统运行环境,当`surfaceflinger`被停止后,整个系统可能处于不稳定状态,导致其他服务(包括`settings`服务)无法正常工作。
解决方案:
我们需要在运行Appium测试之前恢复`surfaceflinger`服务,即执行:
adb shell start surfaceflinger
但是,由于手机已经黑屏,我们无法手动操作,所以需要通过adb命令来启动服务。
具体步骤:
1. 在测试用例的初始化阶段,如果之前因为测试需要停止了`surfaceflinger`,那么在测试开始前确保它已经启动。
2. 在出现此错误后,我们可以尝试在代码中捕获异常,然后重新启动`surfaceflinger`,再重新初始化驱动。
然而,请注意,Appium在初始化时会执行一些adb命令,包括修改settings。如果此时`surfaceflinger`停止,导致系统服务异常,那么Appium的初始化就会失败。
因此,建议在测试前不要停止`surfaceflinger`(除非测试需要模拟黑屏,且测试后立即恢复)。如果确实需要测试黑屏场景,那么测试后必须恢复`surfaceflinger`,否则后续测试将无法进行。
恢复方法:
在终端执行:
adb shell start surfaceflinger
如果已经处于黑屏状态,且Appium无法启动,我们可以手动执行上述命令来恢复。
如何避免:
1. 在测试黑屏场景时,将停止`surfaceflinger`的操作放在测试用例内部,并在测试后恢复。
2. 使用try-finally块确保恢复:
try:
# 停止surfaceflinger
# 执行黑屏测试
finally:
# 启动surfaceflinger
示例代码(在测试用例中):
import subprocess
try:
# 停止surfaceflinger
subprocess.run(["adb", "shell", "stop", "surfaceflinger"])
# 执行黑屏相关的测试步骤
finally:
# 恢复surfaceflinger
subprocess.run(["adb", "shell", "start", "surfaceflinger"])
注意:停止surfaceflinger需要root权限,且必须在root设备上执行。
针对当前错误,我们首先需要手动恢复surfaceflinger服务:
打开命令行,执行:adb shell start surfaceflinger
然后重新运行Appium测试。
另外,错误信息中提到的删除settings配置(hidden_api_policy等)是Appium在初始化时为了绕过Android隐藏API限制所做的操作。在surfaceflinger停止后,整个系统服务不稳定,导致settings服务不可用,因此这些命令执行失败。
总结:在测试黑屏故障时,要确保在测试结束后立即恢复系统服务,避免影响后续操作。
§§相关问题§§
1. 除了停止surfaceflinger服务,还有哪些方法可以安全地模拟应用黑屏故障而不影响系统服务?
2. 当surfaceflinger服务停止后,除了settings服务,还有哪些系统服务可能受到影响?
3. 在非root设备上,如何实现类似黑屏故障的模拟?
4. Appium在初始化时为什么要删除hidden_api_policy相关的设置?这些设置对测试有什么影响?</think>### 问题分析与解决方案
#### 问题原因分析
1. **核心问题**:`stop surfaceflinger` 命令导致 Android 显示服务完全停止
2. **服务依赖**:
- Appium 依赖 `settings` 服务进行设备配置
- `surfaceflinger` 停止后导致系统服务链断裂
- `cmd: Can't find service: settings` 表明关键服务不可用
3. **错误机制**:
```mermaid
graph TD
A[stop surfaceflinger] --> B[显示服务停止]
B --> C[系统服务异常]
C --> D[settings服务不可用]
D --> E[Appium配置失败]
E --> F[ADB错误代码20]
```
#### 完整解决方案
##### 1. 恢复显示服务(必须首先执行)
```bash
# 重新启动渲染服务
adb shell start surfaceflinger
# 强制重启GUI服务(Android 10+)
adb shell cmd activity restart
```
##### 2. 修复 Appium 连接问题
```python
# 在测试脚本中添加恢复检查
def check_display_service():
import subprocess
try:
# 检查surfaceflinger状态
status = subprocess.check_output(
"adb shell service check SurfaceFlinger",
shell=True
).decode()
if "not found" in status:
# 自动重启服务
subprocess.run("adb shell start surfaceflinger", shell=True)
subprocess.run("adb shell input keyevent KEYCODE_WAKEUP", shell=True)
except subprocess.CalledProcessError:
# 设备离线时重新连接
subprocess.run("adb reconnect", shell=True)
```
##### 3. 修改 Appium 配置避免服务检测
在 `appium-server-config.json` 中添加:
```json
{
"automationName": "UiAutomator2",
"skipDeviceInitialization": true,
"skipServerInstallation": true,
"adbExecTimeout": 60000,
"ignoreHiddenApiPolicyError": true
}
```
##### 4. 替代黑屏测试方案(推荐)
使用安全的黑屏模拟方法替代 `stop surfaceflinger`:
```python
# 通过覆盖层模拟黑屏(无需系统权限)
adb shell am start -n com.android.systemui/.blackcover.BlackCoverService
# 仅针对测试应用黑屏
adb shell settings put global policy_control immersive.full=com.your.app.package
```
#### 服务状态检查脚本
```bash
#!/bin/bash
# 检查关键服务状态
services=("SurfaceFlinger" "settings" "adb")
for service in "${services[@]}"; do
status=$(adb shell service check $service)
echo "[$service]状态: ${status:24}"
done
# 输出示例:
# [SurfaceFlinger]状态: Service SurfaceFlinger: found
# [settings]状态: Service settings: found
# [adb]状态: Service adb: found
```
#### 错误处理流程
```
graph LR
发现错误20 --> 重启surfaceflinger --> 重启ADB服务 --> 检查设备连接 --> 修改Appium配置 --> 运行替代测试方案
```
### 关键预防措施
1. **避免直接停止核心服务**:
```bash
# 错误做法
adb shell stop surfaceflinger
# 正确替代
adb shell am start -a android.intent.action.BLACK_SCREEN_TEST
```
2. **使用隔离测试环境**:
- 在 Android 模拟器中测试黑屏场景
- 使用测试专用设备,避免影响开发机
3. **增加异常处理**:
```python
# Appium测试脚本中的异常处理
try:
driver = webdriver.Remote(appium_server_url, capabilities)
except WebDriverException as e:
if 'code 20' in str(e):
reset_display_service()
driver = retry_connection()
```
阅读全文
相关推荐













