创建和修改运行/调试配置
在运行、调试或测试您的代码时,Android Studio 使用运行/调试配置确定如何执行操作。通常,默认配置已可满足运行或调试应用所需。然而,您可以修改配置和创建新配置,还可以修改默认模板,使其更适合您的开发流程,如本页所述。
如需了解详情,另请参阅以下 IntelliJ 文档:
关于运行/调试配置
运行/调试配置中指定了相关详细信息,例如应用安装、启动和测试选项。您可以将配置定义为一次性使用,也可以保存配置以备日后使用。 保存配置后,您可以从工具栏的 Select Run/Debug Configuration 下拉列表中选择该配置。Android Studio 会将配置保存为项目的一部分。
默认运行/调试配置
在您首次创建项目时,Android Studio 会根据 Android 应用模板,为主 Activity 创建一个默认运行/调试配置。如需运行或调试项目,您必须始终至少定义一个运行/调试配置。 因此,我们建议您不要删除默认配置。
项目范围和版本控制
运行/调试配置和模板更改仅应用于当前项目。您可以通过版本控制系统共享运行/调试配置(而非模板)。如需详细了解如何共享配置,请参阅命名和共享配置选项。
打开“Run/Debug Configurations”对话框
如要打开“Run/Debug Configurations”对话框,请依次选择 Run > Edit Configurations。此时将显示 Run/Debug Configurations 对话框,如图 1 所示。
图 1. Run/Debug Configurations 对话框
此对话框会在左侧面板中的 Defaults 文件夹下方显示默认模板,并在 Defaults 文件夹上方按模板类型对您定义的配置进行分组。您可以调整此对话框的大小以查看任何隐藏的项。
在此对话框中,您可以:
创建新的运行/调试配置
您可以通过 Run/Debug Configurations 对话框、Project 窗口或代码编辑器定义新的运行/调试配置。新配置必须基于默认模板。
“Run/Debug Configurations”对话框会显示您的运行/调试配置和可用的默认模板。您可以直接根据模板或从其他配置的副本开始定义新配置。然后,您可以根据需要更改字段值。
或者,您也可以在 Project 窗口中右键点击某个项,以自动创建该项专用的配置。例如,如果您要运行特定的 Activity,则可以右键点击相应的 Activity Java 文件,然后选择 Run。Android Studio 会使用 Android App、Android Instrumented Tests 或 Android JUnit 默认模板来创建配置,具体使用哪个模板,取决于所点击的项。
在代码编辑器中,您可以轻松地为类或方法创建测试和运行/调试配置,然后执行该配置。
如果您不是在 Run/Debug Configurations 对话框中创建的配置,那么创建的配置是临时配置,除非您保存该配置。默认情况下,项目中最多可以包含五个临时配置,超出此限制后,Android Studio 将开始移除多余的配置。如需更改此默认限制,请在 Run/Debug Configurations 对话框中点击 Defaults 文件夹,然后在 Temporary Configurations Limit 字段中输入相应值。如需详细了解临时配置,请参阅创建和保存临时运行/调试配置。
根据模板开始配置
如需根据模板定义运行/调试配置,请按以下步骤操作:
请务必更正在此对话框底部显示的所有错误。
- 打开“Run/Debug Configurations”对话框。
- 点击 Add New Configuration 图标 。
- 选择一个默认模板。
- 在 Name 字段中输入一个名称。
- 根据需要修改配置。
- 点击 Apply 或 OK。
使用副本开始配置
如需使用其他配置的副本开始定义运行/调试配置,请按以下步骤操作:
请务必更正在此对话框底部显示的所有错误。
- 打开“Run/Debug Configurations”对话框。
- 在左侧窗格中选择现有的运行/调试配置。
- 点击 Copy Configuration 图标 。
- 在 Name 字段中输入一个名称。
- 根据需要修改配置。
- 点击 Apply 或 OK。
为项目中的项定义配置
Android Studio 可以为 Project 窗口中显示的某些项创建运行/调试配置。该配置基于默认模板,如下所示:
- Activity Java 文件:Android App 模板。
- 软件包:Android Instrumented Tests 或 Android JUnit 模板,具体取决于您的源代码集。如果您选择插桩测试,则系统使用 Android Instrumented Tests 模板。如果您选择本地单元测试,则系统使用 Android JUnit 模板。对于本地单元测试,您可以选择在运行时使用代码覆盖率。如需了解详情,请参阅代码覆盖率。
如需为项目中的某个项创建运行/调试配置,请按以下步骤操作:
- 在“Android”或“Project”视图中打开一个项目。
- 在 Project 窗口中,右键点击某个可测试项,然后选择 Run filename 或 Debug filename。 Android Studio 会创建一个临时的运行/调试配置并启动您的应用。
- 从工具栏的 Select Run/Debug Configuration 下拉列表中选择 Save。如果您未看到工具栏,请依次选择 View > Toolbar。
图 2. 保存配置
注意:如果您右键点击并运行或调试同一项(但不是 Activity),Android Studio 会创建新配置。
为类或方法定义测试配置
在 Android Studio 中,您可以为某个类或方法定义测试运行配置,然后执行该配置。例如,如果创建一个新类,您可为其创建和运行测试。如果测试通过,您随后可以对项目的其余部分运行测试,以确保新代码不会在其他地方造成任何问题。
Android Studio 会使用 Android Instrumented Tests 或 Android JUnit 模板,具体取决于您的源代码集。对于本地单元测试,您可以选择在运行时使用代码覆盖率。
如需为 Java 代码中的某个类或方法创建运行/调试配置,请按以下步骤操作:
- 在“Android”或“Project”视图中打开一个项目。
- 在代码编辑器中打开一个 Java 文件。
- 选择代码中的某个类或方法,然后按 Ctrl+Shift+T (Command+Shift+T) 键。
- 从显示的菜单中选择 Create New Test。
- 在 Create Test 对话框中,根据需要更改或设置值,然后点击 OK。
- 在 Choose Destination Directory 对话框中,选择您希望 Android Studio 将测试放置在项目中的什么位置。您可以按目录结构或通过选择相邻类来指定位置。
- 点击确定。
新测试会显示在 Project 窗口中对应的测试源代码集内。
- 如需运行测试,请执行以下一项操作:
- 在 Project 窗口中,右键点击测试,然后选择 Run 或 Debug。
- 在代码编辑器中,右键点击测试文件中的某个类定义或方法名称,然后选择 Run 或 Debug,以测试该类中的所有方法。
- 从工具栏的 Select Run/Debug Configuration 下拉列表中选择 Save。
图 3. 保存配置
使用保存的配置运行或调试应用
如果您保存了运行/调试配置,可以在运行或调试应用之前选择该配置。
如需使用保存的运行/调试配置,请按以下步骤操作:
该下拉列表位于 Run 图标
和 Debug 图标
左侧;例如
。
或者,点击 Run 图标
或 Debug 图标
。
- 从工具栏的 Select Run/Debug Configuration 下拉列表中选择运行/调试配置。
- 依次选择 Run > Run 或 Run > Debug。
修改运行/调试配置
如需修改运行/调试配置,请按以下步骤操作:
请务必更正在此对话框底部显示的所有错误。
- 打开“Run/Debug Configurations”对话框。
- 在左侧窗格中选择一个配置。
- 根据需要修改配置。
- 点击 Apply 或 OK。
修改默认的运行/调试配置模板
您可以修改 Android Studio 提供的默认模板,使其适合您的开发过程。当您修改某个模板时,不会影响使用该模板的现有配置。例如,如果您需要创建某一类型的多个配置,您可以修改相应的模板,完成操作后再将其改回原样。
虽然您无法创建新模板,但可以创建与模板用途类似的配置。您可以复制配置并修改副本以创建新配置。
如需修改模板,请按以下步骤操作:
请务必更正在此对话框底部显示的所有错误。
- 打开“Run/Debug Configurations”对话框。
- 展开 Defaults 文件夹,并选择一个默认模板。
- 根据需要修改配置。
- 点击 Apply 或 OK。
对配置进行排序和分组
在 Run/Debug Configurations 对话框中,您可以对配置进行排序,以便快速找到它们。您可以按字母顺序对文件夹中的项目进行排序,并创建新的文件夹来对配置进行分组。
如需按字母顺序对配置进行排序,请按以下步骤操作:
- 打开“Run/Debug Configurations”对话框。
- 选择一个包含配置的文件夹。
- 点击 Sort Configurations 图标 。
- 点击 Apply 或 OK。
如需将配置分组至文件夹,请按以下步骤操作:
- 打开“Run/Debug Configurations”对话框。
- 选择一个包含配置的文件夹。
- 点击 Create New Folder 图标 。
- 在 Folder Name 字段中输入一个名称。
- 将同一模板类别中的项目拖动到此文件夹中。
- 对同一模板类别中的文件夹和配置进行排序,方法是将其拖动到适当位置或使用 Move Up 图标 和 Move Down 图标 调整位置。
- 点击 Apply 或 OK。
定义启动之前的操作
您可以指定要在应用运行/调试配置之前执行的任务。任务会按照其在列表中显示的顺序来执行。
注意:定义启动之前的任务是一项高级功能。我们建议您不要使用此功能,而应将任何准备逻辑作为任务添加到
build.gradle
文件中,以便在从命令行构建时执行这些逻辑。如需创建任务列表,请按以下步骤操作:
- 在 Run/Debug Configurations 对话框底部的 Before launch 下方,点击 Add 图标 ,然后选择一种任务类型。如果对话框打开,请填充其中的字段并点击 OK。
- 根据需要添加更多任务。
- 如需对任务进行排序,请选择一个任务并点击 Up 图标 或 Down 图标 ,以将其在列表中上移或下移。
- 如果您想在应用运行/调试配置设置前显示这些设置,请选择 Show this page。
默认情况下,此选项处于取消选中状态。
- 如果您希望在运行或调试应用时激活 Run 或 Debug 工具窗口,请选中 Active tool window。
默认情况下,此选项处于选中状态。
如需从列表中移除任务,请按以下步骤操作:
- 选择一个任务。
- 点击 Remove 图标 。
如需修改任务,请按以下步骤操作:
- 选择一个任务。
- 点击 Edit 图标 。
- 在打开的对话框中修改任务设置,然后点击 OK。
下表列出了可供添加的任务。
任务 说明 Run External tool 运行 Android Studio 外部的应用。在 External Tools 对话框中,选择您要运行的一个或多个应用,然后点击 OK。如果尚未在 Android Studio 中定义应用,请在 Create Tools 对话框中添加其定义。如需了解详情,请参阅配置第三方工具和外部工具。 Run Another Configuration 执行某个现有的运行/调试配置。在 Choose Configuration to Execute 对话框中,选择要执行的配置,然后点击 OK。 Make 编译项目或模块。如果运行/调试配置指定了特定的模块,Android Studio 会执行 Make Module 命令;如果未指定任何模块,则会执行 Make Project 命令。 Make Project 编译项目。Android Studio 将执行 Make Project 命令。 Make, no error check Android Studio 在执行运行/调试配置时不考虑编译结果,除此之外,此选项与 Make 相同。 Build Artifacts 在 Android Studio 中不受支持。 Run Gradle task 运行 Gradle 任务。在打开的对话框中,指定详情,然后点击 OK。如需了解详细信息,请参阅 Gradle。 Gradle-aware Make 编译项目并运行 Gradle。 App Engine Gradle builder App Engine Gradle builder 任务会同步项目,然后构建模块。 默认的运行/调试配置模板
Android Studio 提供了默认的配置模板,以帮助您快速入门。下面几部分介绍在使用 Android Studio 进行 Android 开发时适用的模板:
注意:Android Studio 2.1.x 及更低版本具有 Native Application 模板,而更高的版本则没有该模板。如果您的项目中包含 Native Application 模板,当您加载该项目时,Android Studio 会将该模板转换为 Android 应用模板。 Convert Project 对话框会引导您完成整个过程。
不受支持的模板
以下不受支持的模板来自 IntelliJ IDEA,并非是使用 Android Studio 进行 Android 开发的特定模板。如需了解如何使用这些模板,请点击 IntelliJ IDEA 文档的链接。
- Application
- Compound
- Gradle
- Groovy
- JAR Application
- Java Scratch
- JUnit
- Kotlin
- Kotlin Script
- Remote Debug
- Shell Script
- TestNG
通用配置选项
Name、Allow parallel run 和 Store as project file 选项是多个配置模板通用的选项。如需详细了解这些选项,请参阅常用设置。
Android Studio 将共享的运行/调试配置存储在
project_directory/.idea/runConfigurations/
文件夹下的各个 XML 文件中。 如需了解详情,请参阅 IntelliJ 项目文档中的基于目录的格式。Android 应用
您可以使用基于此模板的配置,在虚拟或硬件设备上运行或调试 Android 应用和 Activity。
“General”标签页
在 General 标签页中,您可以指定安装、启动和部署选项。Miscellaneous 标签页也包含安装选项。
字段 说明 模块 选择要应用此配置的模块。 Installation Options:Deploy 选择一个选项:
- Default APK - 为您当前选择的变体构建和部署 APK。
- APK from app bundle - 从 Android App Bundle 构建和部署应用。也就是说,Android Studio 会先将您的应用项目转换为 app bundle,其中包含了应用的所有经过编译的代码和资源。然后,Android Studio 仅会从该 app bundle 生成将应用部署到已连接的设备所需的 APK。通常,在测试想要上传到 Google Play 的 app bundle 时应使用此选项,因为从 app bundle 部署应用会延长总构建时间。
- Custom Artifact - 在 Android Studio 中不受支持。
- Nothing - 不在设备上安装 APK。例如,如果您更愿意手动安装 APK,则无需使用 Android Studio 进行安装。
Installation Options:Deploy as instant app 如果您的应用支持免安装体验(也就是说,您在创建新项目时添加了对免安装应用的支持,或者您创建了一个或多个支持免安装体验的功能模块),您可以选择部署这些支持免安装体验的模块,方法是勾选 Deploy as instant app 旁边的复选框。 Installation Options: Features to deploy 如果您的应用包含功能模块,在部署应用时,请选中要包含的每个功能旁边的复选框。只有在应用包含功能模块时,您才会看到此选项。 注意:如果要按需测试功能模块的下载和安装,您必须在发布 App Bundle 后使用 Play 管理中心内部测试轨道进行测试。如需了解详情,请参阅将您的 app bundle 上传到 Play 管理中心。
Installation Options:Install Flags 输入您要使用的任何 adb pm install
选项。设置选项格式的方式与在命令行上相同,但不指定路径。下面是一些示例:
-i foo.bar.baz -r /path/to/apk
和
-d -r
默认:无选项。
Launch Options:Launch 选择一个选项:
- Nothing - 当您选择 Run 或 Debug 时,不启动任何内容。 不过,如果您的应用已在运行且您选择了 Debug,Android Studio 会将调试程序连接到您的应用进程。
- Default Activity - 启动您在清单中标记为启动项的 activity。例如:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>- Specified Activity - 启动模块中特定的应用 Activity。 选择此选项后,Activity 字段将显示在下方,您可以在其中输入要启动的 Activity 的名称,也可以点击 More 以从列表中选择一个 Activity。
- URL - 启动与应用清单中的 intent 过滤条件匹配的网址。 选择此选项后,URL 字段将显示在下方,您可以在其中输入网址。
您必须填写此字段才能启动 Android 免安装应用。您也可以使用此网址来测试您的 Android 应用链接。
Launch Options:Launch Flags 输入您要使用的任何 adb am start
选项。设置选项格式的方式与在命令行上相同,但不指定 intent。例如:
-W
如果您选择的 Launch 值为 Nothing,则不会显示此选项。
默认:无选项。
Deployment Target Options:Target 选择一个选项:
- Open Select Deployment Target Dialog - 打开 Select Deployment Target 对话框,以选择虚拟设备或硬件设备。
- USB Device - 使用通过 USB 端口连接到开发计算机的硬件设备。如果有多个 USB 设备,将显示一个对话框,以便您可以进行选择。
- Emulator - 使用虚拟设备。在配置中,您可以选择一个 AVD;否则,会直接使用列表中的第一个 AVD。
Deployment Target Options:Use same device for future launches
默认情况下,此选项处于取消选中状态,所以每次运行应用时,系统都会显示 Select Deployment 对话框,供您选择设备。如果您选中此选项,随后运行某个应用,系统将显示 Select Deployment 对话框,供您选择设备。然后,每次运行该应用时,它都会在您选择的设备上启动,且系统不会显示 Select Deployment 对话框。如需在其他设备上运行应用,请取消选择 Use same device for future launches,或者通过依次选择 Run > Stop app 或选择 Stop 图标 来停止应用,然后重新启动。系统将显示 Select Deployment 对话框,以便您可以选择设备。 Before Launch 请参阅定义启动之前的操作。 “Miscellaneous”标签页
在 Miscellaneous 标签页中,您可以指定 logcat、安装、启动和部署选项。General 标签页也包含安装选项。
字段 说明 Logcat:Show logcat automatically 选中此选项后,每次使用此配置成功部署和启动应用时,系统都会打开 Logcat 窗口。默认:选中。 Logcat:Clear log before launch 如果您希望 Android Studio 在启动应用之前从日志文件中移除之前会话的数据,请选中此选项。默认:取消选中。 Installation Options:Skip installation if APK has not changed 选中此选项后,如果 Android Studio 检测到您的 APK 未更改,将不会重新部署 APK。 如果您希望 Android Studio 即使在 APK 未更改的情况下仍强行安装 APK,请取消选中此选项。默认:选中。 Installation Options:Force stop running application before launching activity 如果选中此选项,Android Studio 在检测到 APK 未更改从而无需重新安装 APK 时将强行停止应用,以便应用从默认启动器 activity 启动。如果取消选中此选项,Android Studio 便不会强行停止应用。
此选项与上一个用于控制是否安装 APK 的选项结合使用。对于这两个 Installation Options 字段,除非您明确希望每次都强行安装,否则请将它们保留为默认设置。
在某些情况下,您可能需要取消选中此选项。例如,如果您正在编写输入法引擎 (IME),强行停止应用会导致不将其选为当前键盘,您可能不希望出现这种情况。
默认:选中。
Before Launch 请参阅定义启动之前的操作。 “Debugger”标签页
在 Debugger 标签页中指定调试选项。
对于 C 和 C++ 代码,Android Studio 会使用 LLDB 调试程序。除了普通的 Android Studio 界面,调试程序窗口还有一个 LLDB 标签页,让您可以在调试过程中输入 LLDB 命令。您可以输入与 Android Studio 用于在调试程序界面中显示信息的命令相同的命令,还可以执行其他操作。
对于 C 和 C++ 项目,您可以在 Debugger 标签页中添加符号目录,以及 LLDB 启动与连接后命令。为此,您可以使用与下面类似的按钮:
- Add 按钮 - 添加一个目录或命令。
- Remove 按钮 - 选择一个目录或命令,然后点击此按钮即可移除该项。
- Up 按钮 - 选择一个目录或命令,然后点击此按钮即可将该项在列表中上移。
- Down 按钮 - 选择一个目录或命令,然后点击此按钮即可将该项在列表中下移。
如需详细了解如何在 Android Studio 中执行调试,请参阅调试您的应用。
字段 说明 Debug type 选择以下某个选项:
- Java only - 仅调试 Java 代码。
- Detect Automatically - 让 Android Studio 为您的项目选择最合适的调试类型。
- Native Only - 调试原生 C 或 C++ 代码。
- Dual (Java + Native) - 在两个单独的调试会话中调试 Java 和原生代码。
建议选择 Detect Automatically 选项,因为这样系统会为您的项目选择合适的调试类型。
Symbol Directories 如果要添加符号文件来为调试程序提供在 Android Studio 外部生成的 C 或 C++ 代码的信息,您可以在此处添加一个或多个目录。Android Studio 会优先使用这些目录中的任何文件,而不是 Android Plugin for Gradle 生成的文件。调试程序按顺序从上到下搜索目录,直到找到所需内容。它以递归方式搜索目录中的文件。如需优化列表并节省时间,请将最常用的目录放在列表顶部。
如果您指定的目录在树结构中位于较高的位置,搜索所有子目录可能需要较长的时间。如果您添加非常具体的目录,搜索所需的时间会较短。您需要在速度和查找调试所需的文件之间寻求适当的平衡。例如,如果您的目录包含用于存放不同 Android 二进制接口 (ABI) 的子目录,您可以选择添加目录,用于存放特定 ABI 或所有 ABI。搜索较高等级的目录所需时间较长,但如果您决定在不同设备上调试,这样做仍然是一种较为可靠的方法。
请注意,您不必添加包含 Gradle 符号文件的目录,因为调试程序会自动使用它们。
LLDB Startup Commands 添加要在调试程序连接到进程之前执行的 LLDB 命令。例如,您可以定义环境的设置,如以下命令所示:
settings set target.max-memory-read-size 2048
LLDB 将按照从上到下的顺序执行命令。
LLDB Post Attach Commands 添加要在调试程序连接到进程之后立即执行的 LLDB 命令。例如:
process handle SIGPIPE -n true -p true -s false
LLDB 将按照从上到下的顺序执行命令。
Host working directory 指定 LLDB 工作目录。 Logging:Target channels 指定 LLDB 日志选项。Android Studio 会根据团队的经验设置默认选项,所以速度不会太慢,但却包含问题排查所需的信息。Android Studio bug 报告经常需要请求日志。默认值为
lldb process:gdb-remote packets
您可以更改默认值以收集更多信息。例如,下面的日志选项可以收集特定
platform
的相关信息:lldb process platform:gdb-remote packets
如需查看日志命令的完整列表,请在 Android Studio 的 LLDB shell 窗口中输入
log list
命令。Android Studio 将设备日志置于下面的位置,其中
ApplicationId
是您构建的 APK 清单中使用的唯一应用 ID,可以在您的设备和 Google Play 商店中标识您的应用:
/data/data/ApplicationId/lldb/log
或者,如果多名用户访问设备,Android Studio 会将日志置于下面的位置,其中
AndroidUserId
是设备上用户的唯一标识符:
/data/user/AndroidUserId/ApplicationId/lldb/log
如需了解如何使用 LLDB 进行远程调试,请参阅远程调试。
Before Launch 请参阅定义启动之前的操作。 “Profiling”标签页
如果您的设备搭载的是 Android 7.1 或更低版本,则必须勾选 Enable advanced profiling 选项才能启用 Android Profiler 中的特定功能。
Android 测试
您应使用的测试模板取决于您的源代码集。Android Instrumented Tests 模板适用于插桩测试。Android JUnit 模板用于本地单元测试。
注意:如果您使用 Firebase Test Lab 在各种设备上进行测试,您可以使用 Android JUnit 模板来定义插桩测试。如需了解详情,请参阅利用 Firebase Test Lab 运行测试。
以下标签页说明介绍了 Android Instrumented Tests 测试模板的标签页和字段。如需了解 Android JUnit 测试模板的标签页和字段,请参阅 IntelliJ 运行/调试配置:JUnit 页面。
“General”标签页
在 General 标签页中,您可以指定测试位置、插桩测试运行程序、adb shell 和部署选项。
字段 说明 模块 选择要应用此配置的模块。 Test 在此区域中,指定要运行的测试的位置:
- All in module - 启动选定模块中的所有测试。
- All in package - 启动在 Package 字段中指定的软件包中的所有测试。输入名称,或点击 More 以从对话框中选择软件包。
- Class - 启动在 Class 字段中指定的类包含的测试。输入名称,或点击 More 以从对话框中选择类。
- Method - 启动测试方法。在 Class 字段中,指定包含相应方法的类。在 Method 字段中,指定相应的方法。输入名称,或点击 More 以从对话框中选择类或方法。
Specific instrumentation runner (optional) 输入插桩测试运行程序的位置;点击 More 以使用对话框。 build.gradle
文件指定插桩测试运行程序的位置;此值会替换该位置。默认值通常为 AndroidX Test 中的AndroidJUnitRunner
类。Extra options 输入您要使用的任何 adb
am instrument
选项。请勿输入组件。例如,如果您正使用 AndroidX Test 中的AndroidJUnitRunner
,您可以使用此字段向运行程序传递其他选项,例如-e size small
。默认:无选项。
Deployment Target Options:Target 选择一个选项:
- Open Select Deployment Target Dialog - 打开 Select Deployment Target 对话框,以选择虚拟设备或硬件设备。
- USB Device - 使用通过 USB 端口连接到开发计算机的硬件设备。如果有多个 USB 设备,将显示一个对话框,以便您可以进行选择。
- Emulator - 使用虚拟设备。在配置中,您可以选择一个 AVD;否则,会直接使用列表中的第一个 AVD。
- Firebase Test Lab Device Matrix - 请参阅利用 Firebase Test Lab 运行测试。
Deployment Target Options:Use same device for future launches 如果您希望以后自动使用您通过 Select Deployment Target 对话框选择的设备,请选中此选项。如果相应设备不可用,系统将显示一个对话框。默认:取消选中。 Before Launch 请参阅定义启动之前的操作。 “Miscellaneous”标签页
Miscellaneous 标签页包含 logcat 和安装选项。
字段 说明 Logcat:Clear log before launch 如果您希望 Android Studio 在启动应用之前从日志文件中移除之前会话的数据,请选中此选项。默认:取消选中。 Installation Options:Skip installation if APK has not changed 选中此选项后,如果 Android Studio 检测到您的 APK 未更改,将不会重新部署 APK。如果您希望 Android Studio 即使在 APK 未更改的情况下仍强行安装 APK,请取消选中此选项。默认:选中。 Installation Options:Force stop running application before launching activity 如果选中此选项,Android Studio 在检测到 APK 未更改从而无需重新安装 APK 时将强行停止应用,以便应用从默认启动器 activity 启动。如果取消选中此选项,Android Studio 便不会强行停止应用。
此选项与上一个用于控制是否安装 APK 的选项结合使用。对于这两个 Installation Options 字段,除非您明确希望每次都强行安装,否则请将它们保留为默认设置。
在某些情况下,您可能需要取消选中此选项。例如,如果您正在编写输入法引擎 (IME),强行停止应用会导致不将其选为当前键盘,您可能不希望出现这种情况。
默认:选中。
Before Launch 请参阅定义启动之前的操作。 “Debugger”标签页
在 Debugger 标签页中指定调试选项。
对于 C 和 C++ 代码,Android Studio 会使用 LLDB 调试程序。除了普通的 Android Studio 界面,调试程序窗口还有一个 LLDB 标签页,让您可以在调试过程中输入 LLDB 命令。您可以输入与 Android Studio 用于在调试程序界面中显示信息的命令相同的命令,还可以执行其他操作。
对于 C 和 C++ 项目,您可以在 Debugger 标签页中添加符号目录,以及 LLDB 启动与连接后命令。为此,您可以使用与下面类似的按钮:
- Add 按钮 - 添加一个目录或命令。
- Remove 按钮 - 选择一个目录或命令,然后点击此按钮即可移除该项。
- Up 按钮 - 选择一个目录或命令,然后点击此按钮即可将该项在列表中上移。
- Down 按钮 - 选择一个目录或命令,然后点击此按钮即可将该项在列表中下移。
如需详细了解如何在 Android Studio 中执行调试,请参阅调试您的应用。
字段 说明 Debug type 选择以下某个选项:
- Java only - 仅调试 Java 代码。
- Detect Automatically - 让 Android Studio 为您的项目选择最合适的调试类型。
- Native Only - 调试原生 C 或 C++ 代码。
- Dual (Java + Native) - 在两个单独的调试会话中调试 Java 和原生代码。
建议选择 Detect Automatically 选项,因为这样系统会为您的项目选择合适的调试类型。
Symbol Directories 如果要添加符号文件来为调试程序提供在 Android Studio 外部生成的 C 或 C++ 代码的信息,您可以在此处添加一个或多个目录。Android Studio 会优先使用这些目录中的任何文件,而不是 Android Plugin for Gradle 生成的文件。调试程序按顺序从上到下搜索目录,直到找到所需内容。它以递归方式搜索目录中的文件。如需优化列表并节省时间,请将最常用的目录放在列表顶部。
如果您指定的目录在树结构中位于较高的位置,搜索所有子目录可能需要较长的时间。如果您添加非常具体的目录,搜索所需的时间会较短。您需要在速度和查找调试所需的文件之间寻求适当的平衡。例如,如果您的目录包含用于存放不同 Android 二进制接口 (ABI) 的子目录,您可以选择添加目录,用于存放特定 ABI 或所有 ABI。搜索较高等级的目录所需时间较长,但如果您决定在不同设备上调试,这样做仍然是一种较为可靠的方法。
请注意,您不必添加包含 Gradle 符号文件的目录,因为调试程序会自动使用它们。
LLDB Startup Commands 添加要在调试程序连接到进程之前执行的 LLDB 命令。例如,您可以定义环境的设置,如以下命令所示:
settings set target.max-memory-read-size 2048
LLDB 将按照从上到下的顺序执行命令。
LLDB Post Attach Commands 添加要在调试程序连接到进程之后立即执行的 LLDB 命令。例如:
process handle SIGPIPE -n true -p true -s false
LLDB 将按照从上到下的顺序执行命令。
Host working directory 指定 LLDB 工作目录。 Logging:Target channels 指定 LLDB 日志选项。Android Studio 会根据团队的经验设置默认选项,所以速度不会太慢,但却包含问题排查所需的信息。Android Studio bug 报告经常需要请求日志。默认值为
lldb process:gdb-remote packets
您可以更改默认值以收集更多信息。例如,下面的日志选项可以收集特定
platform
的相关信息:lldb process platform:gdb-remote packets
如需查看日志命令的完整列表,请在 Android Studio 的 LLDB shell 窗口中输入
log list
命令。Android Studio 将设备日志置于下面的位置,其中
ApplicationId
是您构建的 APK 清单中使用的唯一应用 ID,可以在您的设备和 Google Play 商店中标识您的应用:
/data/data/ApplicationId/lldb/log
或者,如果多名用户访问设备,Android Studio 会将日志置于下面的位置,其中
AndroidUserId
是设备上用户的唯一标识符:
/data/user/AndroidUserId/ApplicationId/lldb/log
如需了解如何使用 LLDB 进行远程调试,请参阅远程调试。
Before Launch 请参阅定义启动之前的操作。 App Engine DevAppServer
此运行/调试配置适用于 Google Cloud Platform。如需了解详情,请参阅运行、测试和部署后端。当您按照上述步骤将项目同步到
build.gradle
文件后,Android Studio 将为您创建 App Engine DevAppServer 配置。请注意,IntellJ IDEA App Engine Server 模板与此处介绍的模板不同,Android Studio 中未提供该模板。
字段 说明 Single instance only 如果要确保当前仅执行运行/调试配置的一个实例,请选中此选项。系统不允许同时运行同一配置的多个实例。默认:选中。 模块 选择要应用此配置的模块。 Synchronize with build.gradle configuration 如果您添加 App 引擎模块并将其同步到 build.gradle
文件,系统将为您填充 App Engine DevAppServer 配置字段(推荐)。 依次选择 File > Sync Project with Gradle Files 也会同步项目。默认:选中。App Engine SDK 在本地计算机上输入适用于 Java 的 Google App Engine SDK 路径。点击 ... 以从对话框中进行选择。 War Path 输入您在本地开发服务器上部署的应用的 Web 应用归档 (WAR) 目录路径。点击 ... 以从对话框中进行选择。 VM Args 指定您要传递给虚拟机以用于启动 DevAppServer 的命令行选项。指定选项时,应遵循以下规范:
- 使用空格分隔不同的选项。
- 对于包含空格的选项,请使用引号 (
"
"
) 括住空格。- 如果选项包含引号,则在引号前添加反斜杠 (
\"
)。如需了解有关虚拟机选项的详细信息,请参阅适用于您的 J2SE 版本的文档,例如 java JDK 7 和 java JDK 8。
默认:无选项。
Server Address 输入要用于服务器的主机地址。您可能需要提供相应地址,才能从网络上的其他计算机访问开发服务器。地址 0.0.0.0 既允许本地主机访问,又允许主机名访问。默认:本地主机。 Server Port 输入要用于服务器的端口号。默认:8080。 Disable Check for App Engine SDK Updates 如果指定此选项,开发服务器将不会与 App Engine 通信来检查是否有新的 SDK 版本。默认情况下,该服务器会在启动时检查是否有新版本,如果有新版本,会输出一条消息。 Before Launch 请参阅定义启动之前的操作。 Wear OS 运行/调试配置
借助 Wear OS 复杂功能、卡片和表盘模板,您可以在虚拟或硬件设备上运行或调试 Wear OS 应用。大多数模板配置选项与 Android 应用选项相同。以下是相对更特定于 Wear OS 运行/调试配置的选项:
- 对于所有 Wear 运行/调试配置,您都必须选择要向其应用配置的特定复杂功能数据源、卡片或表盘(具体取决于模板)。通常,其中每个实体都对应于代码中的一个类。
- 对于 Wear OS 复杂功能运行/调试配置,您必须选择要将复杂功能数据源提供的复杂功能数据放到哪个显示槽。您可以选择将其放在表盘的顶部、右侧、底部、左侧或背景。
- 对于 Wear OS 复杂功能运行/调试配置,您还必须选择复杂功能数据源提供的复杂功能数据的类型。可供选择的类型仅限于所选复杂功能数据源提供并且所选显示槽支持的类型。如需查看复杂功能数据类型的列表,请参阅类型和字段。
或者,您也可以通过 Surface 声明旁的边线图标运行这些 Surface,如下图所示。
图 1. 直接使用边线图标运行 Wear OS Surface。
ndk-gdb
NDK 包含一个名为 ndk-gdb
的 Shell 脚本,可以启动命令行原生调试会话。偏好使用 GUI 的用户则应阅读在 Android Studio 中调试这篇文档。
要求
要运行命令行原生调试,必须满足以下要求:
- 使用
ndk-build
脚本构建您的应用。ndk-gdb
脚本不支持使用旧的make APP=<name>
方法进行构建。 - 在
AndroidManifest.xml
文件中添加可将android:debuggable
属性设为true
的<application>
元素,从而在该文件中启用应用调试。 - 构建可在 Android 2.2(Android API 级别 8)或更高版本上运行的应用。
- 在搭载 Android 2.2 或更高版本的设备或模拟器上进行调试。就调试而言,在
AndroidManifest.xml
文件中声明哪个目标 API 级别并不重要。 - 在 Unix shell 中开发您的应用。在 Windows 上,请使用 Cygwin 或实验性
ndk-gdb-py
Python 实现。 - 使用 GNU Make 3.81 或更高版本。
用法
要调用 ndk-gdb
脚本,请切换到应用目录或该目录下的任何目录。例如:
cd $PROJECT $NDK/ndk-gdb
其中,$PROJECT
指向您项目的根目录,$NDK
指向 NDK 安装路径。
调用 ndk-gdb
时,它会配置此会话以查找您的源文件以及所生成的原生库的符号/调试版本。成功附加到您的应用进程后,ndk-gdb
会输出一长串错误消息,表示无法找到各种系统库。这很正常,因为您的主机并未在目标设备上包含这些库的符号/调试版本。您可以放心地忽略这些消息。
接下来,ndk-gdb
会显示一个正常的 GDB 提示。
您可能熟悉与 GNU GDB 的互动方式,与 ndk-gdb
的互动方式与之相同。例如,您可以使用 b <location>
设置断点,并使用 c
(表示“continue”)继续执行。有关完整的命令列表,请参阅 GDB 手册。如果您更喜欢使用 LLDB 调试程序,请在调用 ndk-gdb
脚本时使用 --lldb
选项。
请注意,如果您退出 GDB 提示,那么您正在调试的应用进程将停止。此行为是一种 gdb 限制。
ndk-gdb
可处理许多错误情况,并会在发现问题时显示可提供有用信息的错误消息。这些检查包括确保满足以下条件:
- 确保 ADB 位于您的路径中。
- 确保您的应用已在其清单中声明为可调试。
- 确保设备上安装的具有相同软件包名称的应用同样可调试。
默认情况下,ndk-gdb
会搜索已在运行的应用进程;如果没有搜索到,则会显示相应的错误。不过,您可以使用 --start
或 --launch=<name>
选项在调试会话前自动启动您的 Activity。有关详情,请参阅选项。
选项
要查看完整的选项列表,请在命令行中输入 ndk-gdb --help
。表 1 显示了许多比较常用的选项及其简要说明。
表 1. 常用 ndk-gdb 选项及其说明。
在指定了此选项的情况下启动 ndk-gdb
,将会启动应用清单中列出的第一个可启动 Activity。使用 --launch=<name>
可启动下一个可启动的 Activity。要转储可启动 Activity 的列表,请从命令行运行 --launch-list
。
选项 | 说明> |
---|---|
--lldb | 如果设置了此项,该脚本将对会话使用 LLDB 调试程序,而不是 gdb。 |
--verbose | 此选项指示构建系统打印有关原生调试会话设置的详细信息。仅在调试程序无法连接到应用且 |
--force | 默认情况下,如果 ndk-gdb 发现同一设备上已有另一个原生调试会话在运行,它将会中止运行。此选项将终止另一个会话,并将其替换为新的会话。请注意,此选项不会终止正在被调试的实际应用,您必须另行终止它。 |
--start | 当您启动 |
--launch=<name> | 此选项类似于 |
--launch-list | 这个便捷选项会输出在您的应用清单中找到的所有可启动 Activity 名称的列表。 |
--project=<path> | 此选项可指定应用项目目录。如果您希望不必先切换到项目目录就可启动脚本,则该选项会很有用。 |
--port=<port> | 默认情况下, |
--adb=<file> | 此选项可指定 adb 工具可执行文件。只有在您未指定包含该可执行文件的路径时才需要使用此选项。 |
| 这些标记与具有相同名称的 adb 命令类似。如果您有多个设备或模拟器连接至主机,请设置这些标记。其含义如下所示:
连接至单个物理设备。
连接至单个模拟器设备。
连接至特定设备或模拟器。其中, 此外,您也可以定义 |
| 此选项可指示 |
--nowait | 解除 Java 代码的暂停状态,直到连上 GDB。传递此选项可能会导致调试程序错过早期的断点。 |
--tui -t | 启用文本界面(如果可用)。 |
--gnumake-flag=<flag> | 此选项是在查询 |
注意:此表中的最后三个选项仅适用于 ndk-gdb
的 Python 版本。
线程支持
如果运行应用的平台版本低于 Android 2.3(API 级别 9),ndk-gdb
就无法正确调试原生线程。调试程序只能调试主线程,abd 会完全忽略其他线程的执行。
如果您在非主线程上执行的函数上放置一个断点,则程序将退出,而 GDB 将显示以下消息:
Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists.
//
调试应用
Android Studio 提供了一个调试程序,用来执行以下操作及其他任务:
- 选择要在哪个设备上调试应用。
- 在 Java、Kotlin 和 C/C++ 代码中设置断点。
- 在运行时检查变量和对表达式求值。
本页包含基本调试程序操作的说明。如需查看更多文档,另请参阅 IntelliJ IDEA 调试文档。
启用调试功能
您需要先按以下说明做好准备,然后才能开始调试:
- 在设备上启用调试功能
如果您使用的是模拟器,则默认情况下会启用此功能。但是,对于已连接的设备,您需要在设备开发者选项中启用调试功能。
- 运行可调试的 build 变体:
您使用的 build 变体必须在 build 配置中包含 debuggable true。通常,您只需选择每个 Android Studio 项目中都包含的默认“debug”变体(即使它在
build.gradle
文件中不可见)。但是,如果您想将新 build 类型定义为可调试,则必须将“debuggable true”添加到该 build 类型中:android { buildTypes { customDebugType { debuggable true ... } } }
此属性也适用于包含 C/C++ 代码的模块。(
jniDebuggable
属性已弃用。)如果您的应用依赖于您也想调试的某个库模块,则该库也必须使用
debuggable true
进行打包,以便保留其调试符号。为了确保应用项目的可调试变体接收库模块的可调试变体,请务必发布库的非默认版本。
开始调试
您可以按如下方式启动调试会话:
- 在应用代码中设置一些断点。
- 在工具栏中,从目标设备下拉菜单中选择用于调试应用的设备。
如果您未配置任何设备,则需要通过 USB 连接设备或创建 AVD 以使用 Android 模拟器。
- 在工具栏中,点击 Debug 图标 。
如果您看到一个对话框询问您是否要“switch from Run to Debug”,这表示您的应用已在设备上运行,并且它将重启以便开始调试。如果您希望让同一应用实例保持运行状态,请点击 Cancel Debug,然后将调试程序连接到正在运行的应用。
否则,Android Studio 会构建一个 APK,使用调试密钥为其签名,将其安装在您选择的设备上,然后运行它。如果您向项目添加 C 和 C++ 代码,Android Studio 还会在 Debug 窗口中运行 LLDB 调试程序来调试您的原生代码。
- 如果 Debug 窗口未打开,请依次选择 View > Tool Windows > Debug(或点击工具窗口栏中的 Debug 图标 ),然后点击 Debugger 标签页,如图 1 所示。
图 1.“Debugger”窗口,其中显示的是某变量的当前线程和对象树
将调试程序连接到正在运行的应用上
如果您的应用已在设备上运行,则无需重启应用即可开始调试,具体操作步骤如下:
- 点击 Attach debugger to Android process 图标 。
- 在 Choose Process 对话框中,选择您想将调试程序连接至其上的进程。
如果您使用的是模拟器或已取得 root 权限的设备,则您可以勾选 Show all processes 以查看所有进程。
从 Use Android Debugger Settings from 下拉菜单中,您可以选择现有的运行/调试配置。(对于 C 和 C++ 代码,您可以重复使用现有配置中的 LLDB 启动命令、LLDB 连接后命令和符号目录。)如果您没有现有的运行/调试配置,请选择 Create New。此选项会启用 Debug Type 下拉菜单,您可以在其中选择其他调试类型。默认情况下,Android Studio 会使用 Auto 调试类型来选择最适合您的调试程序选项,具体取决于您的项目是包含 Java 代码还是 C/C++ 代码。
- 点击 OK。
此时将显示 Debug 窗口。
注意:Android Studio 调试程序与垃圾回收器采用松散集成。Android 虚拟机可保证在调试程序断开连接之前不会对调试程序发现的任何对象进行垃圾回收。这可能会导致在调试程序处于连接状态时,随着时间推移出现对象堆积。例如,如果调试程序发现了某个正在运行的线程,那么在调试程序断开连接之前,不会对关联的 Thread
对象进行垃圾回收,即使该线程已终止。
更改调试程序类型
由于调试 Java/Kotlin 代码和 C/C++ 代码需要不同的调试程序工具,因此 Android Studio 调试程序允许您选择要使用的调试程序类型。默认情况下,Android Studio 会根据在项目中检测到的语言来决定要使用哪种调试程序(使用 Auto 调试程序类型)。不过,您可以在调试配置(依次点击 Run > Edit Configurations)中或在您依次点击 Run > Attach debugger to Android process 后显示的对话框中手动选择调试程序。
可用的调试类型包括:
注意:如果您调试的是由编译器优化的原生代码,则您可能会收到以下警告消息:This function was compiled with optimizations enabled. Some debugger features may not be available
。使用优化标记(如 -O 标记)时,编译器会对编译的代码进行更改,以使其更加高效地运行。这可能会导致调试程序报告意外或不正确的信息,因为调试程序很难将优化的编译代码映射回原始源代码。因此,您应该在调试原生代码时停用编译器优化。
使用系统日志
系统日志会在您调试应用时显示系统消息。这些消息包括运行在设备上的应用产生的信息。如果您要使用系统日志调试应用,请确保您的代码在应用处于开发阶段时写入日志消息并输出有关异常的堆栈轨迹。
在代码中写入日志消息
如需在代码中写入日志消息,请使用 Log
类。日志消息会在您与应用交互时收集系统调试输出,从而帮助您了解执行流程。日志消息可以告诉您应用的哪个部分出现了故障。如需详细了解日志记录,请参阅写入和查看日志。
以下示例展示了如何添加日志消息,以确定您的 Activity 启动时先前的状态信息是否可用:
import android.util.Log; ... public class MyActivity extends Activity { private static final String TAG = MyActivity.class.getSimpleName(); ... @Override public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState != null) { Log.d(TAG, "onCreate() Restoring previous state"); /* restore state */ } else { Log.d(TAG, "onCreate() No saved state available"); /* initialize app */ } } }
在开发期间,您的代码还可以捕获异常并将堆栈轨迹写入系统日志:
void someOtherMethod() { try { ... } catch (SomeException e) { Log.d(TAG, "someOtherMethod()", e); } }
注意:当您准备好发布应用时,应从代码中移除调试日志消息和堆栈轨迹输出调用。为此,您可以设置一个 DEBUG
标记,并将调试日志消息放入条件语句。
查看系统日志
您可以在 Logcat 窗口中查看和过滤调试消息及其他系统消息。例如,您可以看到发生垃圾回收时显示的消息,或您使用 Log 类添加到应用的消息。
如需使用 logcat,请开始调试并选择底部工具栏中的 Logcat 标签页,如图 3 所示。
图 3. 包含过滤器设置的“Logcat”窗口
有关 Logcat 及其过滤选项的说明,请参阅使用 Logcat 写入和查看日志。
使用断点
Android Studio 支持几种类型的断点,这些断点可触发不同的调试操作。最常见的类型是行断点,用于在指定的代码行暂停应用的执行。暂停时,您可以检查变量,对表达式求值,然后继续逐行执行,以确定运行时错误的原因。
如需添加行断点,请按以下步骤操作:
- 找到您要暂停执行的代码行,然后点击该代码行的左侧边线,或将文字插入点置于该行上并按 Ctrl+F8(在 Mac 上,按 Command+F8)。
- 如果您的应用已在运行,您不必更新应用便可添加断点 - 只需点击 Attach debugger to Android proccess 图标 。否则,请点击 Debug 图标 开始调试。
图 3. 当您设置断点时,相应的代码行旁边会出现一个红点
当您的代码执行到达该断点时,Android Studio 会暂停应用的执行。您随后可以使用 Debugger 标签页中的工具确定应用的状态:
-
如需检查变量的对象树,请在 Variables 视图中将其展开。如果 Variables 视图不可见,请点击 Restore Variables View 图标
。
-
如需在当前执行点对表达式求值,请点击 Evaluate Expression 图标
。
-
如需前进到代码中的下一行(而不进入方法),请点击 Step Over 图标
。
-
如需前进到方法调用内的第一行,请点击 Step Into 图标
。
-
如需前进到当前方法之外的下一行,请点击 Step Out 图标
。
-
如需继续正常运行应用,请点击 Resume Program 图标
。
如果您的项目使用了任何原生代码,默认情况下,Auto 调试类型会将 Java 调试程序和 LLDB 作为两个单独的进程都连接到您的应用。这样一来,您无需重启应用或更改设置,便可在检查 Java 断点与 C/C++ 断点之间进行切换。
注意:要使 Android Studio 检测到 C 或 C++ 代码中的断点,您需要使用支持 LLDB 的调试类型,如 Auto、Native 或 Dual。您可以通过修改调试配置,更改 Android Studio 使用的调试类型。如需详细了解不同的调试类型,请阅读有关使用其他调试类型的部分。
当 Android Studio 将应用部署到目标设备时,系统会打开“Debug”窗口,在该窗口中为每个调试程序进程显示一个标签页或调试会话视图,如图 4 所示。
图 4. 使用 LLDB 调试原生代码
- 当 LLDB 调试程序遇到 C/C++ 代码中的断点时,Android Studio 会切换到 <your-module> 标签页。还会显示 Frames、Variables 和 Watches 窗格,其作用与您调试 Java 代码时完全相同。虽然 LLDB 会话视图中未显示 Threads 窗格,但您可以使用 Frames 窗格中的下拉列表访问您的应用进程。您可以在有关如何调试窗口帧和检查变量的部分中详细了解这些窗格。
注意:检查原生代码中的断点时,Android 系统会挂起运行应用的 Java 字节码的虚拟机。这意味着,检查原生代码中的断点时,您无法与 Java 调试程序进行交互,或从 Java 调试程序会话检索任何状态信息。
- 当 Java 调试程序遇到 Java 代码中的断点时,Android Studio 会切换到 <your-module>-java 标签页。
- 使用 LLDB 进行调试时,您可以利用 LLDB 会话视图中的 LLDB 终端向 LLDB 传递命令行选项。如果您想让 LLDB 在您每次开始调试应用时都执行某些命令(在调试程序连接到您的应用进程之前或之后执行),您可以将这些命令添加到您的调试配置中。
调试 C/C++ 代码时,您还可以设置特殊类型的断点,这类断点称为“观察点”,可以在您的应用与特定内存块进行交互时挂起您的应用进程。如需了解详情,请阅读有关如何添加观察点的部分。
查看和配置断点
如需查看所有断点并配置断点设置,请点击 Debug 窗口左侧的 View Breakpoints 图标
。此时将显示 Breakpoints 窗口,如图 5 所示。
图 5.“Breakpoints”窗口列出了当前的所有断点,并包括每个断点的行为设置
您可以从 Breakpoints 窗口左侧的列表中启用或停用每个断点。如果停用了某个断点,Android Studio 不会在应用遇到该断点时将其暂停。从列表中选择某个断点即可配置其设置。您可以将某个断点配置为最初处于停用状态,让系统在遇到其他断点后将其启用。您还可以配置在遇到某个断点后是否应将其停用。如需为任何异常设置断点,请在断点列表中选择 Exception Breakpoints。
调试窗口帧
在 Debugger 窗口的 Frames 窗格中,您可以检查导致遇到当前断点的堆栈帧。这样,您就可以浏览和检查堆栈帧,同时还可以检查 Android 应用中的线程列表。如需选择线程,请使用线程选择器下拉列表并查看其堆栈帧。点击帧中的元素会在编辑器中打开源代码。您还可以按窗口帧指南中的说明自定义线程呈现和导出堆栈帧。
检查变量
系统将您的应用停止在某个断点处并且您从 Frames 窗格中选择某个帧后,您可以在 Debugger 窗口的 Variables 窗格中检查变量。此外,您还可以在 Variables 窗格中使用选定帧内提供的静态方法和/或变量对临时表达式求值。
Watches 窗格提供的功能类似,不同的是添加到 Watches 窗格的表达式可跨调试会话存留。您应该为自己经常访问或者提供的状态对当前调试会话有帮助的变量和字段添加观察点。Variables 和 Watches 窗格如图 5 所示。
如需向 Watches 列表中添加变量或表达式,请按以下步骤操作:
- 开始调试。
- 在 Watches 窗格中,点击 Add 图标 。
- 在随后显示的文本框中,输入您要观察的变量或表达式的名称,然后按 Enter 键。
如需从 Watches 列表中移除某一项,请选择该项,然后点击 Remove 图标
。
选择某一项,然后点击 Up 图标
或 Down 图标 ,可对 Watches 列表中的元素重新排序。
图 6.“Debugger”窗口中的“Variables”和“Watches”窗格
添加观察点
调试 C/C++ 代码时,您可以设置特殊类型的断点,这类断点称为“观察点”,可以在您的应用与特定内存块进行交互时挂起您的应用进程。例如,如果您为某个内存块设置了两个指针并为其分配了一个观察点,则使用任一指针访问该内存块都会触发该观察点。
在 Android Studio 中,您可以通过选择特定变量在运行时创建观察点,但 LLDB 只会将该观察点分配给系统分配给该变量的内存块,而不会分配给变量本身。这与将变量添加到 Watches 窗格不同,将变量添加到该窗格后,您可以观察变量的值,但当系统读取或更改内存中的变量值时,不允许您挂起应用进程。
注意:当您的应用进程退出某个函数,并且系统从内存中解除分配其局部变量时,您需要重新分配为这些变量创建的所有观察点。
如需设置观察点,您必须满足以下要求:
- 您的目标物理设备或模拟器使用 x86 或 x86_64 CPU。如果您的设备使用 ARM CPU,则您必须将变量的内存地址边界分别按照 4 字节(对于 32 位处理器)或 8 字节(对于 64 位处理器)对齐。您可以通过在变量声明中指定
__attribute__((aligned(num_bytes)))
,在原生代码中对齐变量,如下所示:// For a 64-bit ARM processor int my_counter __attribute__((aligned(8)));
- 您已经分配了不超过三个观察点。Android Studio 在 x86 或 x86_64 目标设备上最多只支持四个观察点。其他设备支持的观察点数量可能更少。
注意:使用 32 位 ARM ABI 调试应用时,添加观察点或将鼠标悬停在代码内的变量上以检查其值可能会导致崩溃。为了解决此问题,请使用 64 位 ARM、x86 或 x86_64 二进制文件进行调试。此问题将在即将推出的 Android Studio 版本中得到解决。
如果您满足上述要求,便可以添加观察点,具体操作步骤如下:
- 在应用在某个断点处挂起的情况下,转到 LLDB 会话视图中的 Variables 窗格。
-
右键点击占用您要跟踪的内存块的变量,然后选择 Add Watchpoint。此时将显示一个用来配置观察点的对话框,如图 7 所示。
图 7. 向内存中的变量添加观察点
- 使用以下选项配置观察点:
- Enabled:如果您要告知 Android Studio 暂时忽略相应的观察点,可以取消选择此选项。Android Studio 仍会保存您的观察点,以便您稍后在调试会话中访问。
- Suspend:默认情况下,Android 系统会在其访问您分配给观察点的内存块时挂起应用进程。如果您不希望出现此行为,可以取消选择此选项。这样会显示一些附加选项,即 Log message to console 和 Remove [the watchpoint] when hit,您可以使用这些选项自定义系统与观察点进行交互时的行为。
- Access Type:选择当您的应用尝试对系统分配给变量的内存块执行 Read 或 Write 操作时是否应触发您的观察点。如需在执行读取或写入操作时触发您的观察点,请选择 Any。
- 点击 Done。
如需查看所有观察点并配置观察点设置,请点击 Debug 窗口左侧的 View Breakpoints 图标
。此时将显示 Breakpoints 对话框,如图 8 所示。
图 8. “Breakpoints”对话框列出了当前的观察点,并包括每个观察点的行为设置
添加观察点后,点击 Debug 窗口左侧的 Resume Program 图标
可继续执行应用进程。默认情况下,如果您的应用尝试访问您设置了观察点的内存块,Android 系统会挂起您的应用进程,您的应用最后执行的那行代码旁边会出现一个观察点图标 ,如图 9 所示。
图 9. Android Studio 会指示您的应用在即将触发观察点之前执行的那行代码
查看和更改资源值显示格式
在调试模式下,您可以查看 Java 代码中的变量的资源值并为其选择其他显示格式。在显示了 Variables 标签页并选择了帧的情况下,执行以下操作:
- 在 Variables 列表中,右键点击资源行的任意位置以显示下拉列表。
- 在下拉列表中选择 View as,然后选择您要使用的格式。
可供选择的格式取决于选定资源的数据类型。您可能会看到以下一个或多个选项:
- Class:显示类定义。
- toString:显示字符串格式。
- Object:显示对象(类实例)定义。
- Array:以数组格式显示。
- Timestamp:按 yyyy-mm-dd hh:mm:ss 格式显示日期和时间。
- Auto:Android Studio 根据数据类型选择最合适的格式。
- Binary:显示使用 0 和 1 表示的二进制值。
- MeasureSpec:从父级传递给选定子级的值。请参阅 MeasureSpec。
- Hex:显示为十六进制值。
- Primitive:显示为使用原始数据类型表示的数值。
- Integer:显示 Integer 类型的数值。
您可以按以下步骤创建自定义格式(数据类型渲染程序):
- 右键点击资源值。
- 选择 View as。
- 选择 Create。此时将显示 Java Data Type Renderers 对话框。
- 按照 Java 数据类型渲染程序中的说明进行操作。
Auto
如果您希望 Android Studio 自动为您要调试的代码选择最合适的选项,请选择此调试类型。例如,如果您的项目包含任何 C 或 C++ 代码,Android Studio 会自动使用 Dual 调试类型。否则,Android Studio 会使用 Java 调试类型。
Java
如果您只想调试使用 Java 或 Kotlin 编写的代码,请选择此调试类型。Java 调试程序会忽略您在原生代码中设置的任何断点或观察点。
Native(仅适用于 C/C++ 代码)
如果您只想使用 LLDB 来调试代码,请选择此调试类型。使用此调试类型时,Java 调试程序会话视图不可用。默认情况下,LLDB 只检查原生代码,而会忽略 Java 代码中的断点。如果您还想调试 Java 代码,则应切换到 Auto 或 Dual 调试类型。
原生调试仅适用于满足以下要求的设备:
-
设备支持
run-as
。如需检查设备是否支持
run-as
,请在连接到设备的 ADB shell 上运行以下命令:run-as your-package-name pwd
将
your-package-name
替换为您应用的软件包名称。如果设备支持run-as
,该命令应返回,不会出现任何错误。 -
设备启用了
ptrace
。如需检查是否启用了
ptrace
,请在连接到设备的 ADB shell 上运行以下命令:sysctl kernel.yama.ptrace_scope
如果启用了
ptrace
,则该命令会输出值0
或出现unknown key
错误。如果未启用ptrace
,则该命令会输出0
以外的值。
Dual(仅适用于 C/C++ 代码)
如果您想在同时调试 Java 代码和原生代码与不同时调试这两种代码之间切换,请选择此调试类型。Android Studio 会将 Java 调试程序和 LLDB 都连接到您的应用进程,一个用于 Java 调试程序,一个用于 LLDB。这样一来,您不必重启应用或更改调试配置,便可同时对 Java 代码和原生代码中的断点进行检查。
在图 2 中,请注意 Debug 窗口标题右侧的两个标签页。由于应用同时包含 Java 代码和 C++ 代码,因此一个标签页用于调试原生代码,另一个用于调试 Java 代码(如 -java 所示)。
图 2. 用于调试原生代码的标签页和用于调试 Java 代码的标签页