标签 Android 下的文章

我最近买了新 MacBook Pro 作为我的主要的安卓开发机,我的老式的 MacBookPro(13 寸,2011 年后期发布,16GB 内存, 500G 的固态硬盘,内核是 i5,主频 2.4GHz,64 位),我也没卖,我清理了它,并把他变成了一个 MacOS 和Ubuntu 双引导的持续集成(CI)服务器。

写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣。好了,现在开始:

  1. 配置一个新的 Ubuntu ,以便运行 Android SDK。
  2. 安装 Jenkins CI 服务来拉取、编译、运行测试托管在 Github 的多模块 Android 项目。
  3. 安装 Docker 并在容器中运行 MySQL 服务器和 SonarQube。来运行由 Jenkins 触发的静态代码分析。
  4. Android app 配置需求。

第一步-安装 Ubuntu:

我将使用 Ubuntu 作为持续集成的 SO,因为 Ubuntu 有一个强大的社区,它可以解决你遇到的任何问题,而且我个人推荐总是使用 LTS 版本,当前是 16.04 LTS。已经有很多教程教大家在各种硬件上怎么安装了,我就不废话了,贴个下载链接就行了。

有人可能很奇怪:用什么桌面版,服务器版多好。额,这个嘛,萝卜青菜,各有所爱。我倒不在乎 UI 占用的那点运算资源。相反,用那一点资源换来生产力的提升我觉得挺值的。

第二步-远程管理:

SSH 服务器

Ubuntu 桌面版默认安装并没有 ssh 服务器,所以你想远程通过命令行管理的话就只好自己安装。

$ sudo apt-get install openssh-server

NoMachine 远程桌面

可能你的持续集成服务器没有挨着你,而是在你的路由器后面,或者其它屋子,甚至还可能远离你数里。我试过各种远程桌面方案,不得不说,IMHO NoMachine 在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中)。

第三步-配置环境:

这里我打算安装 Java8,Git,和 Android SDK,Jenkins 需要它们来拉取、编译和运行 android 项目。

SDKMAN!

这个超级厉害的命令行工具让你可以安装各种流行的 SDK(比如说,Gradle、Groovy、Grails、Kotlin、 Scala……),并可以以容易方便的方式列出它们和在各个并行版本中切换。

它们最近又增加了对 JAVA8 的支持,所以我使用它来安装 Java,而是用流行的 webupd8 仓库。所以在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到。

安装 SDKMAN! 很容易,执行以下命令即可:

$ curl -s "https://get.sdkman.io" | bash

Oracle JAVA8

因为我们已经安装了 SDKMAN! ,所以安装 JAVA8 就相当简单了:

$ sdk install java

或者使用 webupd8 这个仓库:

Git:

安装git的命令也非常直观,就不废话了。

$ sudo apt install git

Android SDK

这下面这篇文章的底部

你可以找到 “Get just the command line tools” 等字样,复制这个链接。比如:

https://dl.google.com/android/repository/tools_r25.2.3-linux.zip

下载,然后解压到 /opt/android-sdk-linux 下:

$ cd /opt
$ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
$ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux

我们使用 root 用户创建了该目录,所以我们需要重新授权来使我们的主要用户对它可读可写。

$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/

然后,在 ~/.bashrc 文件下设置 SDK 的环境变量

$ cd
$ nano .bashrc

在文件底部写入这些行(注意,但要在 SDKMAN! 配置文件前):

export ANDROID_HOME="/opt/android-sdk-linux"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"

关闭此终端,再打开一个新的终端看看环境变量是否正确生效:

$ echo $ANDROID_HOME
/opt/android-sdk-linux

然后我们启动图形界面的 Android SDK 管理器,并安装你所需的平台和依赖:

$ android

运行 Android SDK Manager 的图形交互界面

第四步-Jenkins 服务器

这里,我要讲讲怎么安装、配置该服务器,并创建 Jenkin 任务来拉取、构建和测试 Android 项目,并怎样获取控制台输出。

安装 Jenkins

你可以在下面的链接找到 Jenkins 服务器相关信息:

我们有许多办法运行 Jenkins,比如说运行 .war 文件,作为 Linux 服务,作为 Docker 容器等等。

我起初是想把它当做 Docker 容器运行,但是后来我意识到正确地配置代码文件夹、android-sdk 文件夹的可见性,和插到运行的 Android 测试机上的物理设备的 USB 可见性简直是一场噩梦。

少操点心,我最终决定以服务的方式,增加 Stable 仓库的 key 来通过 apt 安装和更新。

$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

编辑 source.list,写入这一行:

$ sudo nano /etc/apt/sources.list
#Jenkin Stable
deb https://pkg.jenkins.io/debian-stable binary/

然后安装:

sudo apt-get update
sudo apt-get install jenkins

在你的用户组里面增加 jenkins ,允许其读写 Android SDK 文件夹。

$ sudo usermod -a -G 你的用户组 jenkins

