65.9K
CodeProject 正在变化。 阅读更多。
Home

启动您的 Android 应用:运行设备模拟器和调试代码(3 部分中的第 3 部分)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2016 年 2 月 11 日

CPOL

21分钟阅读

viewsIcon

27325

downloadIcon

241

让 Android 设备模拟器运行起来。添加代码以生成 Android 日志输出,并学习如何使用 Android Studio 调试器单步调试代码。

文章笔记

本文包含我即将出版的著作《启动您的 Android 应用》的第三章。

在我完成这本书后(预计发布日期:2016-03-11),我将以 2.99 美元的价格在亚马逊上发布整本书的 Kindle 版本。

我还会在此之后几天发布印刷版(定价因印刷成本而异,但预计在 8.99 美元至 9.99 美元之间)。

要阅读引言和第一章,请查看我在此 CodeProject 上的文章:

https://codeproject.org.cn/Articles/1077609/Launch-Your-Android-App-Intro-Getting-Started-part (在新标签页中打开)

要阅读第二章,请访问:https://codeproject.org.cn/Articles/1077807/Launch-Your-Android-App-Generate-Your-First-Projec (在新标签页中打开)

如果您快速滚动浏览本文,您会发现它相当长。这是因为它包含了 37 张截图。

演练体验

我正在以演练的方式撰写这本书,以期创造更好的信息产品。我希望这种方法能让您阅读并体验开发过程,就像您在 Android 开发者肩旁观看一样。

我相信这将是涵盖 Android 开发这个复杂主题的有效方式。

尝试创建混合格式

这在某种程度上是视频教程与书籍的混合格式。

这种格式试图解决什么问题?

它试图解决阅读书籍时需要键入代码才能看到结果的挑战。相反,在这里您可以专注于阅读和体验代码,就像第一次在 Android 开发者肩旁观看一样。然后,在阅读完章节后,您会更容易自己编写代码,只需简要参考本书。

有增值吗?

我相信,即使您是高级开发者,也会发现这次演练相当有趣,因为您可以直接快速浏览文章(和书籍),作为您在 Android Studio 中工作时将看到的内容的预览。

继续我们的测试应用:在模拟器中运行

我们现在将接续第二章的内容。如果您还没有阅读第二章,请现在阅读。

在 Android Studio 的顶部主菜单中,我们要点击并展开“运行”菜单。

run app

展开后,我们要选择“运行应用”选项。

当您单击该菜单项时,将出现一个对话框,如下所示。

choose device

该对话框的底部是我们关心的部分。您可以看到 Android Studio 已为我们自动选择了“启动模拟器”单选按钮,因为它知道此时还没有模拟器在运行。

您还可以看到它建议我们运行的 Android 虚拟设备(AVD)名为 Nexus4。

现在,请继续单击“[确定]”按钮。

##############################################################################

##############################################################################

注意:当我尝试启动虚拟设备时,什么也没发生,我花了很多时间试图找出原因。我将在侧边栏中添加所有我尝试过的方法,以防您遇到问题。

我在 StackOverflow 上详细描述了这个问题:

http://stackoverflow.com/questions/35272258/avd-manager-on-android-studio-1-5-1-and-install-to-a-custom-location-emulator-wo (在新标签页中打开)

否则,本章将继续进行,假定您在启动模拟器时没有遇到任何问题。

##############################################################################

##############################################################################

最终*,您应该会看到类似如下的画面。

*根据您的硬件,Android 虚拟设备(模拟器)可能需要很长时间才能最终启动。

app running on device

此时,应用看起来与我们在 Android Studio 预览中看到的非常相似。

然而,出于某种原因,预览中标题栏没有显示“Test”这个词,而模拟器版本显示了。

点击模拟器触屏

此外,您还可以用鼠标点击界面,应用会像在真实设备上触摸屏幕一样做出反应。

免费功能

由于我们选择了 Android Studio 提供的布局模板,因此应用程序中会提供一些免费功能。

