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

时间:2024-11-30 13:35:19

文章指出 本文包含了我即将出版的新书《启动Android应用程序》中的第三章。 在我完成这本书之后(目标发行日期:2016年11月03日),我将在亚马逊上以Kindle的形式发行整本书,售价仅为2.99美元。 在那之后的几天内,我还会以印刷的形式发行这本书(定价会因印刷成本的不同而有所变化,但估计会在8.99 - 9.99美元之间)。 阅读绪论和介绍;第一章,请查看我在CodeProject上的文章: http://www.codeproject.com/articles/1077609/launing-your-andro-app-intro-getting-startedpart(在新选项卡中加载) 要阅读第二章,请访问:http://www.codeproject.com/articles/1077807/launch - your-andro-app-generate-your-firstprojec (在一个新标签页加载) 如果你快速向下滚动浏览这篇文章,你会发现它似乎很长。这是因为它包含了37张截屏图片。, 演练的经验 我写这本书的目的是为了创造一个更好的信息产品。我希望这种方法能让你像站在Android开发者的肩膀上一样阅读和体验开发。, 我相信这将是一个有效的方式来报道Android开发这一紧张的主题。 尝试创建一种混合格式 这有点像一种视频教程和一本书的混合格式。 我试图用这种格式解决什么问题? 这是为了解决阅读一本书时需要输入代码才能看到结果的挑战。相反,在这里您将能够专注于阅读和体验代码,就像您第一次站在Android开发人员的肩膀上看代码一样。然后,在读完这一章之后,只需简单地回顾一下书中的内容,就可以很容易地自己编写代码了。 是否有附加值? 我相信,即使您是一名高级开发人员,您也会发现这个演练相当有趣,因为您可以简单地浏览本文(和本书),作为您坐下来使用Android Studio工作时将看到的内容的预习。 继续我们的测试应用程序:在模拟器中运行 现在我们继续第二章的内容。如果你还没有读过那一章,请现在读。 在Android Studio的主菜单顶部,我们想要点击并展开Run菜单 当它扩展时,我们想要选择运行应用程序。 当您点击该菜单项时,将出现一个对话框,看起来如下: 对话框的底部是对我们很重要的部分。可以看到,Android Studio已经为我们自动选择了Launch emulator单选按钮,因为它知道还没有模拟器在运行。 您还可以看到,它建议我们运行的Android虚拟设备(AVD)名为Nexus4。 现在按[OK]按钮。 ############################################################################## ############################################################################## 注意:当我尝试启动虚拟设备时,什么也没有发生,我经历了许多步骤来尝试弄清楚它。我将添加所有我最终尝试的东西作为补充,以防您有问题。, 我已经详细描述了*的问题: http://*.com/questions/35272258/avd-manager-on androidstudio1-5-1和installto -a-custom- location-emulat-wo (在新选项卡中打开) 否则,本章将继续,如果你没有问题启动模拟器。 ############################################################################## ############################################################################## 最后*,您应该看到如下内容: *根据你的硬件,Android虚拟设备(模拟器)可能需要很长时间才能最终启动。 在这一点上,应用程序看起来非常接近我们在Android Studio中看到的预览。 但是,由于某些原因,预览没有像模拟器版本那样在标题栏中显示单词Test。 点击模拟器到触摸屏 此外,你可以用鼠标点击界面,应用程序就会像你在真实设备上运行并触摸屏幕一样做出反应。 的免费赠品 您可以在应用程序中免费获得一些内容,这仅仅是因为我们选择了Android Studio提供的布局模板。 首先,点击垂直省略号(app右上角的菜单),你会看到它显示一个菜单项:设置。 但是,单击出现的Settings菜单不会做任何事情,因为我们还没有为此编写任何代码。 现在,让我们继续点击带有信封的圆形粉色按钮。点击它不会做太多,但是它会激活“snackbar”。 现在试一试。 UI将会调整,一个小消息将会应用耳朵。 在我们开始深入研究代码之前,让我们确保我们知道如何很好地使用我们的工具。从长远来看,这样做会有回报的。 我们会看下面的项目列表来完成这一章,然后下一章我们会开始写一些代码并做一些事情来改变这个应用。 当然,如果你有信心跳过这些内容,因为你已经理解了它们,那么就放心这么做吧。 我们来看看: Android监视器与Logcat 在我们的应用程序中添加代码来写行到logcat (输出)窗口运行 消息窗口:当应用程序不能正确构建时,请仔细查看输出 ADB (Android调试桥)命令行 在我们完成这些项目后,你会非常熟悉Android Studio,它将更容易移动的工作室,更容易理解我们正在工作的代码。 关闭一个正在运行的Android应用程序 我们要做的第一件事是关闭刚刚在模拟器上运行的应用。 有一个简单的方法。回到模拟器,然后点击“后退”按钮。 下图左侧所示的弧形箭头按钮。 稍后我们会学到更多,但当你在安卓应用中触摸那个按钮时,它会暂停并关闭应用。 现在在模拟器上执行这个操作。 该应用程序应该会消失,你可能会再次看到Android的“桌面”。 现在,切换回Android Studio,确保你选择了窗口底部的Android监视器按钮。这将导致Android监视器显示,以便我们可以查看它。 如果你将缓慢移动到窗口的顶部边界,你的光标将改变为双上下箭头,这样你可以调整窗口的大小,如果你喜欢看更多。 注意,你可以看出这个窗口有焦点,因为它的标题栏写着“Android Monitor”。还要注意,左边突出显示的选项卡显示的是logcat。 现在,这个窗口向我们展示了Android运行时不断被写入的日志。 海量的信息 有时的信息写入这个窗口可以是压倒性的,因为每一个事件发生在系统被写在这里,但我们将学习如何过滤下来所以我们只能看到事件感兴趣,哪些是有助于我们在调试应用程序。 清除Android监视器 首先,让我们清除Android监视器。要做到这一点,只需右键单击您在监视器中看到文本的地方,就会出现一个上下文菜单。 选择清除所有菜单项,窗口中的所有文本将消失。 这将帮助我们看到当我们启动应用程序时编写的事件。 重新启动应用程序 让我们再次启动应用程序,但这一次,我们将查看这个窗口中发生的输出。 要做到这一点,点击Android Studio顶部,主菜单下方的绿色三角形箭头。 下图中是指向右边的绿色箭头: 一旦你点击它,你会看到设备选择器窗口。 即使您的仿真器仍在运行,该窗口也会每次出现。然而,你可以检查“用户相同的设备为未来启动”的选择,所以它将总是使用你的运行设备,所以它不会打扰你与这个窗口。别担心,如果发生了什么情况,仍然可以使用另一个菜单选项来切换它。 点击[OK]按钮允许应用程序开始。, 当你这样做的时候,请注意Android Monitor logcat窗口,因为在应用程序启动时,会有很多消息被写入那里。 我抄写了这篇文章,有4600多行。每页50行,如果打印出来的话就超过了92页。 下面是一些有趣的带有注释的输出行(标记为注释),粗体是我的重点: 隐藏,复制Code

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

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

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)

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

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