Jenkins 服务在开机引导时就会被启动,并可通过 http://localhost:8080 访问:

安装完毕会有一些安全预警信息,跟着引导程序走,你的 Jenkins 就会运行了。

启用安装成功的 Jenkins 服务器。

Jenkins 配置

启用成功后,会有提示程序提示你安装插件,单击 “Select plugins to Install” 就可以开始浏览所有插件,然后选择你要安装的插件就 OK 了 。

安装 Jenkins 插件

创建管理员用户,并完成安装。

要完成安全需要配置环境变量 ANDROID_HOMEJAVA_HOME

点击 Manage Jenkins,接着 Configure System。

滚动文件至底部,在全局属性模块中找到环境变量,并增加 ANDROID_HOMOE,和 JAVA_HOME 变量。

给所有 Jenkins 任务增加全局变量

创建 Jenkins 任务

一个 Jenkins 任务定义了一系列不间断的操作。如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手。它只是一个多模块的 app,带有单元测试、Android 测试,包括 JaCoCo、SonarQube 插件。

首先创建一个新的 Freestyle 任务项目,取名为 Hello_Android。不要在名字中使用空格,这样可以避免与 SonarQube 不兼容的问题。

创建一个 Freestyle Jenkins 任务

接下来就是配置了,我给每一部分都做了截屏。

概况

这部分比较繁琐,你可以在这里变更任务的名字、增加简介。如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,这是 url 的部分,不是仓库的)。

项目 Url 配置

源代码管理

这时候我们就要选择我们的 CVS 作为 Git,并且增加仓库的 url(这次就要包括 *.git)然后选择分支拉取。因为这是一个公开的 GitHub 仓库,我们就不需要提交证书了,否则的话就要设置账号和密码。

相比于使用你的带有完全权限的公开仓库,我更倾向于为你的私有库创建一个新的只读用户来专门配给 Jenkins 任务使用。

另外,如果你已经使用了双因子认证,Jenkins 就无法拉取代码,所以为 Jenkins 专门创建一个用户可以直接从私有库中拉取代码。

配置仓库

构建触发器

你可以手动开始构建,也可以远程地、周期性地、或者在另一个任务构建完成之后开始构建,只要这些改变可以被检测到。

最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github 为此提供了一个名叫 webhooks 的系统。

这样,我们就可以配置来发送这些事件到 CI 服务器,然后触发构建。显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信。

你的 CI 服务器也许为了安全只限于内网使用,那么解决办法就只有集中周期性的提交。我就是只有工作时才打开 CI,我把它设置为每十五分钟轮询一次。轮询时间可以通过 CRON 语法设置,如果你不熟悉,请点击右侧的帮助按钮获取带有例子的丰富文档。

仓库轮询配置

构建环境

这里我推荐设置构建超时来避免 Jenkings 占用内存和 CPU ,毕竟有时候有意外发生。当然,你还可以插入环境变量和密码等等。

构建超时

构建

现在是见证魔法的时刻了,增加一个 Build 步骤,引入 Gradle 脚本,选择 Gradle Wrapper (默认情况下,Android 项目带有 Gradle Wrapper,不要忘记把它检入到 Git ),然后定义你要执行哪些任务:

  1. clean:清除之前构建的所有历史输出,这样可以确保没有东西缓存,从头构建。
  2. asseembleDebug: 生成调试 .apk 文件。
  3. test:在所有模块上执行 JUnit 测试。
  4. connectedDebugAndroidTest:在连接到 CI 的实体机上执行安卓测试单元(也可以使用安装了安卓模拟器的 Jenkins 插件,但是它不支持所有型号,而且相当麻烦)。

配置 Gradle

构建后操作

我们将要增加“发布 JUnit 测试报告”,这一步由 JUnit 插件提供,其搜集由 JUnit 测试结果生成的 XML 文件,它会生成漂亮的图表来按时间展示测试结果。