首先,点击应用右上角菜单中的垂直省略号,您会看到一个菜单项:“设置”。

settings menu

但是,点击出现的“设置”菜单将不会执行任何操作,因为我们还没有为其编写任何代码。

现在,让我们继续点击带有信封图标的圆形粉色按钮。点击它不会有太多作用,但它会激活“snackbar”。

现在就试试。

UI 会调整,并出现一条小消息。

snackbar

在我们开始深入研究代码之前,让我们确保我们对工具的使用相当熟悉。长远来看,这将是值得的。

我们将查看以下列表来完成本章,然后在下一章我们将开始编写一些代码,实际做一些事情来修改应用程序。

当然,如果您对自己跳过这些项目有信心,因为您已经理解了它们,那么请随意这样做。

我们将查看

  1. Android Monitor 和 Logcat

  2. 在我们的应用中添加代码以向 Logcat 写入行

  3. 运行(输出)窗口

  4. 消息窗口:仔细查看应用未能正确构建时的输出

  5. ADB(Android 调试桥)命令行

在我们完成这些项目后,您将对 Android Studio 非常熟悉,并且在 Studio 中移动和理解我们正在处理的代码将更容易。

关闭正在运行的 Android 应用

我们要做的第一件事是关闭我们刚刚在模拟器上运行的应用。

有一个简单的方法可以做到这一点。返回模拟器并单击“返回”按钮。

它是下面图像中左侧显示的弯曲箭头按钮。

android menu

我们稍后将了解更多关于此的信息,但当您在 Android 应用中触摸该按钮时,它实际上会暂停并关闭该应用。

现在就去您的模拟器上操作。

应用应该会消失,您可能会再次看到 Android “桌面”。

现在,切换回 Android Studio,并确保您单击窗口底部的“Android Monitor”按钮。这将显示 Android Monitor,以便我们查看它。

android monitor logcat

如果您将鼠标缓慢移过该窗口的顶部边框,您的光标将变成一个双向上箭头,这样您就可以根据需要调整窗口大小以查看更多内容。

请注意,您可以通过其标题栏显示“Android Monitor”来判断此窗口是否具有焦点。另请注意,左侧高亮显示的选项卡是 logcat。

目前,此窗口显示的是 Android 日志,该日志在 Android 运行时会持续写入。

信息量过大

有时,写入此窗口的信息量可能会压倒一切,因为系统中的每个事件都在此处写入,但我们将学习如何过滤它,以便只查看我们感兴趣的事件,以及在调试应用程序时对我们有帮助的事件。

清空 Android Monitor

首先,让我们清空 Android Monitor。要做到这一点,只需右键单击您看到文本的监视器区域,就会出现一个上下文菜单。

clear all

选择“全部清除”菜单项,窗口中的所有文本都会消失。

这将帮助我们看到启动应用程序时写入的事件。

再次启动应用

让我们再次启动应用程序,但这次,我们将查看此窗口中出现的输出。

为此,请单击 Android Studio 顶部菜单下方的绿色三角形箭头。

它是下面图像中指向右侧的绿色箭头。

run button menu

单击后,您将看到“设备选择器”窗口。

device chooser

即使您的模拟器仍在运行,该窗口每次都会出现。但是,您可以勾选“以后启动使用相同设备”选项,这样它将始终使用您正在运行的设备,从而不再打扰您。别担心,稍后仍有办法通过另一个菜单选项进行切换,以防万一。

单击“[确定]”按钮以启动应用程序。

这样做时,请密切关注 Android Monitor logcat 窗口,因为应用程序启动时会写入大量消息。

我复制了写入的文本,超过 4600 行。每页 50 行,如果打印出来将超过 92 页。

以下是输出中的一些有趣行,带有注释(标记为“注意”)以及我强调的部分(粗体)。

