Android Studio官方文档之构建和运行你的APP

本文由MTJH翻译,jkYishon审校。

前言

默认情况下,Android Studio设置新的项目并且部署到模拟器或者真机设备上,只需要点击几下。使用即时运行,你并不需要构建一个新的APK即可将改变后的方法和现有的应用资源应用到一个正在运行的应用程序中,所以代码的改变是即时可见的。

点击Run

android官方文档training androidstudio官方文档_文档

来构建并运行你的APP。Android Studio通过Gradle构建你的App,选择一个部署的设备(模拟器或连接的设备),然后把你的APP部署上去。你也可以自定义这些默认的设置,例如你可以通过 changing the run configuration 选择自动部署到目标设备。

如果你希望使用模拟器(use the Android Emulator)来运行你的APP,你需要准备好一个Android虚拟设备(AVD)。如果你还没有创建一个模拟器,点击Run之后,在Select Deployment Target对话框中点击Create New Emulator。按照虚拟设备配置向导来定义创建你需要的模拟器。更多详细信息,请查看Create and edit virtual devices

如果你正在使用Android真机,你需要在设备上开启USB调试模式。更多详细信息,请查看Using hardware devices

Note:你也可以通过点击Debug

android官方文档training androidstudio官方文档_文档_02

通过调试模式部署你的APP。在调试模式下你可以在你的代码中设置断点,在运行时检查变量和表达式的值,并运行调试工具。更多详细信息,请查看Debugging with Android Studio.

选择和构建一个模块(Select and build a different module)

如果你的项目中除了默认的应用模块之外还有多个模块,你可以按照下面的步骤来构建一个特定的模块:

  • Project 面板中选择模块,然后点击 Build > Make Module module-name

Android Studio通过Gradle构建模块。一旦模块构建完成,如果你为一个新的APP或者新的设备构建了一个模块,你可以运行或者调试它,或者如果你构建了一个library或者Google Cloud 模块,可以作为依赖来使用它。

运行APP的一个模块:

  • 点击 Run>Run ,然后在运行对话框中选择模块。

改变 Run/debug 配置(Change the run/debug configuration)

run/debug配置指定了要运行的模块,封装部署,启动页面,目标设备,模拟器设置,logcat选项等等。默认的run/debug配置启动项目默认的Activity并且使用Select Deployment Target对话框选择部署目标。如果默认的设置不适合你的项目或者模块,你可以自定义设置run.debug配置,或者你可以在项目级、默认级或者模块级创建一个新的配置。编辑run/debug配置,选择Run > Edit Configurations。更多详细情况,参照Create and Edit Run/Debug Configurations

更改构建版本(Change the build variant)

默认情况下,当你点击Run的时候,Android Studio构建debug版本的APP,它只用于测试,你需要构建release版本来准备对外发布(prepare your app for public release)。

Android Studio更改构建版本,点击Build > Select Build Variant,然后在下拉列表中选择另一个选项。默认情况下,会生成一个debug和build版本。

根据product flavors,你可以为你的不同版本的APP创建额外的构建版本,每个版本都有不同的功能或者设备需求。关于build variants和 product flavors,详见Configure your build.

监控构建过程(Monitor the build process)

点击 Gradle Console

android官方文档training androidstudio官方文档_Android_03

你可以查看构建进度详情。控制面板显示了构建你的APP时Gradle执行的每个任务,如下图所示:

android官方文档training androidstudio官方文档_app_04

如果你的构建版本使用了产品特色,它调用任务来构建这些产品特色。点击IDE右侧窗口的Gradle

android官方文档training androidstudio官方文档_Android_05

来查看所有可用的构建任务列表。

如果在构建进程中出现了一个错误,Messages窗口会显示出来描述这个问题。Gradle可能会推荐几个命令行选项来帮助你姐姐这个问题,例如 –stacktrace 或者 –debug。使用命令行选项帮助你构建过程。

1.打开 Settings 或者 Preferences 对话框:

  • 在Windows或者Linux上,在菜单栏上选择 File > Settings
  • 在 Mac OSX 上,在菜单栏上选择 Android Studio > Preferences

