要让一个集成开发环境被认为是真正必要的,它必须做的不仅仅是提供基础。特别是,它必须对来自各种背景、使用各种语言和哲学的开发人员开放。例如,许多开发人员更喜欢采用面向对象的方法,而其他人更喜欢基于功能的哲学,许多潜在的项目将更容易适应这些范例中的一个或另一个。
Android Studio 3 为 C++ 和 Kotlin 都提供了完整的语言支持,让开发人员有机会根据手头项目的需要专注于速度或可编程性。
除了提供这种语言支持,Android Studio 还为各种外形的应用开发提供了便利。读者将已经熟悉安卓穿戴和安卓自动,最近集成开发环境已经包括了对安卓事物的支持。
在本章中,我们将了解这些语言支持系统以及构成物联网 ( 物联网)的令人兴奋的新外形。
在本章中,您将学习以下内容:
- 包括 Kotlin 语言支持
- 将 Kotlin 与 Java 集成
- 应用 Kotlin 扩展
- 设置本机组件
- 在项目中包含 C/C++ 代码
- 创建一个安卓事物项目
自从移动应用出现以来,软件开发经历了不止一次革命,安卓框架对这些变化并不陌生。许多开发人员更喜欢 Java,因为它相对容易使用,但是总会有一些时候我们想要 C++ 的原始速度,并且 Java 比移动设备早了几十年。如果有一种像 Java 这样的高级语言,在设计时很大程度上考虑了移动开发,那不是很好吗?
幸运的是,俄罗斯的一个喷气大脑团队创建了 Kotlin,它与 Java 一起工作,甚至在 Java 虚拟机上运行,以创建一种更适合安卓开发者需求的语言。它也是 100%可与 Java 互操作的,因此您可以在同一个项目中使用 Java 和 Kotlin 文件,并且所有内容仍然可以编译。您还可以继续将所有现有的 Java 框架和库与 Kotlin 一起使用。
Kotlin 作为一个插件提供给开发者已经有一段时间了,但是从 Android Studio 3.0 开始,Kotlin 现在已经完全集成到 IDE 中,并且作为一种开发语言得到了谷歌的官方支持。用 Kotlin 编写的工作示例和向导模板都包含在 IDE 中。
Including Kotlin support in the project setup wizard
学习一门新的编程语言很少会很有趣,科特林也不例外。使用它的困难之处在于,我们不必在一次跳跃中从一种语言跳到另一种语言,我们可以在选择时逐渐引入柯特林。
我们中的许多人已经使用 Java 很长时间了,并且看不到改变的真正原因。毕竟,Java 工作得非常好,多年的经验可以带来一些非常快速的工作实践。除此之外,互联网上充斥着高质量的开源代码库,这使得研究和学习新技能对 Java 编码者来说非常有吸引力。
在安卓开发中,学习和使用 Kotlin 从来都不是严格必要的,但是为什么这么多开发人员认为它代表了安卓应用开发的未来,这当然值得一看。
除了谷歌自己的代言之外,开发者有很多充分的理由考虑 Kotlin。原因之一可能是空指针异常的结束,编译器通过不允许将空值赋给任何对象引用来实现这一点。该语言的其他令人兴奋的特性包括支持合成而不是继承、智能转换以及创建数据类的能力。
要想知道这些创新能带来多大的优势,最好的方法就是看看这些。
正如上一节中的屏幕截图所示,可以直接从模板向导将 Kotlin 包含到项目中,但是我们也可以从模块的“新建”菜单中以添加任何其他类或文件的相同方式从已经打开的项目中包含 Kotlin 类。
添加新的 Kotlin 文件/类
以这种方式包含一个 Kotlin 类将会提示 IDE 用 Gradle 自动配置 Kotlin。它通过修改顶层build.gradle
文件来实现,如下所示:
buildscript {
ext.kotlin_version = '1.1.3-2'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-alpha9'
classpath "org.jetbrains.kotlin:kotlin-gradle-
plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Using Kotlin in an Android application will incur almost no extra overheads; moreover, once it is compiled, Kotlin code will run no more slowly than its Java equivalent, nor will it occupy any more memory.
像这样包含一个新的 Kotlin 类或文件是非常有用的,但是从模板创建一个 Kotlin 活动或片段呢?作为 Java 开发人员,我们习惯于使用简单的配置对话框来设置它们。幸运的是,Kotlin 活动没有什么不同,配置活动对话框允许我们适当地选择我们的源语言。
Selecting the source language
和以前一样,非常值得看一看生成的代码,看看与传统的 Java 活动/片段模板相比,它有多简洁和可读:
class ItemDetailFragment : Fragment() {
private var mItem: DummyContent.DummyItem? = null
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (getArguments().containsKey(ARG_ITEM_ID)) {
mItem = DummyContent.ITEM_MAP.
get(getArguments().getString(ARG_ITEM_ID))
val activity = this.getActivity()
val appBarLayout = activity.findViewById<View>
(R.id.toolbar_layout) as CollapsingToolbarLayout
if (appBarLayout != null) {
appBarLayout!!.setTitle(mItem!!.content)
}
}
}
public override fun onCreateView(inflater: LayoutInflater?,
container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater!!.inflate(R.layout.item_detail,
container, false)
if (mItem != null) {
(rootView.findViewById(R.id.item_detail) as
TextView).setText(mItem!!.details)
}
return rootView
}
companion object {
val ARG_ITEM_ID = "item_id"
}
}
This code can be made even more concise by removing calls to findViewById()
using the Kotlin extension, as explained in the following section.
虽然这种混合和匹配语言的方式对于调整和更新现有的应用非常有用,但是当在整个项目中应用时,Kotlin 真的是独一无二的。也许它最吸引人的特性是它的简洁性,这可以通过从头开始两个项目并比较它们的代码很容易看出。以下是导航抽屉模板代码中的onCreate()
列表:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton)
findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout)
findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView)
findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
以下是它的科特林等价物:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
val toggle = ActionBarDrawerToggle(
this, drawer_layout, toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close)
drawer_layout.addDrawerListener(toggle)
toggle.syncState()
nav_view.setNavigationItemSelectedListener(this)
}
这种语法更加简单是所有开发人员都欢迎的,这绝不是使用 Kotlin 的唯一优势。
正如任何强大的编程范例所期望的那样,它可以通过一个插件进行扩展,以进一步提高其实用性。
每个安卓开发者都会记不清自己输入了多少次findViewById()
。他们也会意识到这种静态类型有多容易出错。
默认情况下,当项目设置期间启用 Kotlin 支持时,包括 Kotlin 扩展,如模块级build.gradle
文件中所示:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
使用扩展还需要将其导入适当的类,通常是活动或片段。读者很可能已经通过系统设置设置了自动导入。接下来需要做的就是以通常的方式使用 XML 创建一个视图,如下所示:
<TextView
android:id="@+id/text_view"
. . . />
现在,在该小部件上设置值所需的全部工作大致如下:
text_view.setText("Some text")
无论您是否将导入设置为自动包含,了解这些导入采用的格式都很有用。考虑以下示例:
import kotlinx.android.synthetic.main.some_layout.*
import kotlinx.android.synthetic.main.some_layout.text_view
- 在这种情况下,
some_layout.xml
将是包含我们的text_view
的文件。 - 如果您有使用
<include>
从活动 XML 中引用内容 XML 的健康习惯,那么您将需要两个导入,大致如下:
import kotlinx.android.synthetic.main.some_activity.*
import kotlinx.android.synthetic.main.some_content.*
这不仅仅是我们可以在这里设置的文本;我们喜欢的任何函数都可以以同样的方式调用,而不必通过搜索视图的 ID 来引用它。
希望到目前为止,读者会确信在 Kotlin 中编码的优势,但是在我们继续之前,Kotlin 的一个特性隐藏在主Code
菜单的底部。这是将 Java 文件转换为 Kotlin 文件。这确实做到了它所说的,甚至可以发现和解决大多数转换问题,使它成为一个伟大的省时和有趣的方式来学习两种语言之间的差异。
Ctrl
Alt
Shift
K
虽然 Kotlin 可能是 Android Studio 的最新成员之一,但它并不是我们选择替代语言的唯一选择,C++ 提供的速度和低级内存访问使其成为许多开发人员的首选。在下一节中,我们将看到这种强大的语言是如何被 IDE 轻松支持的。
正如我们到目前为止所看到的,所有编程语言都有优点和缺点。C 和 C++ 可能需要更多一点的训练才能掌握,但这往往被语言提供给我们的低级控制所弥补。
说到 Android Studio,需要一个稍微不同的开发工具子集。这包括原生开发套件(【NDK】)和 Java 原生接口 ( JNI )以及其他调试和构建方式。与 Android Studio 中的大多数流程一样,设置这些工具非常简单。
如前一节所述,本地编程需要一套与我们目前使用的工具略有不同的工具。正如人们所料,我们需要的一切都可以在软件开发工具包管理器中找到。
您很可能需要安装下面截图中突出显示的组件;您至少需要 NDK、芝加哥商品交易所和 LLDB:
-
CMake:这是一个多平台测试和构建工具,与 Gradle 一起工作。有关全面的文档,请访问cmake.org。
-
LLDB:这是一个强大的开源调试工具,专门设计用于多线程应用。它的详细用法超出了本书的范围,但感兴趣的用户可以访问lldb.llvm.org。
安装了正确的软件后,本机编码与我们的 Java/Kotlin 类和文件一起被非常顺利地整合到 Android Studio 项目中。与 Kotlin 支持一样,只需要在设置过程中选中适当的框。
选择此选项后,您将有机会配置 C++ 支持,如下所示:
如果您正在使用 CMake,选择工具链默认为标准是您的最佳选择,在大多数情况下,异常支持和运行时类型信息支持可能都值得检查。通过检查模块级build.gradle
文件,可以最清楚地看到它们的包含:
DefaultConfig { . . . externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" } } }
通常情况下,在引擎盖下获得良好外观而不必让我们的手太脏的最好方法之一是使用现成的安卓样本。这些并不多,但都很好,在github.com/googlesamples/android-ndk的 GitHub 上有一个不断增长的社区项目。
所有这些示例显示的是添加了哪些代码结构以及在哪里添加的;就像我们之前遇到的项目结构一样,实际的文件结构不会通过项目文件资源管理器来反映,该资源管理器根据文件的类型而不是位置来组织文件。
明显的增加是包含源代码的main/cpp
目录,以及 CMake 使用的外部构建文件。
C++ 不是每个人都喜欢的,更详细的内容超出了本书的范围。从 Android Studio 的角度来看,那些想进一步利用 NDK 的人会发现,CMake 与 Gradle 无缝集成的方式使得测试和构建调用本地库的应用成为一种非常节省时间的方式。
对于用户、制造商和开发者来说,安卓操作系统的一大优点是它可以运行的设备种类繁多。起初,这种现象出现在我们的手表、电视机和汽车上。最近,物联网的发展导致在任何数量的电子设备中需要复杂的操作系统。这导致谷歌开发了安卓系统。
随着水壶和洗衣机等智能家电的推出,物联网已经对消费者产生了影响。除此之外,许多市政当局还利用这项技术来管理交通和公用设施使用等事务。
事实上,任何设备都可以构成一个东西。一个设备甚至不需要屏幕或任何按钮,只要它有一个 IP 地址,并且可以与其他设备通信。一个人甚至可以得到一个带有 IP 地址的牙刷,尽管遗憾的是我没有意识到它的优点。
从开发人员的角度来看,物联网令人难以置信地兴奋,在软件开发工具包中包含 API 开辟了几乎无限的新世界。自然,这些 API 已经被整齐地缝进了 Android Studio,使得 Android Thing 的开发变得像 Android 应用创建的任何其他分支一样简单和有趣。
Android Things 和其他形式的 Android 开发之间最显著的区别可能就是硬件。人们很容易认为需要嵌入式电路方面的专业知识,尽管这方面的一点知识很有用,但这绝不是必要的,因为谷歌与英特尔、恩智浦和树莓 Pi 等片上系统 ( SoC )制造商合作,生产开发套件,使我们能够快速生产和测试原型。
和往常一样,Android Studio 被设计成以尽可能多的方式帮助我们,当然,还有支持库、系统映像和越来越多的工作样本来帮助我们前进。不幸的是,没有办法简单地模拟 Android Things,虽然有些功能可以在一些移动 avd 上模拟,但需要某种形式的物理开发工具包。
只需一点专业知识和一个烙铁,就完全有可能创建自己的开发板,但英特尔爱迪生和树莓皮等板的低价格,以及安卓的免费系统映像,使这成为一个耗时的过程。如果您有一个想法,并且想要快速测试并将其开发成一个已完成的项目,那么您可以使用一个经过批准的开发工具包,例如树莓 Pi 3,如下图所示:
在developer.android.com/things/hardware/developer-kits.html可以找到关于哪些单板机可用于事物的信息。每个主板都有外设套件,这些都可以在同一页找到。
一旦你选择了一个套件,系统图像可以在developer.android.com/things/preview/download.html找到,也可以在你位于partner.android.com/things/console/的东西开发者控制台上找到。
一旦您有了工具包和外围设备,您就可以开发您的第一个东西应用了,其基础将在下一节中概述。
Android Things 使用的 API 没有包含在标准的 SDK 中,因此需要一个支持库。至少,您需要以下依赖性:
dependencies {
...
provided 'com.google.android.things:androidthings:0.5-devpreview'
}
除了清单中的这个条目:
<application ...>
<uses-library android:name="com.google.android.things"/>
...
</application>
大多数东西项目将需要比这更多的东西,这取决于使用哪些外围设备以及项目是否将使用 Firebase 进行测试。查看提供的示例是了解需要哪些依赖项的好方法;以下片段摘自“东西门铃”示例:
dependencies { provided 'com.google.android.things:androidthings:0.4-devpreview'
compile 'com.google.firebase:firebase-core:9.4.0'
compile 'com.google.firebase:firebase-database:9.4.0'
compile 'com.google.android.things.contrib:driver-button:0.3'
compile 'com.google.apis: google-api-services-vision:v1-rev22-1.22.0'
compile 'com.google.api-client: google-api-client-android:1.22.0' exclude module: 'httpclient'
compile 'com.google.http-client: google-http-client-gson:1.22.0' exclude module: 'httpclient' }
设置安卓事物项目的下一个主要区别可以在清单文件中看到,在下面的代码中添加高亮显示的<intent-filter>
将使项目在测试和调试时能够成功运行:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidthings.doorbell">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.things.permission .MANAGE_INPUT_DRIVERS" />
<application android:allowBackup="true" android:icon="@android:drawable/sym_def_app_icon" android:label="@string/app_name">
<uses-library android:name="com.google.android.things" />
<activity android:name=".DoorbellActivity">
<intent-filter>
<action android: name="android.intent.action.MAIN" />
<category android: name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android: name="android.intent.action.MAIN" />
<category android: name="android.intent.category.IOT_LAUNCHER" />
<category android: name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
在建立一个安卓事物项目时,这些确实是唯一的区别。其他区别将更多地基于使用哪些外围设备和传感器。通常情况下,进一步探索事物的最佳方式之一是通过提供的示例。可用的样本不多,但数量在增长,它们都是为了帮助我们学习而编写的。
为安卓系统开发东西对许多开发人员来说似乎令人生畏,但是 Android Studio 通过其系统映像、支持库和代码示例来促进这一点的方式意味着任何有伟大想法的开发人员都可以廉价、快速地开发、测试和生产这样的产品。
在这一章中,我们探索了 Android Studio 可以帮助开发人员的一些更奇特的方法。谷歌在数字世界的巨大影响力提供了柯特林语言等替代技术,并鼓励制造商开发吸引安卓开发者的技术,让任何有技能和想法的人都能获得尖端技术。
Android Studio 并不是唯一一个提供用不同语言或不同外形编码的机会,但 Android Studio 确实让开发人员学习新技能变得更简单、更容易。
在下一章中,我们将看一看最后的开发阶段之一;测试。这将给我们一个很好的机会来探索 Android Studio 最创新和有用的工具之一:设备监视器和分析器。