Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

编译和运行您的应用

您只需点击几下,即可让 Android Studio 设置好要部署至 Android 模拟器或已连接设备的新项目。安装应用后,您可以使用 Apply Changes 部署特定代码和资源更改,而无需编译新的 APK。

要编译和运行您的应用,请按以下步骤操作:

  1. 在工具栏中,从运行配置下拉菜单中选择您的应用。
  2. 从目标设备下拉菜单中,选择要在其上运行应用的设备。

    目标设备下拉菜单。

    如果您未配置任何设备通过 USB 连接设备创建 AVD,才能使用 Android 模拟器

  3. 点击 Run 图标

更改运行/调试配置

当您首次运行应用时,Android Studio 使用默认运行配置。运行配置用于指定要通过 APK 还是 Android App Bundle 部署您的应用、要运行的模块、要部署的软件包、要启动的 Activity、目标设备、模拟器设置、logcat 选项,等等。

默认运行/调试配置会编译 APK,启动默认项目 Activity 并使用 Select Deployment Target 对话框选择目标设备。如果默认设置不适合您的项目或模块,您可以自定义运行/调试配置,也可以在项目、默认和模块级别创建新配置。要修改运行/调试配置,请依次选择 Run > Edit Configurations。如需了解详情,请参阅创建和修改运行/调试配置

更改编译变体

默认情况下,在您点击 Run 后,Android Studio 会编译应用的调试版本,不过这仅供在开发期间使用。

要更改 Android Studio 使用的编译变体,请在菜单栏中依次选择 Build > Select Build Variant

对于不含原生/C++ 代码的项目,Build Variants 面板有两列:ModuleActive Build Variant。模块的 Active Build Variant 值决定 IDE 会将哪个编译变体部署到您连接的设备并显示在编辑器中。

图 1. 对于不含原生/C++ 代码的项目,Build Variants 面板有两列

要在变体之间切换,请点击模块的 Active Build Variant 单元格,然后从列表字段中选择所需的变体。

对于含有原生/C++ 代码的项目,Build Variants 面板有三列:ModuleActive Build VariantActive ABI。模块的 Active Build Variant 值决定 IDE 部署到您的设备并且在编辑器中可见的编译变体。对于原生模块,Active ABI 值决定编辑器使用的 ABI,但不会影响部署的内容。

图 2. Build Variants 面板为含有原生/C++ 代码的项目增加了 Active ABI

要更改编译变体或 ABI,请点击 Active Build VariantActive ABI 列的单元格,然后从列表中选择所需的变体或 ABI。您更改选择后,IDE 会自动同步您的项目。更改应用或库模块的任一列都会将更改应用于所有相关行。

默认情况下,新项目使用以下两个编译变体进行设置:调试和发布变体。您需要编译发布变体,为应用公开发布做准备

要编译应用的其他变体(每个变体具有不同功能或设备要求),您可以定义其他编译变体

编译您的项目

Run 按钮可编译应用并将其部署到设备。但是,要编译应用以共享或上传到 Google Play,您需要使用 Build 菜单中的其中一个选项来编译项目的部分或全部代码。在选择表 1 中列出的任意编译选项之前,请务必先选择您要使用的编译变体

表 1. Build 菜单中的编译选项。

菜单项 说明
Make Module 编译自上次编译以来已修改的所选模块中的所有源文件,以及所选模块以递归方式依赖的所有模块。编译包括依赖源文件和所有关联的编译任务。您可以通过在 Project 窗口中选择模块名称或其中一个文件来选择要编译的模块。此命令不会生成 APK。
Make Project 生成所有模块。
Clean Project 删除所有中间/缓存的编译文件。
Rebuild Project 针对所选编译变体运行 Clean Project 并生成 APK。
Build Bundle(s)/APK(s) > Build APK(s)

为所选的变体编译当前项目中所有模块的 APK。编译完成后,系统将显示确认通知,提供指向 APK 文件的链接以及用于在 APK 分析器中对其进行分析的链接。

如果您选择的编译变体是调试编译类型,则使用调试密钥为 APK 签名,然后就可以安装了。如果您选择了发布变体,则 APK 默认处于未签名状态,您必须手动为 APK 签名。或者,您也可以从菜单栏中依次选择 Build > Generate Signed Bundle/APK

Android Studio 会将您编译的 APK 保存在 project-name/module-name/build/outputs/apk/ 中。

Build Bundle(s)/APK(s) > Build Bundle(s)

为所选的变体编译当前项目中所有模块的 Android App Bundle。编译完成后,系统将显示确认通知,提供指向 app bundle 的链接以及用于在 APK 分析器中对其进行分析的链接。