2.定位到 Build,Execution,Deployment > Compiler

3.在 Command-line Options 旁边的文本输入框内,输入你的命令行选项。

4.点击 OK 保存并退出。

Gradle 下次尝试构建你的APP的时候将会尝试这些命令。

生成APKs(Generate APKs)

当你点击 Run 时,Android Studio 生成一个 debug 的 APK 并且部署到你的目标设备。在你生成一个 release 版本的 app 发布之前,然而,你首先必须学习如何签名你的APP(sign your app)。然后你可以构建多个签名后的 debug 或者 release 构建版本的APKs。找到生成的APK文件,点击弹出的对话框中的链接,如下图所示:

android官方文档training androidstudio官方文档_app_06


点击链接找到生成的APK文件。

关于 Instant Run(About Instant Run)

在 Android Studio 2.0版本中提到过,Instant Run 是 Run

android官方文档training androidstudio官方文档_Android_07

Debug

android官方文档training androidstudio官方文档_android_08

命令的一种行为,显著的减少更新你的应用的时间。尽管第一次构建可能需要更多的时间去完成,Instant Run 并不需要构建一个新的APK即可把随后的更新推送的你的APP,所以展示的更快了。

Instant Run 支持只有你构建 debug 版本并且使用 Android Plugin Gradle2.0版本或者更高,并且在你的APP模块级 build.gradle 文件中设置 minSdeVersion 为15或者更高。为了获得更好的性能,设置 minSdeVersion 为21或者更高。

部署APP之后,一个非常小的、黄色的雷电图标在 Run

android官方文档training androidstudio官方文档_android_09

按钮(或者 Debug

android官方文档training androidstudio官方文档_文档_10

按钮)中显示了,指示着当你下次点击按钮的时候 Instant Run 已经准备好推送更新。它只推送那些新的变化代替构建一个新的APK,在某种情况下,APP并不需要重新启动但却能即时的展示代码更新后的结果。

Instant Run 通过运行 hot swap,warm swap,or cold swap 推送更新后的代码和资源文件到连接着的设备或者模拟器,它会基于你所做的更改类型自动确定swap的类型。上面的视频提供了一个有趣的细节,关于这一切是如何工作的。然而当你推送确定的代码改变到一个目标设备,关于Instant Run表现的一个快速总结,见下表:

代码变化

Instant Run 运行情况

改变现有方法的实现代码

支持 hot swap :这是展示代码变化最快的swap类型。你的应用保持着运行状态,当下一次方法被调用的时候会执行新的方法。Hot swaps 在你运行着的APP中不初始化对象。也许你需要重启当前Activity或者重启App(restart the app),在你看到确定的更新之前。默认情况下,运行hot swap 之后 Android Studio 自动重启当前 Activity。如果你不需要这样的运行方式,你可以禁用自动重启Activity(disable automatic activity restarts)。

更改或移除已经存在的资源文件

支持 warm swap :这种swap依旧非常快,但是Instant Run 推送变更后的资源到你的App,必须重启当前的Activity,你的App仍然在运行状态,但是当Activity重启的时候屏幕会有一个微小的闪烁,这是正常的。

代码结构改变,例如:添加、移除或者改变: 注释;实例;静态变量; 静态方法签名;实例方法签名 更改当前class继承的父类 更改继承的接口列表 改变class的静态初始化方法 使用动态资源ID重新布局

支持 cold swap (API 21或更高):这种swap有点慢,因为尽管并不需要一个新的Apk,当 Instant Run 推送的代码结构改变时它必须重启整个app。运行的目标设备API为20或更低时,Android Studio 会部署整个APK。