02-08 16:01:48.361 37-37/? D/dalvikvm: GC_EXPLICIT freed 13K, 1% free 12554K/12611K, paused 2ms+4ms

注意:dalvikvm 是所有 Android 程序在 Android 4.4(KitKat)及更早版本中运行的虚拟机。这是运行所有 Android 设备(4.4 及更早版本)上应用程序的 Java 运行时,而不仅仅是模拟器内的应用程序。

02-08 16:01:48.361 37-37/? W/Zygote: Preloaded drawable resource #0x1080475 (res/drawable-xhdpi/quickcontact_badge_overlay_normal_light.9.png) that varies with configuration!!

02-08 16:01:49.070 86-100/? I/SystemServer: Entropy Service

02-08 16:01:49.130 86-100/? I/SystemServer: Power Manager

02-08 16:01:49.141 86-100/? I/SystemServer: Activity Manager

02-08 16:01:49.170 86-101/? I/ActivityManager: Memory class: 64

02-08 16:01:49.291 86-101/? A/BatteryStatsImpl: problem reading network stats

              java.lang.IllegalStateException: problem parsing idx 1

                          at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:300)

                     at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:250)

注意:您可以看到系统中发生了与我们的应用程序无关的异常(错误)。

02-08 16:08:29.517 86-93/? I/dalvikvm: Jit: resizing JitTable from 4096 to 8192

02-08 16:08:29.737 86-104/? I/PackageManager: Removing non-system package:us.raddev.test

02-08 16:08:29.737 86-101/? I/ActivityManager: Force stopping package us.raddev.test uid=10040

注意:这些行表明我们应用程序的先前版本正在从设备中移除并停止运行。

02-08 16:08:37.737 86-100/? D/BackupManagerService: Received broadcast Intent { act=android.intent.action.PACKAGE_ADDED dat=package:us.raddev.test flg=0x10000010 (has extras) }

注意:此处正在将我们应用程序的新版本部署到设备。

2-08 16:08:42.007 622-622/? D/dalvikvm: Not late-enabling CheckJNI (already on)

02-08 16:08:42.037 86-233/? I/ActivityManager: Start proc us.raddev.test for activity us.raddev.test/.MainActivity: pid=622 uid=10040 gids={}

注意:此处应用程序正在启动。

02-08 16:08:44.647 86-114/? I/ActivityManager: Displayed us.raddev.test/.MainActivity: +2s716ms

注意:最后,MainActivity 正在屏幕上显示。

希望这能为您提供一些关于日志记录的见解,并且您实际上可以获取有关您的应用程序在屏幕上绘制之前正在做什么的信息。

但是,这信息太多了,无法深入挖掘。这就是为什么您可以向应用程序添加一些代码并启用过滤器,以便只显示您想在 logcat 窗口中看到的信息。

修改 MainActivity.java

让我们开始对 Java 代码进行一些更改,以添加我们的日志记录功能。

当用户单击“设置”菜单项时,我们将让应用程序记录。

返回 Android Studio,在编辑器中打开 MainActivity.java 类。如果需要,在左侧的项目树视图中双击该文件,文件应该会在右侧的编辑器窗口中为您打开。

MainActivity.java

滚动到 MainActivity.java 文件底部,您会看到一个名为 onOptionsSelected 的函数。它看起来是这样的。

onOptionsSelected

我们将在显示的 if 语句中,在开头的花括号之后键入一些代码。

该代码目前看起来是这样的。

if (id == R.id.action_settings) {
           return true;
       }

现在,让我们修改它(添加下面代码片段中显示的粗体行)。

if (id == R.id.action_settings) {

         Log.d("test","User clicked the Settings menu item.");
         return true;
 }

当您输入到该行的 d 时,Android Studio 将提供一些帮助。

android code help

它只是想告诉您有一个它知道的名为 Log.d 的函数,并且有几个函数重载(函数接受不同数量和类型的参数)。