如果您选择的编译变体是调试编译类型,则使用调试密钥为 app bundle 签名,然后您可以使用 bundletool 通过 app bundle 将应用部署到连接的设备。如果您选择了发布变体,则 app bundle 默认处于未签名状态,您必须使用 jarsigner 手动为其签名。或者,您也可以从菜单栏中依次选择 Build > Generate Signed Bundle/APK

Android Studio 将您编译的 APK 保存在 project-name/module-name/build/outputs/bundle/ 中。

Generate Signed Bundle/APK 使用向导打开一个对话框以设置新的签名配置,并编译已签名的 app bundle 或 APK。您需要先使用发布密钥为应用签名,然后才能将其上传到 Play 管理中心。如需详细了解如何为您的应用签名,请参阅为应用签名

注意Run 按钮使用 testOnly="true" 编译 APK,这意味着 APK 只能通过 adb(Android Studio 使用的 adb)安装。如果您想要无需 adb 即可安装的可调试 APK,请选择您的调试变体,然后依次点击 Build Bundle(s)/APK(s) > Build APK(s)

如需详细了解 Gradle 针对每个命令执行的任务,请按照下一部分中的说明打开 Build 窗口。如需详细了解 Gradle 和编译过程,请参阅配置编译

监控编译过程

您可以通过依次点击 View > Tool Windows > Build(或点击工具窗口栏中的 Build 图标 ),查看有关编译过程的详细信息。该窗口显示 Gradle 为编译应用而执行的任务,如图 3 所示。

图 3. Android Studio 中的“Build Output”窗口

  1. “Build”标签:以树状显示 Gradle 执行的任务,其中每个节点表示一个编译阶段或一组任务依赖项。如果您收到构建时错误或编译时错误,请检查该树并选择一个元素来查看错误输出,如图 4 所示。

    图 4. 检查“Build Output”窗口是否有错误消息

  2. “Sync”标签:显示 Gradle 为与项目文件同步而执行的任务。与 Build 标签类似,如果您遇到同步错误,请在树中选择元素以查找有关错误的更多信息。
  3. Restart:通过为项目中的所有模块生成中间编译文件,执行与依次选择 Build > Make Project 相同的操作。
  4. Toggle view:在以图形树形式显示任务执行情况与显示 Gradle 中更详细的文本输出(即在 Android Studio 3.0 及更低版本上的 Gradle Console 窗口中显示的输出)之间切换。

如果您的编译变体使用产品变种,Gradle 也会调用任务来编译这些产品变种。要查看所有可用编译任务的列表,请依次点击 View > Tool Windows > Gradle(或者在工具窗口栏中点击 Gradle 图标 )。

如果在编译过程中出现错误,Gradle 可能会向您推荐一些命令行选项来帮助您解决问题,例如 --stacktrace--debug。要在编译过程中使用命令行选项,请执行以下操作:

  1. 打开 SettingsPreferences 对话框:
    • 在 Windows 或 Linux 上,从菜单栏中依次选择 File > Settings
    • 在 Mac OSX 上,从菜单栏中依次选择 Android Studio > Preferences
  2. 依次转到 Build, Execution, Deployment > Compiler
  3. 在“Command-line Options”旁的文本字段中,输入您的命令行选项。
  4. 点击 OK 保存,然后退出。

Gradle 会在您下次尝试编译应用时应用这些命令行选项。

Apply Changes

在 Android Studio 3.5 及更高版本中,借助 Apply Changes 功能,您可以将代码和资源更改推送到正在运行的应用中,而无需重启应用(在某些情况下,您无需重启当前 Activity)。有了这种灵活性,您就可以控制在想部署和测试细微增量更改时重启应用的多大部分,同时保留设备的当前状态。Apply Changes 使用搭载 Android 8.0(API 级别 26)或更高版本的设备上支持的 Android JVMTI 实现中的功能。要详细了解 Apply Changes 的工作原理,请参阅 Android Studio Project Marble:Apply Changes

要求

Apply Changes 操作仅在满足以下条件时可用:

  • 您使用调试编译变体来编译应用的 APK。
  • 您将应用部署到搭载 Android 8.0(API 级别 26)或更高版本的目标设备或模拟器上。

使用 Apply Changes

如果要将更改部署到兼容设备,请使用以下选项:

Apply Changes and Restart Activity Apply Changes and Restart Activity 图标

尝试通过重启 Activity 但不重启应用来应用资源和代码更改。通常,如果您修改了方法正文中的代码或修改了现有资源,则可以使用此选项。

您也可以按 Ctrl+Alt+F10(或者,在 macOS 上,按 Control+Shift+Command+R)执行此操作。

Apply Code Changes Apply Code Changes 图标

尝试仅应用代码更改而不重启任何内容。通常,如果您修改了方法正文中的代码,但没有修改任何资源,则可以使用此选项。如果您既修改了代码也就修改了资源,则应改为使用 Apply Changes and Restart Activity

