• 分析和调试预构建 APK
    • 附加 Java 源代码
    • 附加原生调试符号

    分析和调试预构建 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 的画面。

    Profile and debug pre-built APKs - 图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 源代码,请执行以下操作:

    • Project 窗格中双击 .smali 文件(使用 Android 视图)。打开文件后,编辑器将显示一个黄色的警告横幅(如图 1 中所示),要求您选择 Java 源代码。
    • 点击编辑器窗口顶部的 Attach Java Sources
    • 导航到包含应用的 Java 源代码文件的目录,然后点击 Open
      Project 窗口中,IDE 会将 .smali 文件替换为它们对应的 .java 文件。 现在,您可以添加断点并像往常一样调试您的应用。

    附加原生调试符号

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

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

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

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

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