注意:这几行表示我们的应用程序的前一个版本已经从设备上删除并停止运行。 隐藏,复制Code

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) }

注意:在这里,我们的应用程序的新构建版本正在被部署到设备上。 隐藏,复制Code

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={}

注意:这里应用程序正在启动。 隐藏,复制Code

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

注意:最后,MainActivity将显示在屏幕上。 希望这能让你对日志有所了解,你能得到一些关于你的应用在做什么的信息,即使它还没有被绘制在屏幕上。 然而,届有太多的信息需要挖掘。这就是为什么您可以向应用程序添加一些代码并打开一个过滤器,以便只有您想看到的信息才会显示在logcat窗口中。 改变MainActivity.java 让我们继续对Java代码进行一些更改,以添加日志记录功能。 当用户单击Settings菜单项时,我们将创建应用程序日志。 回到Android Studio并在编辑器中打开MainActivity.java类。如果需要的话,双击project tree视图左侧的文件,该文件将在编辑器窗口的右侧为您打开。 向下滚动到MainActivity.java文件的底部,您将看到一个名为onOptionsSelected的函数。,它看起来像: 我们将在if语句中输入一些代码,就在左花括号之后。 该代码目前看起来是: 隐藏,复制Code

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

现在,让我们更改它(添加以下代码片段中显示的粗体行)。 隐藏,复制Code

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

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

