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 安全相关的其他主题,这些主题不直接属于已经涉及的任何主题。 6.1 Android 签名过程 Android 应用程序以 Android 应用包文件(.apk文件...

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

Android 应用层安全

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

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

Android 框架层安全

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

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

Android 本地用户空间层安全

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

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

Android Linux 内核层安全

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

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

Android安全概述

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

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

使用Robolectric的参数化测试

原文链接 : Parameterized testing with Robolectric 在目前的项目中我们使用Robolectric为Android应用程序编写单元测试,它一直都干的不错。最近我需要编写一个测试用例,通...

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

Android MVPR 架构模式-Part1

原文链接 : MVPR: A FLEXIBLE, TESTABLE ARCHITECTURE FOR ANDROID (PT. 1) 全面的单元测试能提高内部系统的代码质量,因为系统的每一个组件都需要被测试,因此每个单元...

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

使用Espresso进行UI测试

原文链接 : Using Espresso for Easy UI Testing 在我和很多Android开发者聊天的时候我注意到他们在开发的过程中并不注重测试这一环节,原因是他们认为Android测试太难实现...

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

从网页中触发Android原生的分享Intent

原文链接 : Triggering a native Share intent on Android from the web 这是很久之前的事了,在我访问了班加罗尔(印度南部城市)的FlipKart以及进行了一场关于是否存在一...

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

Android高性能JSON数据解析

原文链接 : Hi Performance JSON Parsing in Android 有时Android开发中我们调用的1/3的API需要我们下载JSON数据。现在我有一个客户端调用一个API接口用于为设备同步数据。...

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

在Activity中使用Thread导致的内存泄漏

注:这篇博文涉及的源码可以在 GitHub 上面下载哦 做 Android 开发最常遇到的问题就是在 Activity 的生命周期中协调耗时任务,避免执行任务导致不易察觉的内存泄漏。不妨...

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

使用RxJava缓存Rest请求

原文链接 : Subscribe It While It's Hot: Cached Rest Requests With RxJava 免责声明: 在这篇文章中,我尝试去用正确的方法来解决一个常见的问题。我仍然正在整理我脑袋...

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

使用ACTION_PROCESS_TEXT创建自定义文本选择动作

原文链接 : Creating custom Text Selection actions with ACTION_PROCESS_TEXT 使用ACTION_PROCESS_TEXT创建自定义文本选择动作 Android 6.0引入了一个新的浮动文本选择工...

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

markdown转换教程 #

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

Gradle小知识#3:任务的顺序

原文链接 : Gradle tip #3: Tasks ordering 我发现在使用Gradle的过程中遇到的很多问题都跟任务的顺序有关系,不管是已经存在的任务还是我自定义的任务。很显然,如果任务...

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

Android 自动截屏工具

原文链接 : Automating Android Screenshots 随着mac版本AndroidTool的发布,获取android应用截屏变得非常简单。与此同时,感谢开发商!这对于我们开发者来说真是太好了! ...

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

在Android开发中使用RxJava

ReactiveX是专注于异步工作的API,它将异步事件的处理与观察者模式、迭代器模式及函数式编程相结合了起来。实时地处理返回数据是在工程中经常出现的情景,所以使用高效、可...

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

使用Androguard静态分析APK

到目前为止,在之前关于Android逆向工程的介绍中,我们已经知道了APK文件的格式,如何使用使用AAPT,提取应用程序中和Android SDK相关的有用信息,如何将DEX字节码转化成更具...

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

Kotlin for Android (III)/ 扩展函数与默认值

原文链接 : Kotlin for Android (III): Extension functions and default values 现在你已经了解Kotlin基础与如何配置你的项目,是时候谈论Kotlin能为我们做哪些Java做不到...

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

最多阅读

简化Android的UI开发 1年以前  |  444402次阅读
30分钟搭建一个android的私有Maven仓库 2年以前  |  3320次阅读
Android设计与开发工作流 1年以前  |  3229次阅读
Google Enjarify:可代替dex2jar的dex反编译 2年以前  |  3122次阅读
Android多渠道打包工具:apptools 2年以前  |  2680次阅读
Google Java编程风格规范(中文版) 2年以前  |  2646次阅读
Android UI基本技术点 2年以前  |  2638次阅读
Android Studio 生成so文件 及调用 9月以前  |  2565次阅读
Android权限 - 第一篇 2年以前  |  2520次阅读
Stetho 2年以前  |  2447次阅读
2015 Google IO带来的新 Android 开发工具 2年以前  |  2382次阅读
Android死锁初探 10月以前  |  2376次阅读
听FackBook工程师讲*Custom ViewGroups* 2年以前  |  2294次阅读