我们将使用显示的第一个,但您也可以只输入开括号(。

完成此操作后,Android Studio 将自动输入闭括号,并提供更多帮助。

alt-enter import

它告诉您,您正在寻找的函数存在于一个特定的包(库 - android.util.Log)中,而您尚未包含对其的引用。要添加包,只需按 Alt 键和 Enter 键组合。

完成此操作后,Android Studio 会在 MainActivity.java 的顶部添加以下行。

import android.util.Log;

这会导致 Java 编译器在构建代码时包含该包。这使得 Log.d 函数(由原始 Android 开发人员编写)可供您调用。

但是,现在我们仍然需要将两个字符串添加到 Log.d 函数中,否则代码将无法编译。

请确保您的行现在已完成。

Log.d("test","User clicked the Settings menu item.");

正确后,它将看起来像这样。

Log.d working

请注意,Android Studio 代码编辑器将字符串着色为绿色,以提供一些对比。

代码有什么作用?

此代码允许我们写入 Android 日志,并且当我们将日志设置为调试级别时,Android 日志将显示此代码。这就是该函数名为 d() 的原因。

如果我们想输出警告,我们会调用名为 w() 的函数,并传入两个字符串。

我们还可以调用 e() 函数来指示错误。

如果您想进一步研究函数,可以通过打开一个新行,在我们键入第一行代码的地方输入来让 Android Studio 帮助您。

Log.(即 Log 后面跟着一个句点)。完成此操作后,内置的 Android Studio 帮助将提供 Log 类函数和属性名称的建议。

我们的函数调用

在我们的函数调用中,我们创建一个名为“test”的过滤器,并写入一条日志条目行,内容为“用户点击了设置菜单项。”

过滤器尚未使用的

目前,过滤器名称尚未使用。我们稍后会使用更多,因为它们非常有用,可以过滤掉其他消息。

studio smart code help

您可以看到有如此多的建议,甚至还有一个滚动条供您查看所有建议。

构建并运行以查看输出

让我们继续构建并运行以查看输出。确保删除未完成的行(如果需要),然后运行应用程序(它将自动构建并部署到您正在运行的模拟器)。

密切关注 Android Monitor Logcat 窗口。

当您这样做并且应用程序最终启动时,您可能会注意到仍然有大量的输出。

我们需要进行一个小更改来过滤输出。

Android Monitor 窗口中有一个下拉列表,当前设置为“Verbose”。

由于我们通过调用 Log.d 来写入调试行,因此我们想将该值更改为“Debug”。

debug level

现在进行选择。

然后,确保抓住 Android Monitor 窗口最右侧的滚动条,一直滚动到窗口底部,这样当新输出写入时,您就能确保看到它。

切换到模拟器

切换到您的模拟器,它应该会显示您的测试应用程序。

单击右上角的垂直省略号菜单。

接下来,单击出现的“设置”菜单项,并密切关注 Android Monitor Logcat 窗口。

click settings menu

当您单击“设置”菜单项时。

您将在 Logcat 窗口中看到一行,如下所示(我已将其突出显示以强调要查看的行)。

debug log output

这就是我们在 Log.d 函数调用中放入的文本。

您还可以看到过滤器名称(test),就在消息文本之前。

当然,我们将在整本书中都使用日志记录,您也会在整个 Android 开发过程中使用它,因此我们将继续看到更多内容。现在,让我们继续介绍我承诺的其余较小项目。

运行窗口

当您单击 Android Studio 底部的“运行”按钮时,您可以看到有关正在运行的程序的更多信息。

run window

第一行显示目标设备。如果您连接了多个设备,这可能很重要。有时您可能有一个模拟器正在运行,并且连接了一个物理设备,因此了解 Studio 将应用程序部署到哪里很有帮助。

APK(Android 包套件)

第二行非常有趣,因为它就是 Android 用来部署您的应用程序的 APK 文件。提供了 Android Studio 构建应用程序时创建的文件的完整路径。

Installing APK: C:\Users\roger.deutsch\AndroidStudioProjects\Test\app\build\outputs\apk\app-debug.apk

另请注意,它将文件命名为通用的 app-debug.apk。我们稍后会更多地讨论这一点,因为它在将应用程序部署给真实用户时将变得很重要。

将文件移动到 Android 模拟器(设备)

第三行显示 APK 文件如何被重命名并移动以部署到模拟器。

Uploading file to: /data/local/tmp/us.raddev.test

您可以看到它重命名了文件,并将我们的应用程序放在一个名为 /data/local/tmp 的目录中。

接下来,Studio 运行一个命令将 APK 安装到模拟器上。

DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/us.raddev.test"

最后,您可以看到应用程序是如何启动的,以及 Studio 触发的用于执行此操作的命令。

Launching application: us.raddev.test/us.raddev.test.MainActivity.

DEVICE SHELL COMMAND: am start  -n "us.raddev.test/us.raddev.test.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER

另外有趣的是,您自己可以从命令行运行这些命令来手动完成这项工作。我们稍后会看到这是如何工作的,但了解 Android Studio 在您不知情的情况下做了什么很有用。了解这些事情将使您在 Android 开发方面脱颖而出。

让我们结束本章,以便(下一章)我们可以开始编写我们的第一个应用程序。

但是,我仍然需要介绍消息窗口,因为它在出现问题时很重要。

首先,请单击 Android Studio 底部的“消息”按钮。

gradle build

您可以看到顶部现在标记为:消息:Gradle 构建。

现在,返回 MainActivity.java,在我们之前处理过的 if 语句中键入一个字母。我试图在构建和运行时产生一个错误。

它看起来会像这样。

red k bad code

看到红色的 k 了吗?

Android Studio 已经知道这是一个问题,并试图警告我。但是,我仍然要运行。我是一个固执的程序员。

再次单击“运行”按钮以开始构建。

消息的自动折叠

完成此操作后,Studio 会自动折叠“消息”窗口,因此请确保再次单击“消息”按钮,以便您可以看到在那里输出的内容。

构建完成后(失败),您将看到类似如下的画面。

build error

它正在警告我们 MainActivity.java 中有一个错误。

目前,它只认为我们缺少一个行尾的分号。

最后一条错误行表明我们可以“查看编译器错误输出以获取详细信息”。

要做到这一点,您需要打开主菜单,文件…设置…

build settings 1

选择该选项后,将打开一个大窗口。

build settings 2

您可以向上移动到“构建、执行、部署”项,并通过单击向下箭头将其展开。

接下来,选择“编译器”项,您可以添加两个字符串值,这些值将在应用程序构建时提供给构建系统(Gradle)。

这两个字符串是。

--stracktrace --info

这些选项告诉构建系统提供更多输出信息。您也可以添加 --debug,但这会产生大量输出,并使应用程序构建速度非常慢。

单击“[确定]”按钮以保存您的设置。

info and debug settings

继续再次构建,您将在“消息”窗口中看到更多输出。

构建缓慢?

请记住,如果任何时候您觉得构建速度很慢,您将需要修改“编译器命令行选项”并删除我们添加的这两个字符串。它们会产生大量输出。

gradle build with error

进行此更改仍然对我们的错误没有太大帮助。这就是为什么开发人员必须非常仔细地查看我们收到的消息,并且非常熟悉我们代码中的有效语法。

删除错误的代码

在继续之前,请确保删除有问题字符并再次成功构建。

在结束本章之前,让我们再看一个工具,ADB(Android 调试桥)。

您可以在 Android Studio 的“工具”菜单中启用它。

enable adb integration

完成此操作后,您可以运行代码的调试版本。

转到“运行”菜单并选择“调试应用”选项。

start debug

完成此操作后,将构建一个特殊的调试版本应用程序并将其部署到您的模拟器。

当应用程序启动时,将在 Android Studio 底部出现一个新窗口。

debug output 1

它会告知您它已连接到您的模拟器并已准备就绪。

切换到您的模拟器,您应该会看到您的应用程序正常运行。单击应用程序中提供的两个不同的操作项。此时您不会看到任何区别。

设置断点

切换回 Android Studio,然后单击我们一直在检查的 if 语句的左侧。

如果您在编辑器旁边的浅盘中这样做,一个红点将会出现。那是一个断点。

set breakpoint

现在,当您运行击中该行的代码时,执行将在该位置中断,您将能够控制执行。

转到“运行”菜单并选择“调试应用”。

run debug 2

应用程序将以调试模式启动。

返回到您在模拟器中运行的应用程序,再次单击省略号菜单,然后单击“设置”菜单项。完成此操作后,Android Studio 将再次跳转到顶部窗口,代码将停止并以蓝色突出显示它停止的行。

breakpoint is hit

您现在可以看到断点上方有一个小勾。执行已在该行停止。

按 F8 键,代码将前进一行,进入第一个语句。

查看变量值

您还可以用光标悬停在变量上,以了解它们当前的值。尝试使用 id 值,即使它对我们来说还没有意义——我们将在后面的章节中学习。

view variable values

您可以看到 id 等于 2131492991。

变量监视窗口

您还可以在 Android Studio 底部看到变量的值。

variable watch window

同样,您可以看到 id 变量的值。

您也可以在此窗口中检查对象。例如,我们命名为 MainActivity 的 Activity 对象是列表中显示的第一个项目。单击其旁边的向下箭头将其展开,您可以看到它所有的成员变量以及更多内容。

expand variables

此时我们不知道这一切意味着什么,但了解如何在运行时检查项很重要。我们通常需要知道变量的值来调试我们的代码,这就是我们可以做到这一点的方式。

停止调试器

请继续停止调试,以便我们结束本章。

再次转到“运行”菜单并单击“停止”菜单项。

stop debugging

完成此操作后,调试连接将停止。

但是,您的应用程序仍将在模拟器中运行。

警告和崩溃

在调试和运行应用程序的正常副本之间切换时,系统经常会崩溃。如果发生这种情况,应用程序将变得无响应,然后您可能会再次看到模拟器中的启动屏幕。您只需要等待操作系统(操作系统)重新启动。

章节总结

本章为您打下了坚实的基础,使您能够成为一名专业的 Android 应用开发者。

您构建了一个基于模板的应用程序。这可能感觉不那么重要,但您已经走了更远,因为您已经征服了 Android 开发中最困难的障碍之一:让模拟器运行起来。

我们不仅让您的应用程序运行并部署到模拟器,还成功修改了一小部分代码,并通过日志记录和调试学习了各种了解正在发生情况的方法。

这些知识点将在您的 Android 开发生涯中为您服务,并随着时间的推移变得更加扎实。

构建真实的应用:第 4 章

但是,这些信息在您构建一个真正的应用程序之前都没有意义。

这就是为什么在第 4 章中我们将

  1. 构建一个完整的应用程序,该应用程序将允许您在设备上编写和保存笔记。

  2. 在模拟器上运行它

  3. 向您展示如何侧载应用程序到真实设备——侧载允许您将应用程序部署到设备,而无需部署到 Google Play 商店。

在构建此应用程序时,我们将

  1. 使用 XML 设计用户界面(UI)并了解布局。

  2. 编写 Java 代码来保存文件、显示笔记列表等。

  3. 了解应用程序清单(AndroidManifest.xml)和应用程序权限。

  4. 了解应用程序的结构。

现在,让我们去编写一些真正的代码!

代码下载

我提供了一个名为 Test 的 Android Studio 项目的 zip 文件。您应该能够将其放入一个文件夹,解压缩,并使用 Android Studio 1.5.1 打开它,不会有问题。

历史

文章首次发布:2016-02-11

© . All rights reserved.