更改 App 的 manifest文件 更改涉及到manifest资源文件时 更改Android widget UI文件(需要clean并且重新运行 clean and Rerun

当更改app的manifest文件或者涉及到manifest的资源文件时,Android Studio自动 deploys a new build 来应用这些变化。这是因为当APK安装到设备上时,某些涉及到app的信息例如app的名称,app的图标文件和intent filter等信息,都是在manifest文件确定的。如果你的构建过程自动更新APP manifest 的任何部分,例如自动迭代versionCode或者versionName,你将无法受益于Instant Run的充分展现。当你在debug构建版本时,使用Instant Run,你应该禁用自动更新manifest文件的任意部分。当更新Android widget UI元素时,你需要运行 Clean and Rerun 来查看变化。另外,因为执行清理重新构建当Instant Run时可能需要更长的时间,当你更新你的布局UI时可以禁用Instant Run(disable Instant Run)。

Note:当你的APP崩溃之后,你需要重启,不要从你的目标设备启动它。在你的目标设备重启你的App的时候,不要应用任何代码的改变自从上次cold swap 或者增量构建(incremental build)。保持最近的变化来启动你的App,点击Android Studio上的 Run

android官方文档training androidstudio官方文档_文档_11

(或者 Debug

android官方文档training androidstudio官方文档_android_12

)。

使用Rerun(Use Rerun)

当我们推送更新的代码影响特定的初始化的时候,例如onCreate()方法改变的时候,你需要重新启动APP使改变生效,点击Rerun

android官方文档training androidstudio官方文档_android官方文档training_13

进行增量构建并重启APP。如果你需要构建一个clean build,在菜单栏上点击Run > Clean and Rerun

android官方文档training androidstudio官方文档_app_14

,或者按住Shift键点击Rerun

android官方文档training androidstudio官方文档_文档_15

。这样即可停止正在运行的APP,执行一个完整的,clean之后的构建,然后将新APK部署到你的目标设备。

禁用Activity自动重启(Disable automatic activity restart)

当执行hot swap时,你的app保持运行状态但是Android Studio自动重启当前的Activity,按照以下步骤禁用:

1.打开Settings或者Preference对话框:

  • 在Windows或Linux上,在菜单栏选择File > Settings
  • 在Mac OSX上,在主菜单上选择Android Studio > Preferences

2.展开Build,Execution,Deployment > Instant Run.

3.取消选中Restart activity on code changes

如果禁用了Activity自动重启,你可以手动选择菜单栏中的Run > Restart Activity重启当前Activity。

为Instant Run配置优化你的项目(Configure and optimize your project for Instant Run)

Android Studio构建项目时使用Android Plugin Gradle2.0或者更高的时候默认启用Instant Run。

将已经存在的项目插件更新到最新版本:

1.打开Settings或者Preference对话框:

2.展开Build,Execution,Deployment > Instant Run并且点击Update Project,如下图所示。如果这个选项没有显示出来,这个项目的Gradle插件已经更新到最新版本了。


为已经存在的项目更新Gradle插件。

同时你需要将构建版本改为debug版(change the build variant)才可以使用Instant Run。

更改DEX资源提高构建速度(Improve build times by configuring DEX resources)

当你部署一个Clean后的构建,Android Studio促使你的APP允许Instant Run将代码和资源更新。虽然更新App更加迅速,第一次构建完成可能需要更长的时间。你可以通过配置一些DexOptions设置提高狗屎速度:

maxProcessCount

设置DEX允许同时运行的进程的最大数量,如果Gradle进程正在运行,你需要在初始化一个新的maximun进程数量之前停止正在运行的程序,你可以在终端窗口调用如下命令来终止Gradle进程:
在Windows上输入     gradlew --stop
在Linux/Mac OSC上输入       ./gradlew --stop

javaMaxHeapSize

设置DEX运行时内存最大值,当改变一个值时,你可以添加“k”表示字节,“m”表示兆字节,或者“g”表示千兆字节。

下面的示例在模块级build.gradle文件中设置maxProcessCount为4并且设置javaMaxHeapSize为“2g”:

...
  dexOptions {
    maxProcessCount 4 // this is the default value
    javaMaxHeapSize "2g"
  }
}

你应该尝试这些设置,递增这些值并且注意观察这些对构建时间的影响。如果你给DEX分配太多资源,可能会导致构建时间更长。

启用dexing-in-process和java增量编译(Enable dexing-in-process and incremental Java compilation)

Android Plugin for Gradle version 2.1.0或者更高版本提供了额外的构建进程改进,包含Java增量编译和dexing-in-process,默认启用了Java增量编译,在开发期间只重新编译资源改变的部分或者需要被编译的部分提高了编译效率。