我们 app 模块中,测试运行结果的路径是: app/build/test-results/debug/*.xml

在多模块项目中,其它的“纯” Java 模块中测试结果在这里:*/build/test-results/*.xml

还要增加“记录 JaCoCo 覆盖率报告”,它要创建一张显示代码覆盖率的图表。

运行 Jenkins 任务

只要有任何改变提交到仓库,我们的测试任务将每十五分钟执行一次,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行。单击“现在构建”按钮,当前的构建将出现在构建历史中,点击它可以查看细节。

手动执行任务

最有趣的部分是控制台输出,你可以看到 Jenkins 是如何拉取代码并执行我们之前定义的 Gradle 项目,例如 clean。

控制台输出的开始部分

如果一切都正常的话,控制台将会有如下输出 (任何仓库连接问题,单元测试或 Android 测试的失败都将导致构建失败)。

哈哈哈哈,构建成功,测试结果符合预期

第五步-SonarQube

这部分我会讲讲如何安装、配置 SonarQube ,并配以使用 Docker 作为容器的 MySQL 数据库。

SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净的代码、检测错误和学习最佳体验。它还可以跟踪代码覆盖、测试结果、功能需求等等。SonarQube 检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去。

安装 Docker

安装 Docker 十分容易,按照下面的教程即可:

生成容器

MySQL

我们先搭建一个 MySQL5.7.17 服务器容器,命名为 mysqlserver,它将在开机引导时启动,带有一个在你的家目录下的本地卷,带有密码,服务暴露在 localhost:3306 上(把命令中的 YOUR_USERYOUR_MYSQL_PASSWORD 替换为你自己账号密码)。

$ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17

phpMyAdmin

想要优雅简单地管理 MySQL服务器,我强烈推荐 phpMyAdmin。你只要建立个容器,命名为 phpmyadmin,然后链接到我们的 mysqlserver 容器,它会在开机引导时启动,它暴露在 localhost:9090。使用最新的版本。

$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin

你可以用你的 mysql 密码 YOUR_MYSQL_PASSWORD ,以 root 身份登录 localhost:9090 的 phpMyAdmin 界面,并创建一个数据库 sonar,使用uft8_general_ci 字符集。此外,也创建一个 sonar 的新用户,密码 YOUR_SONAR_PASSWORD,并给它 sonar 数据库的权限。

SonarQube

现在我们已经创建好了我们的 SonarQube 容器,就叫 sonarqube,它会在机器引导时启动,自动链接搭配我们的数据库,服务暴露在 localhost:9090,使用 5.6.4 版本。

$ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4

配置 SonarQube

如果一起都正常,你将在 localhost:9000 看到如下页面:

好了,让我们来配置必要的插件和基本的配置文件:

  1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin)。
  2. 进入到 Administration,然后点击 System,接下来是 Updata Center,最后是 Updates Only。

    • 如果需要的话,更新 Java 插件。
  3. 现在启用,并安装以下插件

    • Android (提供 Android lint 规则)
    • Checkstyle
    • Findbugs
    • XML
  4. 返回顶部,点击重启按钮完成整个安装。

SonarQube 配置文件

我们刚刚安装的插件可以定义配置文件,可以用一套规则去衡量项目的代码质量。

同一时间一个项目只能使用一个配置文件。但是我们可以定义父配置文件并继承规则,所以要对我们的项目执行所有的规则,我们可以创建定制的配置文件并链状串联所有配置文件。

就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile。

将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,继续此步骤,直到你完成父级继承方案,并且设置 CustomAndroidProfile 作为默认。

继承链

运行 Sonarqube 分析器

现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务 sonarqube 到我们的 Jenkins 任务。我们在最后执行。

再次运行 Jenkins 任务,一旦运行完毕,我们可以在 localhost:9090 中看到我们的 sonarQube 控制面板。

分析结果的显示

点击项目名称我们可以进入到不同的显示界面,最重要的可能就是问题界面了。

在下一屏,我将展示一个主要问题,它是一个空构造器方法。就我个人而言,使用 SonarQube 最大的好处就是当我点击“...”时可以在屏幕底部显示解释。这是一个学习编程十分有用的技能。

第六步 附加:配置其他 Android 应用

想要配置 Android 应用得到覆盖率和 sonarqube 的结果,只要安装 JaCoCo 和 Sonarqube 插件就可以了。你也可以在我的示例中得到更多信息

你也可以看看我在云上测试的文章:

最后

啊,你终于走到头了,希望你觉得本文有点用处。你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论。我拼了老命也要帮你。哦,忘了提醒,好东西要和朋友分享。


作者简介:

Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · Android, OpenSource and OpenData promoter · Runner · Traveller


via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98

作者:Pablo A. Martínez 译者:Taylor1024 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

毫不夸张地说,谷歌搜索在棒棒糖中无处不在。“持续开启语音识别”这项特性让用户可以在任何界面随时说出“OK Google”,即时是在息屏状态也没有问题。谷歌应用依然是谷歌的首要主屏,这项特性是自奇巧时引入的。现在搜索栏也会显示在新的最近应用界面。

Google Now 依然是最左侧的主屏,但现在 Material Design 对它进行了大翻新,给了它一个色彩大胆的头部以及重新设计的排版。

Play 商店遵从了和其它棒棒糖应用相似的轨迹。它在视觉上焕然疑一新,大胆的色彩,新排版,还有一个全新的布局。通常这里不会有什么新增功能,就只是给一切换件新马甲。

Play 商店的导航面板现在真的可以用于导航了,每个分类有各自的入口。棒棒糖也不再在操作栏放“更多”按钮了,取而代之的是一个独立的操作按钮(通常是搜索),并且去掉了导航栏中多余的选项。这给了用户一个单独的地方来查找项目,而不用在两个菜单中寻找搜索的地方。

棒棒糖还给了应用让状态栏透明的能力。这让操作栏的颜色可以渗透到状态栏,让它只比周围的界面暗一点点。一些界面甚至在顶部使用了全幅英雄图片,同时显示到了状态栏上。

谷歌日历完全重写了,获得了很多新设计,也失去了很多特性。你不再能够双指缩放来调整时间视图,月份视图也从手机上消失了,周视图从七天退化成了五天的视图。在用户抱怨之后,谷歌将会花费接下来几个版本的时间来重新添加回这里面的一些特性。“谷歌日历”还加强了“谷歌”部分,去除了直接在应用内添加第三方账户的能力。非谷歌账户现在需要从 Gamil 来添加。

尽管如此,它看起来还是很棒。在一些视图上,月份开头带有头图,就像是真实的纸质日历。带有地点的事件会附带显示来自那个地点的照片。举个例子,我的“去往旧金山”会显示金门大桥。谷歌日历还会从 Gamil 获取事件并在你的日历中显示。

其它应用都可以套用基本相同的描述:功能上没有太多新鲜的,但新设计换掉了奇巧中的灰色以大胆,明亮的色彩。环聊获得了收取 Google Voice 信息的能力,时钟应用的背景颜色会随着每天时间的变化而改变。

任务调度器鞭策应用生态成型

谷歌决定在棒棒糖中实施“伏特计划(Project Volta)”,关注电量使用问题。谷歌从“电池史学家(Battery Historian)”开始,为自己和开发者创建了更多的电池追踪工具。这个 python 脚本获取所有的安卓电量日志数据,并转换成可读,交互式的图表。在这个新诊断工具的帮助下,谷歌将后台任务标记为主要的耗电大户。

在 2014 年的 I/O 大会上,这家公司注意到启用飞行模式并关闭屏幕可以让安卓手机待机将近一个月。但是,如果用户全部启用并使用设备,它们没法坚持一整天。结论就是如果你能让一切都停止活动,你的电池表现就能好得多。

因此,谷歌创建了一个新 API,称作“JobScheduler(任务调度器)”,这是个新的针对安卓后台任务的警察。在任务调度器出现之前,每个单独的应用为它自己的后台进程负责,这意味着每个应用会独立唤醒处理器和调制解调器,检查连通性、组织数据库、下载更新以及上传日志。所有东西都有它自己独立的定时器,所以你的手机会一直被唤醒。有了任务调度器,后台任务从无组织的混乱,转变为统一的批处理,有有序的后台进程处理窗口。

任务调度器可以让应用指定它们的任务所需的条件(连通性、Wi-Fi、接入电源等等),它会在那些条件满足的时候发送一条通知。这就像是推送邮件和每五分钟检查一次邮件的区别……但是带上任务需求的。谷歌还开始给后台任务推进一个“懒”实现。如果一些事情可以推迟到设备处于 Wi-Fi,接入电源以及待机状态,那它就应该等到那时候执行。你现在可以看到这一策略的成果,在 Wi-Fi 下,你可以将安卓手机接入电源,并且只有在这种条件下它才会开始下载应用更新。你通常不需要立即下载应用更新,最好的时候是等到用户有无限的电源和网络的时候进行。

开机设置获得面向未来的新设计

开机设置经过了大翻新,它不止是为了跟上 Material Design 指南,还是“面向未来”的,这样不管未来谷歌采用什么新的登录和验证方案,它都能够适应。记住,写“安卓编年史”的部分原因就是一些旧版安卓已经不再能工作了。这些年来,谷歌已经为用户升级了更佳加密的验证方案以及二次验证,但添加这些新的登录要求破坏了旧客户端的兼容性。很多安卓特性要求访问谷歌云设施,所以你没法登录的话,像安卓 1.0 的 Gmail 这样的就没法工作了。

在棒棒糖中,开机设置工作的前几个界面和之前的很像。你可以看到“欢迎使用安卓界面”以及一些设置数据和 Wi-Fi 连接的选项。但在这个界面之后就有了变化。一旦棒棒糖连接到了互联网,它会连接到谷歌的服务器来“检查更新”。这并不是检查系统或应用的更新,是在检查即将执行的设置工作的更新。安卓下载了最新版本的设置,然后它会要求你登录你的谷歌账户。

在今天登录进棒棒糖和奇巧的时候这个好处很明显。有可以可升级的设置流程,“2014”的棒棒糖系统可以适应 2016 的改进,像是谷歌新的“触碰登录”双重认证。奇巧在这就卡住了,但幸运的是它有个“浏览器登录”可以解决双重认证的问题。

棒棒糖的开机设置对将你的谷歌账户和密码放在单独的页面持极端立场。谷歌讨厌密码并提供了一些实验性的方式来不用单独页面登录到谷歌。如果你的账户设置为不使用密码,棒棒糖可以跳过密码页面。如果你设置了双重认证,设置页面就会进入到“输入双因素码”的设置流程。每个登录部分都是在单独的一个页面,所以设置流程是模块化的。页面可以随要求添加或移除。

开机设置还给了用户对应用还原的控制。安卓在这之前也提供了一些数据还原,但那是无法理解的,因为它仅仅只是在没有任何用户输入的情况下选择你的一台设备并开始恢复。开机设置流程中的一个新界面让用户可以看到在云端的设备配置集合,并选择合适的那个。你还可以选择要从那个备份还原的应用。备份有应用,你的主屏布局,以及一些小设置如 Wi-Fi 热点。它不是完全的应用数据备份。

设置

设置从暗色主题切换到了亮色。除了新外观,它还有方便的搜索功能。每个界面用户都能访问放大镜,让他们可以更容易地找到难找的选项。

这里有一些和伏特计划有关的额设置。“网络限制”允许用户将一个 Wi-Fi 连接标记为计费的,让任务调度器处理后台处理时避免使用它。同时作为伏特计划的一部分,添加了一个“节电模式”。它会限制后台任务并限制 CPU 性能,给你更长的续航但更慢的设备。

多用户支持已经出现在安卓平板中有一段时间了,但棒棒糖终于将它带到了安卓手机上。设置界面添加了一个新的“用户”页面,让你添加额外的账户或设置一个“访客”账户。访客账户是临时的——它们可以一次点击轻松删除。它不会像正常账户那样尝试下载关联到你账户的每个应用,因为它注定要在不久后被删除。


Ron Amadeo / Ron 是 Ars Technica 的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/29/

作者:RON AMADEO 译者:alim0x 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

ART——为未来提供了一个平台的安卓运行时

安卓里没有多少组件的血统能追溯到 1.0 时代,但在 2014 年, Dalvik 这个驱动安卓应用的运行时是它们中的一员。Dalvik 最初是为单核、低端性能设备设计的,而且存储和内存占用的优先级要高于性能表现。在过去的几年里,谷歌给 Dalvik 扩充了越来越多的更新,比如 JIT 支持、并发垃圾回收,以及多进程支持。但是随着多核手机的出现,它们比 T-Mobile G1 快上很多倍,而这些功能升级扩充只能帮安卓到这里了。

解决方案就是用 ART 这个安卓运行时替换 Dalvik,这是一个完全为现代智能手机硬件重写的应用引擎。ART 更强调性能表现和用户界面流畅度。ART 带来了一个从 JIT(Just-in-time,即时)编译到 AOT(Ahead-of-time,提前)编译的转变。JIT 会在每次应用运行的时候即时编译,节省存储空间,因为编译后的代码从不写入存储,但它消耗更多的 CPU 和内存资源。AOT 会将编译后的代码保存到存储,让应用启动的时候更快并减少内存使用。ART 会在设备上将编译代码作为安装的一部分进行,而不分发预编译的代码,这样编译器可以进行一些针对特定设备的优化。ART 还带来了 64 位支持,扩大了内存寻址范围,由 64 位指令集带来更佳的性能表现(特别是在媒体和加密应用上)。

而最好的部分是这个变化将这些性能优化和 64 位支持带给了每个 java 安卓应用。ART 为每个 java 应用生成代码,因此任何对 ART 的改进都自动应用到了这些应用。同时 ART 也是在未来的升级计划下写就,所以它能够和安卓一同进化。

一个系统层级的界面刷新

Material Design 带来了一个几乎对安卓所有界面的完全翻新。首先,整个核心系统界面改变了。安卓得到了一个全新的按钮集合,看起来有点像是 PlayStation 的手柄:三角形,圆形以及正方形按钮,分别代表后退,主屏幕,和最近应用。得益于全新的图标集,状态栏也是焕然一新。

“最近应用”获得了大翻新。从一个小略缩图纵向列表变成了一个巨大的,几乎全屏的略缩图串联列表。它还获得了一个新名字(也没那么守旧),“ 概览 Overview ”。这明显是受到了前面版本的 Chrome 标签页切换器效果的启发。

顺带一说,在这个安卓版本里 Chrome 的标签页切换器效果消失了。作为一种将 Web 应用与本地应用同等对待的尝试,Chrome 标签合并到了概览列表。是的:最近“应用”列表现在显示的是最近打开的应用,加上最近打开的网站。在棒棒糖中,最近应用列表还采取了一种“以文档为中心”的方法,意味着应用可以在最近应用列表中显示多个项目。比如你在 Google Docs 中打开了两个文档,它们都会显示在最近应用中,让你可以在它们之间轻松切换,而不用到应用的文件列表去来回切换。

通知面板是全新的。谷歌给通知面板带来了“卡片”主题,将每个项目归整到它自己的矩形中。单个通知条目从黑色背景变成了白色背景,有了更佳的排版和圆形图标。这些新通知来到了锁屏上,将它从一个最没用的中间屏变成了很有用的屏幕,用于展示“这里是你不在的时候发生的事情”。

全屏的通知,比如来电以及闹钟,都被抛弃了,取而代之的是在屏幕顶部弹出一个“抬头(HUD)”通知。抬头通知也对“高优先级”应用可用,最初这是为即时消息设计的。但是否是高优先级的通知这取决于开发者的决定,在开发者意识到这可以让他们的通知更显眼之后,所有人都开始使用它。之后版本的安卓通过给用户提供“高优先级”的设置解决了这个问题。

谷歌还给棒棒糖添加了一个单独的,但很相似的“优先”通知系统。“优先”通知是一个介于完全静音和“提醒一切消息”之间的模式,允许用户将特定的联系人和应用标记为重要。优先模式只会为这些重要的人发出提醒。在界面上来看,它采用了音量控制附加通知优先级控制以及设置中心添加一项优先通知新设置的形式。当你处在优先模式的时候,状态栏会有一颗星形标识。

快速设置获得了一系列的大改善。控制项现在是一块在通知上面的面板,所以它可以通过“两次下拉”手势来打开它。第一次下拉会打开通知面板,第二次下拉手势会缩小通知面板并打开快速设置。快速设置的布局变了,抛弃了平铺排列,转为一个单独面板上的一系列浮动按钮。顶部是十分方便的亮度调节条,之后是连接,自动旋转,手电筒,GPS,以及 Chromecast 的按钮。

快速设置现在还有了实际的内嵌面板。它可以在主界面显示无线网络接入点,蓝牙设备,以及移动数据使用量。

Material Design 革新给了几乎每个应用一个新图标,并带来了一个更明亮,白色背景的应用抽屉。默认应用阵容也有了很大的变化。和这些新应用问声好吧:通讯录,谷歌文档,Fit,信息,照片,Play 报亭,以及谷歌幻灯片。和这些死去的应用说再见吧:相册,G+ 照片,People,Play 杂志,电子邮件,以及 Quickoffice。

这些新应用中很多来自 Google Drive,从一个单独的大应用分割成每个产品一个应用。现在我们有了云端硬盘,文档,表格,以及幻灯片,都来自于云端硬盘团队。云端硬盘同时也要对 Quickoffice 的死亡负责,云端硬盘团队令它元气大伤。在“谷歌从来没法做好决定”分类下:通讯录从“People”改回了“Contacts”,短信应用在运营商的要求下叫回了 “Messenger”。(那些运营商喜欢谷歌环聊插手短信的职能。)我们有项真正的新服务:谷歌健身,一个健康追踪应用,可以在安卓手机和安卓手表上工作。Play 杂志也有了新的设计,添加了网站内容,所以它改名叫“Play 报亭”。

还有更多的谷歌专有应用接管 AOSP 的例子。

  • “G+ 照片”变成了“谷歌照片”,并取代了 AOSP 的相册成为默认照片应用,而相册也就随之消亡了。改名成“谷歌照片”是为照片应用退出 Google+并成为独立服务做准备。谷歌照片的发布在棒棒糖发布之后六个月——暂时应用只像是 Google+ 应用换了个图标和界面设计。
  • Gmail 从电子邮件应用接管了 POP3,IMAP 以及 Exchange 邮件的任务。尽管死掉的电子邮件应用还有个图标,但那是假的——它仅仅只显示一条信息,告诉用户从 Gmail 应用设置电子邮件账户。
  • “People”到“Contacts”的变化实际上是变为谷歌通讯录,又是一个取代 AOSP 对应应用的例子。

Ron Amadeo / Ron 是 Ars Technica 的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/28/

作者:RON AMADEO 译者:alim0x 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Android 5.0 Lollipop——有史以来最重要的安卓版本

2014 年 11 月,谷歌发布了 安卓 5.0 棒棒糖。很多系统更新都被称作“有史以来最大的”,但那些陈词滥调在安卓 5.0 棒棒糖的身上成真了。首先,它改变了安卓发布的方式。谷歌与这个版本的安卓一同开始了“开发者预览”计划,可以以 beta 的形式提前几个月看到新版本。由于版本代号和版本号现在被用作市场营销工具,最终的名称在 beta 期间始终保密,仅以字母指代。在 2014 年的 Google I/O 大会,谷歌宣布了“Android L 开发者预览”。

给开发者(以及全世界)四个月的时间接触学习这个版本肯定是有必要的。安卓 L 包含了大范围的变动,它们在系统中都是首次亮相,直到今天还能感受到这些变动。棒棒糖引入了 Material Design 设计理念,作为修改安卓每个界面的指南。一个新的运行时环境“ART”,它代表着驱动安卓应用引擎的完全革新。谷歌的“OK Google”语音命令系统升级到能在任意界面生效,在一些设备上它甚至可以在设备锁定的时候工作。多用户系统从平板来到了手机上。棒棒糖还铺设了 Android for Work 的基础,这是一个关注企业与个人双重应用的特性。

Material Design 给了安卓(以及谷歌的所有产品)一个统一形象

当 Matias Duarte 踏上 I/O 大会的舞台并宣布 Material Design 时,它公布的不仅仅是一个安卓的统一设计蓝图,还是谷歌的所有产品以及第三方应用生态的统一设计蓝图。这个想法是安卓、iOS、Chrome OS,以及 Web 版的谷歌产品,都应该有一致的界面风格、字体,以及行为。它们在不需要在不同尺寸的屏幕上有相同的布局,Material Design 提供了有一致行为的构建元素,它们能够基于屏幕尺寸自适应布局。

Duarte 和他的团队在蜂巢中尝试了“电子”风格审美,以及在果冻豆中的“卡片”主题风格,但 Material Design 最终成了被选中的设计系统,应用到谷歌的所有产品线。Material Design 已经超出了一个用户界面设计指南的概念,成为了谷歌作为一个公司的一致性代表。

Material Design 主要的比喻是“纸和墨”。所有的用户界面是“纸”的片层,漂浮于最底端平面之上。阴影用来提供界面的层次结构——用户界面的每个层在 Z 轴上拥有一个位置,并在其之下的元素上投射一个阴影。这是在安卓 4.1 的 Google Now 中使用的“卡片”风格更清晰的进化版本。“墨”是用来指代谷歌推荐开发者在界面的重要项目上使用的泼色。这个概念也引用了真实世界的物体概念,与 Windows 8 和 iOS 7 带来的反拟物化“不惜一切代价扁平化”的趋势相违。

动画也是一个重点,思想是任何东西都不应该“弹出”到屏幕上。组件应该滑进,缩小,或放大。“纸”表面和真实世界中的纸还有点不同,它们可以缩小,扩展,合并以及增大。为了让动画系统协同图像资源工作,阴影不像之前版本中那样整合进用户界面组件——实际上谷歌创造了一个实时的 3D 阴影系统,这样阴影就能够在这些动画和转换中正确渲染。

棒棒糖的层状界面和阴影的夸张侧视图。

为了将 Material Design 带到谷歌的其它地方以及应用生态系统,谷歌创建并持续维护着一个统一的设计指南,描述了一切设计的规范。那里有应该与不应该做的,基线、基线网格、色板、堆叠图解、字体、库、布局建议以及更多内容。谷歌甚至开始定期举办针对设计的会议,来听取设计者的声音以及给他们教学,还成立了 Material Design 奖项。在发布 Material Design 后不久,Duarte 离开了安卓团队并成为了谷歌的 Material Design 总监,创建了一个完全专注于设计的部门。


Ron Amadeo / Ron 是 Ars Technica 的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/27/

作者:RON AMADEO 译者:alim0x 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Android Wear

The LG G Watch. One of the first Android Wear devices.

2014 年 6 月安卓装备上了新元素:智能手表。谷歌在 2014 的 Google I/O 上发布了“Android Wear”,意图在你的手腕上装备一台小电脑。为一块 1.6 英寸的屏幕进行设计意味着需要从头构思整个界面,所以谷歌精简了安卓 4.4 KitKat,并创建出了一个小巧的智能手表操作系统。Android Wear 设备不是独立的计算机。它们依赖于运行着配套 Android Wear 应用的安卓智能手机进行连接,认证,以及应用数据获取。

 The typical Android Wear home screen.

Android Wear 智能手表主要是一个通知机器。有了安卓 4.3 及以上版本内建的新 API,任何手机收到的通知都能同时显示在手表上——无需任何应用支持。通知操作按钮也带到了手表上,让用户可以从手表上与通知进行交互。在手表上清除一条通知会同时在手机上将其清除,用户无需拿出另一台设备就可以管理通知消息。每个手表还带有一个语音命令系统和一个麦克风,让用户可以抬腕唤醒手表,说“OK Google”,并发出一条命令。你还可以通过语音回复信息。手表上甚至还有一个装有原生手表应用的应用抽屉。

Three Android Wear screens, showing music on the home screen, the voice command system, and a Google Now traffic card.

主屏幕上显示的自然是时间了,它还允许用户切换无数不同的表盘风格。通知界面采用了卡片风格设计。一个垂直滚动的通知列表会在手表上堆积,包括一些显示天气或交通信息的 Google Now 卡片。向左滑动能够清除一条通知,向右滑动会一次打开一个操作按钮。在主屏幕点击会打开语音命令系统,在哪里你可以激活设置或应用抽屉。除了这些以外最初的 Android Wear 的主屏幕没有多少内容。

The layout of the OS.

2014 年 Android Wear 设备仅仅发售了 720000 部,从那之后我们就没有从软件或硬件上看到多少发展。时至今日,智能手表的销售一年不如一年,甚至在 Apple Watch 发布后,没人能够真正确定他们想要让小腕上计算机做什么。明显这种情况会持续到 2017 年 Android Wear 2.0 发布。从 Moto 360 给市场带来圆形设备以来,我们还没从硬件厂商那边看到一些新玩意。


Ron Amadeo / Ron 是 Ars Technica 的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/27/

作者:RON AMADEO 译者:alim0x 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

新的“添加到主屏幕”界面无疑受到了蜂巢的启发。 [Ron Amadeo 供图]

奇巧的主屏幕配置界面漂亮地对蜂巢进行了复古。在有巨大的 10 英寸屏幕的蜂巢平板上(上方右侧图片),长按主屏背景会向你展现一个所有主屏幕的缩放视图。可以从下面的小部件抽屉里将它们拖放到任意主屏上——这很方便。在将蜂巢的界面带到手机上时,从安卓 4.0 直到 4.3,谷歌都跳过了这个设计,把它留给了大屏幕设备,在手机上长按后只显示一个选项列表(中间的图片)。

但在奇巧上,谷歌最终给出了解决方案。在长按后,4.4 呈现一个略微缩放的视图——你可以看到当前主屏以及它左右侧的屏幕。点击“小部件”按钮会打开一个小部件略缩图的完整列表,但是长按一个小部件后,你会回到缩放视图,并且你可以在主屏页面之间滚动,将图标放在你想要的位置。将图标或者小部件拖动过最右侧的主屏页面,你可以创建一个新的主屏页面。

联系人和去掉所有蓝色痕迹的键盘。 [Ron Amadeo 供图]

奇巧是电子风格设计的完结。在系统的大多数地方,剩下的蓝色高亮都被换成了灰色。在联系人应用中,头部和联系人列表字母分割线的蓝色都移除掉了。图片的位置换了一侧,底栏变成了浅灰色以和顶部相称。几乎将蓝色渗透进每个应用的键盘,现在是灰底、灰色、灰高亮。这可不是件坏事。应用应该允许有它们自己的配色方案——在键盘上强迫存在潜在的颜色冲突可不是个好设计。

前三张是奇巧的拨号盘,最后一张是 4.3 的。 [Ron Amadeo 供图]

谷歌完全重制了奇巧中的拨号,创造了一个疯狂的设计,改变了用户对手机的思考方式。实际上新版拨号中的数字都被尽可能地隐藏了——在首屏上甚至没有拨号盘。打电话的主要界面现在是个搜索栏!如果你想给你的联系人打电话,只要在搜索栏输入他的名字;如果你想给一个公司打电话,只要输入公司的名字,拨号会通过谷歌地图庞大的数据库找到号码。它工作得令人难以置信的好,这是只有谷歌才能完成的事情。

如果搜索不是你的菜的话,应用还会智能地显示通话记录列表,最常联系人,还有指向所有联系人的链接。底部的链接指向你的通话记录,传统的拨号盘,以及常规的更多操作按钮,包含一个设置页面。

Office 相关:新的内置应用 Google Drive,以及打印支持。 [Ron Amadeo 供图]

在奇巧中 Google Drive 终于作为内置应用包含了进来,令人惊奇的是这居然等了这么长时间。Drive 允许用户创建和编辑 Google Docs 表格和文档,用相机扫描文档并作为 PDF 上传,或者查看(不能编辑)演示文稿。Drive 的设计十分现代,侧面拥有滑出式导航抽屉,并且是 Google Now 风格卡片式设计。

为了有更多的移动办公乐趣,奇巧包含了系统级打印框架。在设置的底部有“打印”设置界面,任何打印机 OEM 厂商都可以为它写个插件。谷歌云打印自然是首批支持者之一。只要你的打印机和云打印相连接,无论是本地或通过一台装有 Chrome 浏览器的电脑,你都可以借助网络进行打印。应用同样也需要支持打印框架。点击 Google Drive 里的“i”按钮会显示文档信息,并且给你打印的选项。就像桌面系统那样,会弹出一个设置对话框,有打印份数,纸张尺寸,以及页面选择等选项。

Google+ 应用的“相片”部分,它取代了相册。 [Ron Amadeo 供图]

Google+ 相片和相册最初都在 Nexus 5 上随附,但在 Google Play 设备稍晚版本的奇巧上,相册被砍掉了,Google+ 完全接手了相片管理。新应用的主题从深色变成了浅色,Google+ 相片还带来了现代的导航抽屉设计。

安卓一直以来都有即时上传功能,它会自动备份所有图片到谷歌的云存储,开始是 Picasa 后来是 Google+。G+ 相片相比相册最大的好处是它可以管理那些云端存储的图片。图片右下角的云图标指示备份状态,它会从右到左地填满来指示上传状态。G+ 相片带来了它自己的照片编辑器,还有许多其它的 Google+ 图片功能,比如高亮,自动美化,当然,还有分享到 Google+。

时钟应用的调整,添加了一个闹钟页面并修改了时间输入框。 [Ron Amadeo 供图]

谷歌将 4.2 引入的优秀时间选择器换成了一个奇怪的时钟界面,操作起来比旧界面更慢了也更不精确了。首先是个可以选择小时的单指针时钟,然后显示的是另一个选择分钟的单指针时钟。选择的时候要转动分针或点击数字,这让用用户很难选择不是整五分钟的时间增量。不像之前的时间选择器需要选择一个时间段,这里默认时间段是 AM(重复一下,这样设置的时候容易不小心偏差 12 小时)。


Ron Amadeo / Ron 是 Ars Technica 的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/26/

译者:alim0x 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出