当你到达d时,Android Studio会提供一些帮助。 它只是想让你知道有一个函数叫做Log。有两个函数重载(函数接受不同数量和类型的参数)。 我们将使用显示的第一个,但是您可以输入一个开括号(。 当你这样做的时候,Android Studio会自动输入闭括号并提供更多的帮助: 它告诉您,您正在寻找的函数存在于一个特定的包中(library - android.util.Log),您还没有包含对该包的引用。添加包只需按Alt和回车键组合。 当你这样做的时候,Android Studio会在mainactivity顶部添加如下一行代码。 隐藏,复制Code

import android.util.Log;

这将导致Java编译器在构建代码时包含该包。这就是圆木。d函数,由原Android开发人员编写,可用于调用。 然而,现在我们仍然需要将这两个字符串添加到日志中。函数或代码将无法编译。 继续,确保你的线条现在看起来完整。 隐藏,复制Code

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

如果它是正确的,它看起来就像这样: 注意,Android Studio代码编辑器将字符串着色为绿色,以形成对比。 代码的作用是什么? 这段代码允许我们编写Android日志,当我们将日志设置为调试级别时,Android日志将显示这段代码。这就是该函数被命名为d()的原因。 如果我们想输出一个警告,我们应该用两个字符串调用名为w()的函数。 我们还可以调用e()函数来指示错误。 如果你想研究更多的功能,你可以让Android Studio帮助你打开另一行,我们键入第一行代码,并输入: 日志。(这是Log,后面是句号)当你这样做时,在Android Studio中构建的帮助提供日志类的函数和属性名称的建议。 我们的函数调用 在我们的函数调用中,我们创建了一个名为“test”的过滤器,并且我们正在编写一个日志条目行,它将说:“用户单击了设置菜单项。” 过滤器尚未使用 目前,还没有使用过滤器名称。我们以后会更多地使用它们,因为它们非常有用,所以我们可以过滤掉其他的信息。 你可以看到有这么多的建议,甚至提供了一个滚动条,以便你可以看到他们所有。 构建并运行以查看输出 让我们继续构建并运行以查看输出。如果需要,请确保删除未完成的行,然后继续运行应用程序(它将自动构建并部署到正在运行的仿真器)。 关注Android监控Logcat窗口。 当你这么做的时候,应用程序终于启动了,你可能会注意到仍然有大量的输出。 我们需要做一个小小的改变来过滤输出。 在Android监视器窗口中,当前有一个拖放列表设置为Verbose。, 我们希望将该值更改为Debug,因为我们通过调用Log.d来编写调试行。 现在就做出选择。 然后,确保你抓取了Android Monitor窗口最右边的滚动条,并一直滚动到窗口的底部,这样当写入新的输出时,你一定能看到它。 切换到模拟器 切换到你的模拟器,它应该显示你的测试应用程序。 单击右上角的垂直省略号菜单。 接下来,点击出现的设置菜单项,并关注Android Monitor Logcat窗口。 当您单击该设置菜单项时。 你会在你的Logcat窗口中看到如下所示的一条线(我突出了它来强调要看的那一条): 这是我们放入Log的文本。d函数调用。 您还可以在消息文本之前看到过滤器名称(test)。 当然,我们会用日志记录整个书和哟你会在你的Android开发过程中使用它,所以我们会继续看到更多这样的东西。现在,让我们继续讨论我答应过的其他一些小问题。 运行窗口 当你点击Android Studio底部的Run按钮时,你可以看到更多关于你的运行程序的信息。 第一行给出了目标设备。如果你有一个以上的设备,这可能是重要的。有时,你可能有一个模拟器运行和一个物理设备附加,所以它有助于了解Studio部署应用程序的位置。 APK (Android软件包) 第二行非常有趣,因为它是android用来部署应用程序的APK文件。提供了android Studio创建应用程序时创建的文件的完整路径。 隐藏,复制Code

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

还要注意,它将该文件命名为app-debug.apk。稍后我们会详细讨论这个问题,因为它在向实际用户部署应用时非常重要。 将文件移动到Android模拟器(设备) 第三行显示了APK文件的重命名和移动位置,以便部署到模拟器。 隐藏,复制Code

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

你可以看到它重命名了文件,并将我们的应用程序放在一个名为/data/local/tmp的目录中。 接下来,Studio运行一个命令将APK安装到模拟器上。 隐藏,复制Code

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

最后,你可以看到应用程序在哪里启动,以及Studio触发的命令: 隐藏,复制Code

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开发者。 让我们结束这一章,以便(下一章)开始编写我们的第一个应用程序。 但是,我仍然需要覆盖Messages窗口,因为它在出现错误时非常重要。 首先,点击Android Studio底部的Messages按钮。 你可以看到顶部现在被标记为:Messages: Gradle build。 现在,回到MainActivity.java,在我们之前处理的if语句中输入一个字母。当我们构建和运行时,我试图引起一个错误。 它看起来像: 看到红色字母k了吗? Android Studio已经知道这是一个问题,并试图警告我。然而,无论如何我都要跑步。我是一个顽固的程序员。 再次单击Run按钮以启动构建。, Auto-Collapse的消息 当您这样做时,Studio会自动折叠消息窗口,所以请确保您再次单击消息按钮,以便您可以看到那里得到的输出。 当构建完成(失败)时,您将看到如下内容: 它警告我们在MainActivity.java中有一个错误。 现在,它只是认为我们漏掉了一个行结束分号。 最后一行错误指示我们可以“查看编译器错误输出以获得详细信息”。 为此,你需要打开主菜单File…Settings… 当您选择此选项时,将打开一个大窗口。 您可以向上移动到构建、执行和部署项,并通过单击向下箭头展开它。 接下来,选择编译器项目,你可以添加两个字符串值,当应用程序构建时,这些值将被提供给构建系统(Gradle)。, 这两个字符串是: 隐藏,复制Code

--stracktrace --info

这些选项告诉构建系统提供更多的输出信息。您还可以添加——debug,但这会创建大量输出,使应用程序构建非常缓慢。 点击[确定]按钮保存您的设置。 继续并再次构建,您将在Messages窗口中看到更多的输出。 缓慢的建立? 请记住,如果在任何时候您觉得构建速度很慢,您将需要更改编译器命令行选项,并删除我们添加的两个字符串。他们产生了大量的产出。 更改仍然不能对我们的错误提供很多帮助。这就是为什么开发人员必须非常仔细地查看我们确实收到的消息,并且非常熟悉代码中的有效语法。 删除不良代码 在继续之前,确保您删除了问题字符并再次进行了良好的构建。 在结束本章之前,让我们看看另外一个工具,ADB (Android调试桥)。 你可以在Android Studio的工具菜单中启用它。 这样做之后,就可以运行代码的调试版本了。 转到Run菜单并选择Debug应用程序选项。 当您这样做时,您的应用程序的一个特殊的调试版本将被构建并部署到仿真器中。 当应用程序启动时,Android Studio的底部会出现一个新窗口。 它让您知道它已连接到模拟器并准备就绪。 移动到模拟器,您应该会看到您的应用程序正常运行。单击应用程序中可用的两个不同的动作项。你将看不到在这一点上有什么不同。 设置一个断点 回到Android Studio,点击我们正在检查的if语句的左边。 如果您在编辑器旁边的小托盘中这样做,那么一个红点将会出现。那是一个断点。 现在,当你运行那一行的代码时,执行会在这个位置中断,你就可以控制执行了。 转到Run菜单并选择Debug app。 应用程序将在调试模式下启动。 回到在模拟器中运行的应用程序,再次单击省略号菜单,然后单击设置菜单项。当你这样做的时候,Android Studio会跳转到顶部窗口,代码会停止并突出显示它停止的行蓝色。 现在您可以看到断点上方有一个小检查。处决已在那条线上停止。 按F8按钮,代码将前进一行,进入语句中的第一个语句 查看变量值 您还可以用光标在变量上浮动,以找出它们当前被设置为什么值。尝试使用id值来实现它,尽管它对我们还没有意义——我们将在后面的章节中了解它。 您可以看到id等于2131492991。 变量监视窗口 您还可以在Android Studio的底部看到变量的值。 同样,您可以看到id变量的值。 您还可以检查窗口中的对象。例如,我们命名为MainActivity的活动对象是列表中显示的第一项。单击它旁边的向下箭头展开它,你可以看到它的所有成员变量和更多。 此时,我们还不知道所有这些意味着什么,但了解如何在运行时检查项是很重要的。我们经常需要知道变量的值来调试代码,下面就是我们如何做到的。 停止调试器 继续并停止调试,这样我们就可以结束本章了。 再次转到运行菜单并单击停止菜单项。 这样做之后,调试连接将停止。 但是,你的应用程序仍然会在模拟器中运行。 警告和崩溃 通常情况下,在调试和运行应用程序的正常副本之间切换会导致在模拟器中运行的系统崩溃。如果发生这种情况,应用程序将变得没有响应,然后你可能会看到启动屏幕再次在模拟器。你只需要等待操作系统重新启动。 章总结 这一章为你作为一个专业的Android应用程序开发者建立了一个坚实的基础,为你带来了漫长的道路。 您构建了一个基于模板的应用程序。这可能感觉不怎么样,但你已经前进了很多,因为你已经征服了Android开发中最困难的障碍之一:让模拟器运行起来。 我们不仅让你的应用运行并部署到仿真器中,我们还成功地修改了一小段代码,并通过登录和调试学习了各种方法来了解发生了什么。 这些知识将会在你的Android开发生涯中很好地为你服务,因为它们会越来越牢固。 构建一个真正的应用程序:第4章 但在我们构建一个真正的应用程序之前,这些信息都不重要。, 这就是为什么在第四章我们会: 创建一个完整的应用程序,允许你在你的设备上写和保存笔记。 在模拟器上运行它 演示如何将应用程序sideloading允许你部署到一个设备,而不是部署到谷歌播放商店。 当建立这个应用程序,我们将: 使用XML设计用户界面(UI)并学习布局。 编写Java代码来保存文件,显示笔记列表等等 了解一点应用程序清单(AndroidManifest.xml)和应用程序权限 了解更多应用程序的结构。 现在,让我们来编写一些真正的代码! 代码下载 我提供了一个名为Test的Android Studio项目的压缩包。你应该能够把它放到一个文件夹中,解压缩并使用Android Studio 1.5.1毫无问题地打开它。 历史 文章首次发布:2016-02-11 本文转载于:http://www.diyabc.com/frontweb/news30784.html