Dexing-in-process执行dex构建过程中,而不是在一个单独的外包VM进程。这不仅使得增量构建更加快速,而且全面构建也有明显的加速。要启用这个特性,需要设置Gradle守护进程maximun大小至少2048MB。你可以按照如下步骤更改你项目的gradle.properties文件:

org.gradle.jvmargs = -Xmx2048m

如果你在模块级build.gradle文件中定义了javaMaxHeapSize一个值,你需要将守护进程的最大值设置为javaMaxHeapSize + 1024 MB。例如,如何你设置了javaMaxHeapSize 大小为“2g”,你需要在项目的gradle.properties文件中进行如下设置:

org.gradle.jvmargs = -Xmx3072m

从Windows Defender移除你的项目(Exclude your project from Windows Defender)

在Windows系统中,Windows Defender可能导致使用Instant Run变慢。如果你在使用Windows Defender,你应该使Windows Defender不再扫描Android Studio项目文件夹exclude your Android Studio project folder from Windows Defender malware scans

使用Crashlytics时提高构建速度(Improve build times when using Crashlytics)

如果你的Fabric Gradle插件版本低于1.21.6,Crashlytics可能导致构建时间变长。为了提高开发app的构建性能,你可以更新你的插件到最新版本(update the plugin to the latest version)或者在debug版本时禁用Crashlytics(disable Crashlytics for your debug build variant)。

Instant Run的局限性(Limitations of Instant Run)

在大多数情况下,Instant Run被开发的目的是加快构建和部署的速度。然而,在使用Instant Run时也有一些方面可能会影响其行为和与程序的兼容性。当你使用Instant Run时出现了任何问题,请提交这个bug(file a bug)。

部署到多个设备(Deploy to multiple devices)

Instant Run在不同的API级别的目标设备上使用不同的技术来执行热、暖、冷交换。为此,在部署一个应用到多个设备的时候,Android Studio暂时关闭Instant Run。

APP的Multidex(Multidex your app)

当你的项目为Legacy Multidex进行了配置,换句话说,当build.gradle配置multidexenabled为true并且minSdkVersion为20或者更低,并将项目部署到的设备运行Android4.4(API level 20)或者更低的时候,Android Studio会禁用Instant Run。

如果minSdkVersion设置为21或更高,Instant Run自动配置你的程序的multidex,因为Instant Run只是在debug版本的时候工作,当部署release版本的时候你可以需要配置你程序的multidex(configure your app for multidex)。

运行检测试验和性能分析(Run instrumented tests and performance profilers)

检测测试将debug APK和test APK在一个进程中部署到一个测试设备上,允许控制方法覆盖正常的app生命周期和执行测试。但运行或者debug测试时,Android Studio不注入Instant Run所需的附加方法,并将该功能关闭。

在分析一个app的时候,你应该禁用Instant Run,当使用Instant Run时对性能有一些影响,当使用hot swap重写方法时有略微大点的影响。这个性能的影响可能会干扰性能分析工具提供的信息。此外,此外,每一个hot swap产生的存根方法可以使堆栈跟踪复杂化。

使用第三方插件(Use third-party plugins)

当使用Instant Run时Android Studio会暂时禁用Java Code Coverage Library (JaCoCo)和ProGuard,因为Instant Run只在调试版本中运行,这不会影响你的发布版本。

某些第三方插件执行字节码增强可能导致运行你的应用程序Instant Run问题。如果你遇到这些问题,但仍希望使用Instant Run,你应该在debu版本的时候禁用这些插件。你也可以通过提交一个bug(filing a bug)来帮助改善兼容第三方插件的问题。

将变化推送到多进程app(Push changes to multi-process apps)

Instant Run只通过你的app的主进程为了执行hot swap 和warm swap,当推送改变到app其他的进程,例如更改方法的实现方式,或者现有的资源,Instant Run执行cold swap。

禁用Instant Run(Disable Instant Run)

禁用Instant Run:

1.打开Settings或者Preferences对话框。
2.展开Build,Execution,Deployment > Instant Run
3.取消选中Enable Instant Run选择框