您也可以按 Ctrl+F10(或者,在 macOS 上,按 Control+Command+R)执行此操作。

Run Run 图标

部署所有更改并重启应用。如果使用任一 Apply Changes 选项都无法应用您所做的更改,请使用此选项。要详细了解需要重启应用的更改类型,请参阅 Apply Changes 的限制

为 Apply Changes 启用 Run fallback

您点击 Apply Changes and Restart ActivityApply Code Changes 后,Android Studio 会编译新 APK 并确定是否可以应用更改。如果更改无法应用并且将导致 Apply Changes 失败,则 Android Studio 会改为提示您重新 Run Run 图标 应用。不过,如果您不想在每次发生这种情况时都收到提示,则可以将 Android Studio 配置为每当更改无法应用时便自动重新运行您的应用。

要启用此行为,请按以下步骤操作:

  1. 打开 SettingsPreferences 对话框:

    • 在 Windows 或 Linux 上,从菜单栏中依次选择 File > Settings
    • 在 macOS 上,从菜单栏中依次选择 Android Studio > Preferences
  2. 依次转到 Build, Execution, Deployment > Deployment

  3. 选中复选框以针对任一 Apply Changes 操作启用自动 Run fallback。

  4. 点击 OK

Apply Changes 的限制

Apply Changes 旨在加快应用部署流程。不过,它的使用时机存在一些限制。如果您在使用 Apply Changes 时遇到任何问题,请提交错误

需要重启应用的代码更改

在重启应用之前,某些代码和资源更改无法应用,其中包括以下方面的更改:

  • 添加或删除类、方法或字段
  • 更改方法签名
  • 更改方法或类的修饰符
  • 重命名类
  • 更改类继承行为
  • 更改枚举中的值
  • 添加或移除资源
  • 更改应用清单
  • 更改原生库(SO 文件)

库和插件

某些库和插件会自动更改您的应用的清单文件或清单中引用的资源。这些自动更新可以通过下列方式影响 Apply Changes:

  • 如果库或插件更改您的应用的清单,您不能使用 Apply Code Changes 图标 Apply Code Changes 图标Apply Changes and Restart Activity 图标 Apply Changes and Restart Activity 图标,而必须重启应用,才能看到相应更改。
  • 如果库或插件更改您的应用的资源文件,您不能使用 Apply Code Changes 图标 Apply Code Changes 图标,而必须使用 Apply Changes and Restart Activity 图标 Apply Changes and Restart Activity 图标 来查看相应更改。

您可以通过为调试编译变体停用所有自动更新来避免这些限制。

例如,Crashlytics 在每次编译过程中使用唯一的编译 ID 更新应用资源,这会阻止您使用 Apply Code Changes 图标 Apply Code Changes 图标,并要求您重启应用的 Activity 才能查看相应更改。您可以停用此行为,以便能将 Apply Code Changes 与 Crashlytics 一起用于调试编译。

直接引用已安装 APK 中的内容的代码

如果您的代码直接引用已在设备上安装的应用 APK 中的内容,在您点击 Apply Code Changes 图标 Apply Code Changes 图标 后,该代码可能会导致崩溃或出现异常。发生此行为的原因是当您点击 Apply Code Changes 时,设备上的底层 APK 会在安装过程中被替换。在这些情况下,您可以改为点击 Apply Changes and Restart Activity 图标 Apply Changes and Restart Activity 图标Run 图标 Run 图标

已知问题

以下是目前已知的 Apply Changes 所出现的问题。

Android Runtime 中的问题抛出错误

如果您使用的是搭载 Android 8.0 或 8.1 的设备,您在尝试应用某些类型的更改时(特别是当您使用 Kotlin 时),可能会看到“VERIFICATION_ERROR”消息。此消息是 Android Runtime 问题引起的,在 Android 9.0 及更高版本中已解决此问题。虽然该问题会导致 Apply Changes 失败,但您仍可以重新 Run Run 图标 您的应用来查看更改。但我们建议您将设备升级到 Android 9.0 或更高版本。

使用 android:sharedUserId 时无法应用更改

当您尝试更改尚未部署到正在运行的应用的类时,那么如果您的应用通过以下任一方式配置,Apply Changes 将失败:

当 Apply Changes 因这一问题而失败时,Android Studio 会显示以下消息:

Changes were not applied. JVMTI error: UNKNOWN_JVMTI_ERROR
    

此问题 (#135172147) 已在 Android Studio 3.6 Canary 6 及更高版本中修复。要在 Android Studio 3.5 中解决此问题,请点击 Run 图标 Run 图标 以重新部署您的应用并查看相应更改。