lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

分析和调试预构建 APK

Android Studio 3.0 允许您分析和调试 APK,无需先从 Android Studio 项目构建这些 APK。 不过,您需要确保使用可调试版本的 APK。

要开始调试 APK,请在 Android Studio Welcome 欢迎屏幕中点击 Profile or debug APK。 或者,如果您已经打开一个项目,请在菜单栏中点击 File > Profile or debug APK。 在下一个对话框窗口中,选择您想要导入 Android Studio 的 APK,然后点击 OK。 您应当看到类似于图 1 的画面。

图 1. 将预构建 APK 导入 Android Studio。

注:在您将 APK 导入 Android Studio 时,IDE 将在您的主目录下创建一个新项目,并为目标 APK 保存一个本地副本。 也就是说,如果您重新构建或更新原始的 APK,则需要将更新的版本重新手动导入 Android Studio。

Project 窗格中的 Android 视图允许您检查 APK 的以下内容:

  • APK file:双击 APK 可以打开 APK 分析器。
  • manifests:从 APK 中提取的应用 manifest。
  • java:包含 Android Studio 从您 APK 的 DEX 文件中反汇编(到 .smali 文件中)的 Java 代码。 此目录下的每一个 .smali 文件都对应一个 Java 类。
  • cpp:如果您的应用包括原生代码,此目录将包含您的 APK 的原生库(.so 文件)。
  • External Libraries:包含 Android SDK。

您可以立即使用 Android Profiler 开始测试您的应用的性能 - 不过,分析器当前仅适用于您的应用的 Java 进程。 要使用断点调试您的应用的 Java 和原生代码,您需要先附加 Java 源代码附加原生调试符号

附加 Java 源代码

默认情况下,Android Studio 会从您的 APK 中提取 Java 代码,并将它们保存为 .smali 文件。 要使用断点调试 Java 代码,您需要将 Java 源代码附加到您想要调试的每一个 .smali 文件。

要附加 Java 源代码,请执行以下操作:

  1. Project 窗格中双击 .smali 文件(使用 Android 视图)。 打开文件后,编辑器将显示一个黄色的警告横幅(如图 1 中所示),要求您选择 Java 源代码。
  2. 点击编辑器窗口顶部的 Attach Java Sources
  3. 导航到包含应用的 Java 源代码文件的目录,然后点击 Open

Project 窗口中,IDE 会将 .smali 文件替换为它们对应的 .java 文件。 现在,您可以添加断点并像往常一样调试您的应用

附加原生调试符号

如果您的 APK 包括的原生库(.so 文件)不包含调试符号,IDE 将在 Messages 窗口中向您显示一个警告,类似于图 X 中所示的警告。 如果不附加可调试的原生库,您将无法调试 APK 的原始代码或使用断点。 如果您还未下载,请务必下载 NDK 和工具

要附加可调试的原生库,请执行以下操作:

  1. Project 窗口的 cpp 目录下,双击不包含调试符号的原生库文件。 编辑器将显示一个包含您的 APK 支持的所有 ABI 的表格。
  2. 点击编辑器窗口右上角的 Add
  3. 导航到包含您想要附加的可调试原生库的目录,然后点击 OK
  4. 如果 APK 和可调试原生库使用不同的工作站构建,您需要按照以下步骤操作,指定调试符号的本地路径:
    1. 在编辑器窗口 Path Mappings 部分中的 Local Paths 列下编辑相关字段,添加缺失调试符号的本地路径,如图 2 中所示。IDE 会将远程 NDK 的路径自动映射到您的本地 NDK 下载中的路径。
    2. 点击 Apply

      图 2. 提供本地调试符号的路径。

现在,您应当在 Project 窗口中看到原生源文件。 打开这些文件以添加断点并像往常一样调试您的应用

已知问题: 将调试符号附加到 APK 时,APK 和可调试的 .so 文件必须使用相同的工作站或构建服务器构建。