

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 AWS Device Farm 中对 Android 应用程序测试进行故障排除
<a name="troubleshooting-android-applications"></a>

以下主题列出了在上传 Android 应用程序测试期间出现的错误消息并推荐了解决方法来解决每个错误。

**注意**  
以下说明基于 Linux x86\$164 和 Mac。

## ANDROID\$1APP\$1UNZIP\$1FAILED
<a name="ANDROID_APP_UNZIP_FAILED"></a>

如果您看到以下消息，请执行以下步骤来修复此问题。

**警告**  
我们无法打开您的应用程序。请验证文件是否有效，然后重试。

确保您可以解压应用程序包，而不会出现错误。在以下示例中，程序包的名称为 **app-debug.apk**。

1. 将您的测试程序包复制到工作目录，然后运行以下命令：

   ```
   $ unzip app-debug.apk
   ```

1. 成功解压缩程序包后，您可以通过运行以下命令找到工作目录树结构：

   ```
   $ tree .
   ```

   有效的 Android 应用程序包应生成类似以下内容的输出：

   ```
   .
   |-- AndroidManifest.xml
   |-- classes.dex
   |-- resources.arsc
   |-- assets (directory)
   |-- res (directory)
   `-- META-INF (directory)
   ```

   有关更多信息，请参阅 [AWS Device Farm 中的 Android 测试](test-types-android-tests.md)。

## ANDROID\$1APP\$1AAPT\$1DEBUG\$1BADGING\$1FAILED
<a name="ANDROID_APP_AAPT_DEBUG_BADGING_FAILED"></a>

如果您看到以下消息，请执行以下步骤来修复此问题。

**警告**  
我们无法提取有关您的应用程序的信息。请通过运行命令 `aapt debug badging <path to your test package>` 来验证应用程序是否有效，并在命令不输出任何错误后重试。

在上传验证过程中，AWS Device Farm 解析 `aapt debug badging <path to your package>` 命令输出中的信息。

确保您可以在 Android 应用程序上成功运行此命令。在以下示例中，程序包的名称为 **app-debug.apk**。
+ 将您的应用程序包复制到工作目录，然后运行以下命令：

  ```
  $ aapt debug badging app-debug.apk
  ```

  有效的 Android 应用程序包应生成类似以下内容的输出：

  ```
  package: name='com.amazon.aws.adf.android.referenceapp' versionCode='1' versionName='1.0' platformBuildVersionName='5.1.1-1819727'
  sdkVersion:'9'
  application-label:'ReferenceApp'
  application: label='ReferenceApp' icon='res/mipmap-mdpi-v4/ic_launcher.png'
  application-debuggable
  launchable-activity: name='com.amazon.aws.adf.android.referenceapp.Activities.MainActivity'  label='ReferenceApp' icon=''
  uses-feature: name='android.hardware.bluetooth'
  uses-implied-feature: name='android.hardware.bluetooth' reason='requested android.permission.BLUETOOTH permission, and targetSdkVersion > 4'
  main
  supports-screens: 'small' 'normal' 'large' 'xlarge'
  supports-any-density: 'true'
  locales: '--_--'
  densities: '160' '213' '240' '320' '480' '640'
  ```

  有关更多信息，请参阅 [AWS Device Farm 中的 Android 测试](test-types-android-tests.md)。

## ANDROID\$1APP\$1PACKAGE\$1NAME\$1VALUE\$1MISSING
<a name="ANDROID_APP_PACKAGE_NAME_VALUE_MISSING"></a>

如果您看到以下消息，请执行以下步骤来修复此问题。

**警告**  
我们无法在您的应用程序中找到程序包名称值。请通过运行命令 `aapt debug badging <path to your test package>` 来验证应用程序是否有效，并在关键字“package: name”后面找到程序包名称值后重试。

在上传验证过程中，AWS Device Farm 解析 `aapt debug badging <path to your package>` 命令输出中的程序包名称值。

确保您可以在 Android 应用程序上运行此命令并成功找到程序包名称值。在以下示例中，程序包的名称为 **app-debug.apk**。
+ 将您的应用程序包复制到工作目录，然后运行以下命令：

  ```
  $ aapt debug badging app-debug.apk | grep "package: name="
  ```

  有效的 Android 应用程序包应生成类似以下内容的输出：

  ```
  package: name='com.amazon.aws.adf.android.referenceapp' versionCode='1' versionName='1.0' platformBuildVersionName='5.1.1-1819727'
  ```

  有关更多信息，请参阅 [AWS Device Farm 中的 Android 测试](test-types-android-tests.md)。

## ANDROID\$1APP\$1SDK\$1VERSION\$1VALUE\$1MISSING
<a name="ANDROID_APP_SDK_VERSION_VALUE_MISSING"></a>

如果您看到以下消息，请执行以下步骤来修复此问题。

**警告**  
我们无法在您的应用程序中找到开发工具包版本值。请通过运行命令 `aapt debug badging <path to your test package>` 来验证应用程序是否有效，并在关键字 `sdkVersion` 后面找到开发工具包版本值后重试。

在上传验证过程中，AWS Device Farm 解析 `aapt debug badging <path to your package>` 命令输出中的开发工具包版本值。

确保您可以在 Android 应用程序上运行此命令并成功找到程序包名称值。在以下示例中，程序包的名称为 **app-debug.apk**。
+ 将您的应用程序包复制到工作目录，然后运行以下命令：

  ```
  $ aapt debug badging app-debug.apk | grep "sdkVersion"
  ```

  有效的 Android 应用程序包应生成类似以下内容的输出：

  ```
  sdkVersion:'9'
  ```

  有关更多信息，请参阅 [AWS Device Farm 中的 Android 测试](test-types-android-tests.md)。

## ANDROID\$1APP\$1AAPT\$1DUMP\$1XMLTREE\$1FAILED
<a name="ANDROID_APP_AAPT_DUMP_XMLTREE_FAILED"></a>

如果您看到以下消息，请执行以下步骤来修复此问题。

**警告**  
我们在您的应用程序中找不到有效的 AndroidManifest .xml。请通过运行命令 `aapt dump xmltree <path to your test package> AndroidManifest.xml` 验证测试程序包是否有效，然后在该命令未输出任何错误后重试。

在上传验证过程中，AWS Device Farm 使用命令 `aapt dump xmltree <path to your package> AndroidManifest.xml` 解析程序包中包含的 XML 文件的 XML 解析树中的信息。

确保您可以在 Android 应用程序上成功运行此命令。在以下示例中，程序包的名称为 **app-debug.apk**。
+ 将您的应用程序包复制到工作目录，然后运行以下命令：

  ```
  $ aapt dump xmltree app-debug.apk. AndroidManifest.xml
  ```

  有效的 Android 应用程序包应生成类似以下内容的输出：

  ```
  N: android=http://schemas.android.com/apk/res/android
    E: manifest (line=2)
      A: android:versionCode(0x0101021b)=(type 0x10)0x1
      A: android:versionName(0x0101021c)="1.0" (Raw: "1.0")
      A: package="com.amazon.aws.adf.android.referenceapp" (Raw: "com.amazon.aws.adf.android.referenceapp")
      A: platformBuildVersionCode=(type 0x10)0x16 (Raw: "22")
      A: platformBuildVersionName="5.1.1-1819727" (Raw: "5.1.1-1819727")
      E: uses-sdk (line=7)
        A: android:minSdkVersion(0x0101020c)=(type 0x10)0x9
        A: android:targetSdkVersion(0x01010270)=(type 0x10)0x16
      E: uses-permission (line=11)
        A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
      E: uses-permission (line=12)
        A: android:name(0x01010003)="android.permission.CAMERA" (Raw: "android.permission.CAMERA")
  ```

  有关更多信息，请参阅 [AWS Device Farm 中的 Android 测试](test-types-android-tests.md)。

## ANDROID\$1APP\$1DEVICE\$1ADMIN\$1PERMISSIONS
<a name="ANDROID_APP_DEVICE_ADMIN_PERMISSIONS"></a>

如果您看到以下消息，请执行以下步骤来修复此问题。

**警告**  
我们发现，您的应用程序需要设备管理员权限。请通过运行命令 `aapt dump xmltree <path to your test package> AndroidManifest.xml` 确认不需要此权限，并在确保输出不包含关键字 `android.permission.BIND_DEVICE_ADMIN` 后重试。

在上传验证过程中，AWS Device Farm 使用命令 `aapt dump xmltree <path to your package> AndroidManifest.xml` 解析程序包中包含的 XML 文件的 XML 解析树中的权限信息。

请确保您的应用程序不需要设备管理员权限。在以下示例中，程序包的名称为 **app-debug.apk**。
+ 将您的应用程序包复制到工作目录，然后运行以下命令：

  ```
  $ aapt dump xmltree app-debug.apk AndroidManifest.xml
  ```

  您应找到类似以下内容的输出：

  ```
  N: android=http://schemas.android.com/apk/res/android
    E: manifest (line=2)
      A: android:versionCode(0x0101021b)=(type 0x10)0x1
      A: android:versionName(0x0101021c)="1.0" (Raw: "1.0")
      A: package="com.amazonaws.devicefarm.android.referenceapp" (Raw: "com.amazonaws.devicefarm.android.referenceapp")
      A: platformBuildVersionCode=(type 0x10)0x16 (Raw: "22")
      A: platformBuildVersionName="5.1.1-1819727" (Raw: "5.1.1-1819727")
      E: uses-sdk (line=7)
        A: android:minSdkVersion(0x0101020c)=(type 0x10)0xa
        A: android:targetSdkVersion(0x01010270)=(type 0x10)0x16
      E: uses-permission (line=11)
        A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
      E: uses-permission (line=12)
        A: android:name(0x01010003)="android.permission.CAMERA" (Raw: "android.permission.CAMERA")
          ……
  ```

  如果 Android 应用程序有效，则输出不应包含以下内容：`A: android:name(0x01010003)="android.permission.BIND_DEVICE_ADMIN" (Raw: "android.permission.BIND_DEVICE_ADMIN")`。

  有关更多信息，请参阅 [AWS Device Farm 中的 Android 测试](test-types-android-tests.md)。

## 我的 Android 应用程序中的某些窗口显示空白或黑屏
<a name="flag-secure-screen-issue"></a>

如果您正在测试 Android 应用程序，并且注意到该应用程序中的某些窗口在 Device Farm 的测试视频录制中出现黑屏，则您的应用程序可能正在使用 Android 的 `FLAG_SECURE` 功能。此标志（如 [Android 官方文档](https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SECURE)中所述）用于防止屏幕录制工具录制应用程序的某些窗口。因此，如果窗口使用此标志，Device Farm 的屏幕录制功能（用于自动化和远程访问测试）可能会在应用程序窗口的位置显示黑屏。

开发人员经常将此标志用于其应用程序中包含敏感信息（例如登录页面）的页面。如果您在某些页面（例如登录页面）上看到应用程序屏幕出现黑屏，请与您的开发人员合作，获取不使用此标志进行测试的应用程序版本。

此外，请注意，Device Farm 仍然可以与带有此标志的应用程序窗口进行交互。因此，如果您的应用程序的登录页面显示为黑屏，您仍然可以输入凭据以登录应用程序（从而查看未被 `FLAG_SECURE` 标志屏蔽的页面）。