2015 Google IO带来的新 Android 开发工具

2015 Google IO带来的新 Android 开发工具

每年我们都非常期待 Youtube 中Google IO上那些关于 Android 的精彩讲解。然而,观看这些视频太耗费时间了。因此我们做了撰写了总结性的文字,来介绍这次的 Google IO 带来了哪些新的 Android 开发工具。(对应的讲演视频

便于设计

image

Android Design Support Library 帮助我们遵循最新的最杰出的 material design 特性。这个库还附带了好几个 material design 组件诸如 navigation drawer, floating labels for editing text(这个简单来说就是edittext 在获得焦点后,hint 会有个上升动画变成一个放置在 edittext上方的 textview 作为 label),floating action buttons(Android L时代推出的产物,总算有了官方的低版本兼容支持)以及 支持Android 2.1及其以上版本的snackbar。

image

Android L 介绍了对 vector drawables 的支持。而通过 Android Studio 1.3+给 Android Gradle plugin 带来的新功能,我们可以让编译打包系统通过 开发者提供的SVG图 或者 vector drawables 生成不同 dpi 的光栅图。
最后,整个开发团队开始重写了所有的可视化设计编辑器。从而支持开发者所见即所得的编辑与设计而不是被 XML 文件搞的无比心烦。下面会有更详细的内容。

提升 Gradle 插件以及编译打包系统

image

Android Gradle plugin 有的时候给人一种靠不住的感觉,特别是它的依赖管理。处理测试依赖时一些极端情况带来的问题现在已经被修复。同样,可选依赖 Gradle 还没有做到真正的支持。然而在 Android Gradle plugin 上已经解决了这一问题。

开发者对 Android Gradle plugin 抱怨最多的就是它居高不下的打包消耗时间了。开发团队从多个层级入手追踪这个问题。

Jack , Java Android Compiler Kit 的缩写,可以将 Java 源码直接编译并转换为 Dex 文件。Jack 基于 Eclipse Java 编译器。缩减了打 Dex 之前把 Java 源码编译成 JVM 字节码的步骤。 额外的,Jack 还支持增量编译打包。

缩减 PNG 图片是另外一个考虑来缩减打包时间的步骤。开发团队提高了它的性能,将500张 PNG 图片和.9 图的缩减时间从 4秒 降低到了 400ms。

aapt, 打包应用的dex 和 资源文件的工具同样得到了提升。

另外一个影响打包时间的因素是 Gradle 本身的巨大开销。当 Gradle 开始它的打包任务时,它必须先创建描述模型比如 variant (flavor + build type),解决所有 variants 的依赖关系(即使你只有一个)以及执行开发者自定义的逻辑。开发团队和 Gradle Ware 紧密合作工作从而提高这些步骤的性能。以下是最后的结果:

image

这还没完。目前开发者团队正在为了一个新的 Android Gradle plugin 而工作, 它基于 Gradle Ware 正在研发的新API 。而这些新的 API 允许这些模型被 Gradle 直接管理,从而可以做诸如缓存,并发以及增量构建这些事。下面是尚未完成的新 Android Gradle plugin 的结果数据:

image

以上的数据并没有算上用上缓存的带来的提升,目前缓存的特性还没有提供出来。新插件有一个小瑕疵,因为它使用了全新的 DSL 所以无法做到完全的向后兼容。新插件的预览版会在几周内开放,最后的正式版会在今年晚一点的时候开放。

开发者团队还介绍了一个新的东西,叫做 Data Binding Library。这个库需要编译构建系统的支持,因为它会通过XML中特殊声明的一些代码去生成对应的 Java 代码。老版本和新版本的 Android Gradle plugin 都能支持它。下面会有更详细的内容。

最后,我们实现了对 NDK C以及C++完整的支持。这是基于Gradle native 代码的支持,所以只会在新版本中提供,它重写了Android Gradle plugin。NDK支持也带入到了Android Studio中,同时还打包了CLion(JetBrain旗下的C,C++ IDE), 并免费提供。下面会有更详细的内容。

测试有关

image

今年Android 测试最大的亮点便是最近公布的 Cloud Test Lab 。它可以帮助开发者使用 Google 测试云平台上的虚拟设备以及真机设备测试他们开发的应用。无论是虚拟设备还是真机设备,测试实验室(test lab)都支持机器爬虫遍历应用而不需要手动的去写测试用例。就当作是有一只猴子在各种设备上玩你的应用吧=w=。当然,你还是可以自己写测试用例的。

到目前为止,单元测试主要还是用于跑在 JVM 上老的Junit 测试。虽然那样可以提高测试的迭代速度,但是它并不能测试到 Android 中一些特定的代码,若没有类似的Android 库的支持的话(Roboelectric就是为此而生的)。

为了支持在虚拟机或者设备上的集成测试,开发团队增加了对外部测试工程的支持。他们就在你的应用程序工程边上,引用它以及它的依赖然后进行集成测试。

模拟器

image

并没有大的进展。开发团队主要工作集中在稳定性,正确性以及配置上。 Android Studio 会下载安装 HAXM(Intel 为 Android x86平台提供的硬件加速执行管理器) 并且为你配置好它。同时,还有大量的用于OpenGL ES 模拟器的提升,相信它会给开发者带来更好的更接近于真机的模拟器表现。指纹识别支持以及一个特殊的 Android Auto 模拟器也已有提供。

Android Studio对C以及C++的支持

image

除了在打包系统中集成了 NDK 的支持,开发团队还与 JetBrains 合作,将他们新的C/C++ IDE CLion 直接集成在了Android Studio 。并且这一切都是免费的。

这次结合满足了你对一个 JetBrains的产品抱有的所有期待: 强大的重构能力,代码分析工具,代码导航,语义查询代码用例遗迹更多的特性。除此以外,还有两个能改变游戏规则的重量级功能来给native 层的开发带来便捷。

Android Studio 现在支持使用 GDB 或者 LLDB 来debug代码。Debug native 的代码在以前是一件非常麻烦的事情,而现在,耳目一新的感觉吧?

更为称道的消息是 C/C++代码 和 Java/JNI 代码的紧密融合。为了让 C/C++ 代码可以与 Java 代码相互调用。你需要为它们创建连接的桥梁。这便要通过 Java Native Interface(即JNI来实现),本质上就是一个可以让我们从Java 代码调用 C/C++代码的 C/C++ API,反之亦然。你可以在声明 Java 方法时,带上 native 的 修饰词,这样就意味着该方法是在C/C++ 层面去实现的。而对应的方法则需要按照严格的规范命名,并规定管理好传参的规则。

而现在, Android Studio 帮助你用简单的方式完成以上所有工作。你可以在 Java 层声明好方法,然后 Android Studio 就会自动的帮你生成 JNI 代码。还包括了一些预定义类型的处理,比如 string,arrays。更令人印象深刻的是, 重构以及查找用例都如你所想要的可以使用。在某个文件上做重构,另外一侧的文件也会被修改到。

JNI 层的开发依然十分烦杂,但这些改变可以让它变得好受一点。

新支持的Annotations

image

Java annotations(注解,即使@后面的那个)可以让开发者在编译期以及运行时做一些神奇的事情。开发者团队新增了13个 annotations 来帮助开发者避免一些特定类型的 bug 。

举个例子,@WorkerThread 这个 annotation, 带有该 annotation 的方法会自动检查该方法中是否有代码职能在UI线程上执行的。Android Studio 会高亮出类似错误,比如设置一个按钮的文字,在一个worker 线程执行了。 开发团队已经将很多 Android 运行库中的方法标记了该 annotation 所以开发者并不需要自己去动手添加。

另外一个例子就是@RequiresPermission。和@WorkerThread 一样,大多数的Android 运行库方法已经被注解过了。这是防止开发者使用了一个需要特定权限的API,但是却没有在 manifest 文件中声明权限,Android Studio 会弹框告诉你问题并为你提供插入对应权限的选项。在 Android M 中,权限管理有一定的修改,用户可以在应用运行时决定给予或禁止一些权限。这就意味着,你的应用需要处理无权限的情况。对于这种情况,Android Studio 也会自动的插入处理代码的框架。

还有一些 annotations 是用于 debug 中将标志值对应标志名的问题,或者识别 编码过的颜色,资源或者view id的问题。

这个讲解新 annotations 的文档目前还没有完全完工,你应该可以很快在这里看到它们。

数据绑定

image

当开发UI界面时,通常会将布局和视图从代码中分离到 xml 文件中然后写一些简单Java 对象(POJOs) 以及 一些 Java 代码。例如使用 findViewById() 在布局被加载后去获取对应的UI 视图的对象。

Data Binding 库可以帮助开发者更简单的完成工作。不需要手动的去处理数据和视图的合作,而是声明一些简单的对象,通过一系列简单对象引用一些值并且在 布局 XML 文件中去监听这些值。这个很像 .NET里XAML的做法。

为了调解 Java 类和布局 xml 文件,编译打包系统会编译期生成一个捆绑 Java 类。这个可以帮助开发者debug 调试问题。

你还可以将这变成一个双向的过程,通过让你的简单 Java 对象实现 android.databings.Observable 接口,改变简单对象的值会 影响 UI展现,反之亦然。(setText 后,bind的值也会变化的意思)

data binding 库目前还处于 beta 阶段,需要 Android Studio 1.3.0-beta1 以及最新的Android Gradle plugin.
点击这里查看更多信息。

分析工具

image

内存和性能分析工具得到了全面的改变。现在你可以在Android Studio中通过简单的图形界面操作直接获取并保存堆栈以及方法调用情况(method traces)的快照并且找出问题原因了。新的分析工具还具备了可视化视图查询的功能。你再也不需要手动的去转换 HPROF 文件了。

image

新的内存快照具备简洁明了的向下钻能力(drill down我理解是一层一层的点下去。。)。它提供了对象调试视图,从而让你可以查看到还在堆内存中的对象们。它还允许你顺着引用链一直找到最近的GC 节点从而轻松的找到是什么被持有住了。

开发者服务

image

Google 提供了广告,数据分析等服务。而如今 Android Studio 1.3 可以帮助你通过一系列定制 UI 更容易的使用这些服务,比如API Keys等。这个新功能同样会帮助添加所需要的依赖,权限以及模版类从而可以花最少的时间使用这些服务。

即将发布的新功能

image

新的可视化设计视图暂时还没有被集入到Android Studio 1.3中。尽管如此,它们还是非常令人兴奋的,因为可以为开发者减轻创建UI界面的负担。
上面的截图展示了新的主题编辑器。它让你可以可视化的检查以及修改主题文件。它还可以展示使用该主题的控件的预览。

image

而布局编辑器则被完全的重写,多了很多新功能。上述截图展示了蓝图模式,这可以让你专注于你的布局,字体风格等。它还与设计库集成,从而可以通过拖拉直接添加设计元素到布局中。

image

而 XML 文件预览模式现在有能力展示系统Preference了(以前是无法预览Preference的)。更重要的一个功能是完全的对布局文件预览窗口直接操作的所见即所得编辑,包括一些控件的拖动。

Q&A

很不幸,Q&A环节十分的短暂。而在其中最有意思的问题是 Android 什么时候支持 Java 8。而回答则是,“这是一个平台性问题”("that's a platform issue")。

Android安全概述

Android 安全架构的理解不仅帮助我了解 Android 的工作原理,而且为我开启了如何构建移动操作系统和 Linux 的眼界。 本章从安全角度讲解 Android 架构的基础知识。 在第 1....

发布于:1年以前  |  1711次阅读  |  详细内容 »

Android Linux 内核层安全

作为最广为人知的开源项目之一,Linux 已经被证明是一个安全,可信和稳定的软件,全世界数千人对它进行研究,攻击和打补丁。 不出所料,Linux 内核是 Android 操作系统的基...

发布于:1年以前  |  1482次阅读  |  详细内容 »

Android 本地用户空间层安全

本地用户空间层在 Android 操作系统的安全配置中起到重要作用。 不理解在该层上发生了什么,就不可能理解在系统中如何实施安全架构决策。 在本章中,我们的主题是 Android ...

发布于:1年以前  |  1186次阅读  |  详细内容 »

Android 框架层安全

如我们在第1.2节中所描述的那样,应用程序框架级别上的安全性由 IPC 引用监视器实现。 在 4.1 节中,我们以 Android 中使用的进程间通信系统的描述开始,讲解这个级别上的...

发布于:1年以前  |  1410次阅读  |  详细内容 »

Android 应用层安全

虽然在这一节中我们描述了应用层的安全性,但是实际的安全实施通常出现在到目前为止描述的底层。 但是,在介绍应用层之后,我们更容易解释 Android 的一些安全功能。 5.1 ...

发布于:1年以前  |  2034次阅读  |  详细内容 »

Android 安全的其它话题

在本章中,我们会涉及到与 Android 安全相关的其他主题,这些主题不直接属于已经涉及的任何主题。 6.1 Android 签名过程 Android 应用程序以 Android 应用包文件(.apk文件...

发布于:1年以前  |  1587次阅读  |  详细内容 »

数据绑定(Data Binding)-Part5

原文链接 : Data Binding - Part 5 直到现在,我们已经见识到Data Binding的很多功能了。但是还有一个很强大的特点没有介绍,那就是观察者模式的应用。 观察者模式在数据会...

发布于:1年以前  |  1059次阅读  |  详细内容 »

在Android 5.0中使用JobScheduler

原文链接 : using-the-jobscheduler-api-on-android-lollipop 在这篇文章中,你会学习到在Android 5.0中如何使用JobScheduler API。JobScheduler API允许开发者在符合某些...

发布于:1年以前  |  964次阅读  |  详细内容 »

Code Review最佳实践

原文链接 : Code Review Best Practices 在Wiredrive上,我们做了很多的Code Review。在此之前我从来没有做过,这对于我来说是一个全新的体验,下面来总结一下在Code Revie...

发布于:1年以前  |  1183次阅读  |  详细内容 »

从Dex到源代码(伪代码)

这个系列的头两篇文章中,我写了两篇关于APK format和aapt tool的文章. 在这篇文章中我将重点讲述dex2jar,它是一个作用于Android .dex文件和Java .class文件的工具。已经...

发布于:1年以前  |  1380次阅读  |  详细内容 »

第五章 基于空间的架构

第五章 基于空间的架构 大多数基于网站的商务应用都遵循相同的请求流程:一个请求从浏览器发到web服务器,然后到应用服务器,然后到数据库服务器。虽然这个模式在用户数不...

发布于:1年以前  |  1165次阅读  |  详细内容 »

Retrofit指南

这是一篇关于如何使用Retrofit写一个Android的REST客户端的小教程。 我为什么选择Retrofit? 在使用square的Retrofit之前,我尝试过Volley和AsyncTask。但在使用过Retrofi...

发布于:1年以前  |  1366次阅读  |  详细内容 »

使用Mockito对异步方法进行单元测试

原文链接 : Unit testing asynchronous methods with Mockito 之前我拍着胸脯承诺要维护的我博客,因此才有了这篇文章。但是请忘记我的那些承诺,我今天要写的是关于Mockit...

发布于:1年以前  |  1150次阅读  |  详细内容 »

Android中调试RxJava

原文链接 : Debugging RxJava on Android 调试是查找和分析bug的过程或者预防软件的正确操作出现问题Wikipedia。 当前调试不是一件容易的事情,我们在处理Android的异步操...

发布于:1年以前  |  797次阅读  |  详细内容 »

国内优秀Android学习资源

技术博客 应用开发 博主 博客 备注 任玉刚 CSDN博客 深入Android应用开发,深度与广度兼顾 郭霖 CSDN博客 内容实用,行文流畅,高人气博主 夏安明 CSDN博客 ...

发布于:1年以前  |  1194次阅读  |  详细内容 »

最多阅读

简化Android的UI开发 7月以前  |  193170次阅读
Android设计与开发工作流 7月以前  |  2301次阅读
Google Enjarify:可代替dex2jar的dex反编译 1年以前  |  2293次阅读
Android多渠道打包工具:apptools 1年以前  |  1924次阅读
Android权限 - 第一篇 1年以前  |  1893次阅读
Google Java编程风格规范(中文版) 1年以前  |  1875次阅读
Stetho 1年以前  |  1811次阅读
Android UI基本技术点 1年以前  |  1803次阅读
30分钟搭建一个android的私有Maven仓库 1年以前  |  1767次阅读
2015 Google IO带来的新 Android 开发工具 1年以前  |  1707次阅读
你应该知道的布局和属性 1年以前  |  1655次阅读
听FackBook工程师讲*Custom ViewGroups* 1年以前  |  1652次阅读
MVP在Android平台上的应用 1年以前  |  1634次阅读
Gradle小知识#3:任务的顺序 1年以前  |  1629次阅读