标签 Android 下的文章

Android 4.0 冰淇淋三明治 —— 摩登时代

三星 Galaxy Nexus,安卓4.0的首发设备。

安卓 4.0,冰淇淋三明治,在 2011 年 10 月发布,系统发布回到正轨,带来定期发布的手机和平板,并且安卓再次开源。这是自姜饼以来手机设备的第一个更新,意味着最主要的安卓用户群体近乎一年没有见到更新了。4.0 随处可见缩小版的蜂巢设计,还将虚拟按键, 操作栏 Action Bar ,全新的设计语言带到了手机上。

冰淇淋三明治在三星 Galaxy Nexus 上首次亮相,也是最早带有 720p 显示屏的安卓手机之一。随着分辨率的提高,Galaxy Nexus 使用了更大的 4.65 英寸显示屏——几乎比最初的 Nexus One 大了一整英寸。这被许多批评者认为“太大了”,但如今的安卓设备甚至更大。(5 英寸当今是“正常”的。)冰淇淋三明治比姜饼的性能要求更高,Galaxy Nexus 配备了一颗双核,1.2Ghz 德州仪器 OMAP 处理器和 1GB 的内存。

在美国,Galaxy Nexus 在 Verizon 首发并且支持 LTE。不像之前的 Nexus 设备,最流行的型号——Verizon 版——是在运营商的控制之下,谷歌的软件和更新在手机得到更新之前要经过 Verizon 的核准。这导致了更新的延迟以及 Verizon 不喜欢的应用被移除,即便是 Google Wallet 也不例外。

多亏了冰淇淋三明治的软件改进,谷歌终于达成了移除手机上按钮的目标。有了虚拟导航键,实体电容按钮就可以移除了,最终 Galaxy Nexus 仅有电源和音量是实体按键。

安卓 4.0 将很多蜂巢的设计缩小了。 [Ron Amadeo 供图]

电子质感的审美在蜂巢中显得有点多。于是在冰淇淋三明治中,谷歌开始减少科幻风的设计。科幻风的时钟字体从半透明折叠风格转变成纤细,优雅,看起来更加正常的字体。解锁环的水面波纹效果被去除了,蜂巢中的外星风格时钟小部件也被极简设计所取代。系统按钮也经过了重新设计,原先的蓝色轮廓,偶尔的厚边框变成了细的,设置带有白色轮廓。默认壁纸从蜂巢的蓝色太空船内部变成条纹状,破碎的彩虹,给默认布局增添了不少迟来的色彩。

蜂巢的系统栏在手机上一分为二。在顶上是传统的状态栏,底部是新的系统栏,放着三个系统按钮:后退、主屏幕、最近应用。一个固定的搜索栏放置在了主屏幕顶部。该栏以和底栏一样的方式固定在屏幕上,所以在五个主屏上,它总共占据了 20 个图标大小的位置。在蜂巢的锁屏上,内部的小圆圈可以向大圆圈外的任意位置滑动来解锁设备。在冰淇淋三明治,你得把小圆圈移动到解锁图标上。这个新准确度要求允许谷歌向锁屏添加新的选项:一个相机快捷方式。将小圆圈拖向相机图标会直接启动相机,跳过了主屏幕。

一个手机系统意味着更多的应用,通知面板重新回到了全屏界面。 [Ron Amadeo 供图]

应用抽屉还是标签页式的,但是蜂巢中的“我的应用”标签被“部件”标签页替代,这是个简单的 2×3 部件略缩图视图。像蜂巢里的那样,这个应用抽屉是分页的,需要水平滑动换页。(如今安卓仍在使用这个应用抽屉设计。)应用抽屉里新增的是 Google+ 应用,后来独立存在。还有一个“Messenger”快捷方式,是 Google+ 的私密信息服务。(不要混淆 “Messenger” 和已有的 “Messaging” 短信应用。)

因为我们现在回到了手机上,所以短信,新闻和天气,电话,以及语音拨号都回来了,以及 Cordy,一个平板的游戏,被移除了。尽管不是 Nexus 设备,我们的截图还是来自 Verizon 版的设备,可以从图上看到有像 “My Verizon Mobile” 和 “VZ Backup Assistant” 这样没用的应用。为了和冰淇淋三明治的去电子风格主题一致,日历和相机图标现在看起来更像是来自地球的东西而不是来自外星球。时钟,下载,电话,以及安卓市场同样得到了新图标,“联系人”获得了新图标,还有新名字 “People”。

通知面板进行了大改造,特别是和之前姜饼中的设计相比而言。面板头部有个日期,一个设置的快捷方式,以及“清除所有”按钮。虽然蜂巢的第一个版本就允许用户通过通知右边的“X”消除单个通知,但是冰淇淋三明治的实现更加优雅:只要从左向右滑动通知即可。蜂巢有着蓝色高亮,但是蓝色色调到处都是。冰淇淋三明治几乎把所有地方的蓝色统一成一个(如果你想知道确定的值,hex 码是 #33B5E5)。通知面板的背景是透明的,底部的“把手”变为一个简单的小蓝圈,带着不透明的黑色背景。

安卓市场的主页背景变成了黑色。 [Ron Amadeo 供图]

市场获得了又一个新设计。它终于再次支持纵向模式,并且添加了音乐到商店中,你可以从中购买音乐。新的市场拓展了从蜂巢中引入的卡片概念,它还是第一个同时使用在手机和平板上的版本。主页上的卡片通常不是链接到应用的,而是指向特别的促销页面,像是“编辑精选”或季度促销。


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


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

译者:alim0x 校对:wxy

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

安卓市场的新设计试水“卡片式”界面,这将成为谷歌的主要风格。 [Ron Amadeo 供图]

安卓推向市场已经有两年半时间了,安卓市场放出了它的第四版设计。这个新设计十分重要,因为它已经很接近谷歌的“卡片式”界面了。通过在小方块中显示应用或其他内容,谷歌可以使它的设计在不同尺寸屏幕下无缝过渡而不受影响。内容可以像一个相册应用里的照片一样显示——给布局渲染填充一个内容块列表,加上屏幕包装,就完成了。更大的屏幕一次可以看到更多的内容块,小点的屏幕一次看到的内容就少。内容用了不一样的方式显示,谷歌还在右边新增了一个“分类”板块,顶部还有个巨大的热门应用滚动显示。

虽然设计上为更容易配置界面准备好准备好了,但功能上还没有。最初发布的市场版本锁定为横屏模式,而且还是蜂巢独占的。

应用详情页和“我的应用”界面。 [Ron Amadeo 供图]

新的市场不仅出售应用,还加入了书籍和电影租借。谷歌从 2010 年开始出售图书;之前只通过网站出售。新的市场将谷歌所有的内容销售聚合到了一处,进一步向苹果 iTunes 所的主宰地位展开较量。虽然在“安卓市场”出售这些东西有点品牌混乱,因为大部分内容都不依赖于安卓才能使用。

浏览器看起来非常像 Chrome,联系人使用了双面板界面。 [Ron Amadeo 供图]

新浏览器界面顶部添加了标签页栏。尽管这个浏览器并不是 Chrome ,但它模仿了许多 Chrome 的设计和特性。除了这个探索性的顶部标签页界面,浏览器还加入了隐身标签,在浏览网页时不保存历史记录和自动补全记录。它还有个选项可以让你拥有一个 Chrome 风格的新标签页,页面上包含你最经常访问的网页略缩图。

新浏览器甚至还能和 Chrome 同步。在浏览器登录后,它会下载你的 Chrome 书签并且自动登录你的谷歌账户。收藏一个页面只需点击地址栏的星形标志即可,和谷歌地图一样,浏览器抛弃了缩放按钮,完全改用手势控制。

联系人应用最终从电话应用中移除,并且独立为一个应用。之前的联系人/拨号的混合式设计相对于人们使用现代智能手机的方式来说,过于以电话为中心了。联系人中存有电子邮件、IM、短信、地址、生日以及社交网络等信息,所以将它们捆绑在电话应用里的意义和将它们放进谷歌地图里差不多。抛开了电话通讯功能,联系人能够简化成没有标签页的联系人列表。蜂巢采用了双面板视图,在左侧显示完整的联系人列表,右侧是联系人详情。应用利用了 Fragments API,通过它应用可以在同一屏显示多个面板界面。

蜂巢版本的联系人应用是第一个拥有快速滚动功能的版本。当按住左侧滚动条的时候,你可以快速上下拖动,应用会显示列表当前位置的首字母预览。

新 Youtube 应用看起来像是来自黑客帝国。 [Ron Amadeo 供图]

谢天谢地 Youtube 终于抛弃了自安卓 2.3 以来的谷歌给予这个视频服务的“独特”设计,新界面设计与系统更加一体化。主界面是一个水平滚动的曲面墙,上面显示着最热门或者(登录之后)个人关注的视频。虽然谷歌从来没有将这个设计带到手机上,但它可以被认为是一个易于重新配置的卡片界面。操作栏在这里是个可配置的工具栏。没有登录时,操作栏由一个搜索栏填满。当你登录后,搜索缩小为一个按钮,“首页”,“浏览”和“你的频道”标签将会显示出来。

蜂巢用一个蓝色框架的电脑界面来驱动主屏。电影工作室完全采用橙色电子风格主题。 [Ron Amadeo 供图]

蜂巢新增的应用“电影工作室”,这不是一个不言自明的应用,而且没有任何的解释或说明。就我们所知,你可以导入视频,剪切它们,添加文本和场景过渡。编辑视频——电脑上你可以做的最耗时、困难,以及处理器密集型任务之一 —— 在平板上完成感觉有点野心过大了,谷歌在之后的版本里将其完全移除了。电影工作室里我们最喜欢的部分是它完全的电子风格主题。虽然系统的其它部分使用蓝色高亮,在这里是橙色的。(电影工作室是个邪恶的程序!)

小部件! [Ron Amadeo 供图]

蜂巢带来了新的部件框架,允许部件滚动,Gmail、Email 以及日历部件都升级了以支持改功能。Youtube 和书籍使用了新的部件,内容卡片可以自动滚动切换。在小部件上轻轻向上或向下滑动可以切换卡片。我们不确定你的书籍中哪些书会被显示出来,但如果你想要的话它就在那儿。尽管所有的这些小部件在 10 英寸屏幕上运行良好,谷歌从未为手机重新设计它们,这让它们在安卓最流行的规格上几乎毫无用处。所有的小部件有个大块的标识标题栏,而且通常占据大半屏幕只显示很少的内容。

安卓3.1中可滚动的最近应用以及可自定义大小的小部件。

安卓 3.1 中可滚动的最近应用以及可自定义大小的小部件。 [Ron Amadeo 供图]

蜂巢后续的版本修复了 3.0 早期的一些问题。安卓 3.1 在蜂巢的第一个版本之后三个月放出,并带来了一些改进。小部件自定义大小是添加的最大特性之一。长按小部件之后,一个带有拖拽按钮的蓝色外框会显示出来,拖动按钮可以改变小部件尺寸。最近应用界面现在可以垂直滚动并且承载更多应用。这个版本唯一缺失的功能是滑动关闭应用。

在今天,一个 0.1 版本的升级是个主要更新,但是在蜂巢,那只是个小更新。除了一些界面调整,3.1 添加了对游戏手柄,键盘,鼠标以及其它 USB 和蓝牙输入设备的支持。它还提供了更多的开发者 API。

安卓3.2的兼容性缩放和一个安卓平板上典型的展开视图应用。

安卓 3.2 的兼容性缩放和一个安卓平板上典型的展开视图应用。 [Ron Amadeo 供图]

安卓 3.2 在 3.1 发布后两个月放出,添加了七到八英寸的小尺寸平板支持。3.2 终于启用了 SD 卡支持,Xoom 在生命最初的五个月就像是初生儿的柔弱的肢体一样。

蜂巢匆匆问世是为了成为一个生态系统建设者。如果应用没有平板版本,没人会想要一个安卓平板的,所以谷歌知道需要尽快将东西送到开发者手中。在这个安卓平板生态的早期阶段,应用还没有到齐。这是拥有 Xoom 的人们所面临的最大的问题。

3.2 添加了“兼容缩放”,给了用户一个新选项,可以将应用拉伸适应屏幕(如右侧图片显示的那样)或缩放成正常的应用布局来适应屏幕。这些选项都不是很理想,由于没有应用生态来支持平板,蜂巢设备销售状况惨淡。但谷歌的平板决策最终还是会得到回报。今天,安卓平板已经取代 iOS 占据了最大的市场份额

Google Music Beta —— 取代内容商店的云存储

姜饼上的 Google Music Beta。 [Ron Amadeo 供图]

尽管蜂巢改进了 Google Music 的界面,但是音乐应用的设计并没有从蜂巢直接进化到冰淇淋三明治。2011 年 5 月,谷歌发布了“Google Music Beta”,和新的 Google Music 应用一同到来的在线音乐存储。

新 Google Music 为安卓 2.2 及以上版本设计,借鉴了 Cooliris 相册的设计语言,但也有改变之处,背景使用了模糊处理的图片。几乎所有东西都是透明的:弹出菜单,顶部标签页,还有底部的正在播放栏。可以下载单独的歌曲或整个播放列表到设备上离线播放,这让 Google Music 成为一个让音乐同步到你所有设备的好途径。除了移动应用外,Google Music 还有一个 Web 应用,让它可以在任何一台桌面电脑上使用。

谷歌和唱片公司关于内容的合约还没有谈妥,音乐商店还没准备好,所以它的权宜之计是允许用户存储音乐到线上并下载到设备上。如今谷歌除了音乐存储服务外,还有单曲购买和订阅模式。


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


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

译者:alim0x 校对:wxy

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

Fuchsia 可能是下个会替代 Android 或 Chrome OS 的系统。猜测有很多,Jack Wallen 对此补充了一些给 Google 的赞誉和告诫。

fuchsiahero.jpg

Google 总是以 “Google” 的方式解决或者做某件事。因此,当他们开始做一个让很多人挠头的项目时,大家是不觉得奇怪的。该项目被称为 Fuschia,大多数密切关注 Google 和 Android 的人都知道这个新平台。

对于那些还没紧跟 Google 最新消息的用户而言,Fuschia 是一个新的、开源的实时操作系统,它首先出现于 2016 年 8 月。那时,Fuchsia 只不过是一个命令行。一年不到的时间过去了,这个平台已经有了一个相当有趣的 GUI。

可能最让 Linux 拥趸失望的是,Fuchsia 并没有使用 Linux 内核。这个项目完全是 Google 开发的,使用了 Google 开发的名为 “Magenta”微内核。他们为什么这么做?了解到 Google 的最新设备 Pixel 运行的内核是 Linux 内核 3.18,你就会有你自己的答案了。Linux 3.18 发布于 2014 年(也就是说,在技术上已经过时了)。既然这样,为什么 Google 不能自己完全单干,以便尽可能地保持他们的移动平台跟上最新发展?

尽管我不愿意承认 Linux 可能不会(在未来的某个时期)成为全球最广泛使用的生态系统,但我相信这是 Google 的正确举措,不过我有一个重要的告诫。

首先,一些赞誉

首先我必须说,Google 开源 Fuchsia 这事真棒。Android 已经从开源的 Linux 内核中受益多年,所以这促使了 Google 开放他们最新的项目。说实话,如果不是开源和 Linux 内核,Android 就不会发展得那么快了。事实上,我大胆猜测,如果 Android 没有 Linux 和开源的支持,现在移动市场份额会显示出非常不同的、由苹果制定的结果。

一些喝彩是有必要的。操作系统不时需要完全重新思考。Android 是一个为移动平台服务得很好的令人惊奇的平台。然而,走到现在也就差不多了。考虑到消费界一直在寻找下一个大事件,而 Android(和 iOS)的潜力已尽榨干。与一个严重过时的内核相比,还是准备迎接对 Fuchsia 的喜爱吧。

谷歌从来不会停滞不前,这个新平台是证明。

一个告诫

开始这部分之前,我需要先给大家展示我的开源背景。自从 90 年代末以来,我一直是 Linux 的用户,并几乎涉及了开源的各个方面。在过去几年中,我一直在关注 Ubuntu 的发展,并对他们(现在)失败的融合尝试发表过看法。换言之,这也是我对 Fuchsia 的担心。

我认为 Google 对 Fucshia 的大计划是创建一个面对所有设备的操作系统:智能手机、IoT、Chromebook。从表面看来,这听起来像是一个会有重大成果的想法。但是,如果你看过 Canonical 对 Unity 8/Mir 融合的努力,你就会对“一个平台统治所有”的想法感到畏惧。当然这并不完全相同。我觉得 Google 正在创建一个单一的平台,让你 “融合” 所有的设备。毕竟,智能手机与物联网融合有什么好处?我们不需要在手机和恒温器之间交换数据。对么?对么???

即使如此,这应该是谷歌的计划,我会提醒他们近距离了解下 Canonical 和 Unity 8 之间发生的事。想法很好,但根本无法实现。

我也有可能错了。Google 可能只是将 Fuchsia 看作是 Android 的替代品。这很可能是 Google 需要替换过时的 Linux 内核,并决定“把一切都包含进来”。但是考虑到 Armadillo(Fuchsia UI)由跨平台的 Flutter SDK 编写,跨越平台边界的想法就有了可能。

或者,也许 Fuchsia 只是谷歌说的 “让我们用今天所知道的知识重建我们的智能手机平台,看看它会走向何方”。如果是这样,我可以想象,Google 移动操作系统将会取得重大成功。然而,现实情况是,人们必须面对的是“一个平台统治所有”还有许多要解决的事情。Google 已经在 Chromebook 上测试 Android app 很长时间了。不幸的是,这个思路一直反响平平(最多如此)。随着微软以自己的方式来直面 Chromebook,Google 知道他们必须扩大生态系统,否则将会失去宝贵的领地(如在教育领域)。要解决这个问题的一种方法是使用单个操作系统来驱动智能手机和 Chromebook。这意味着所有的程序都可以在两个平台(这是一个重要的福音)运行以及生态系统的普遍性(再一次,这是巨大的福音)。

猜测

Google 对会引发很多行家的猜测的事情一直小心谨慎。一般来说,至少对于 Android,谷歌似乎一直都在做出正确的选择。如果他们相信 Fuchsia 是要走的路,那么我就倾向于相信他们。然而,围绕这个平台有如此多的不确定性会让人们一直迫切地要知道。

那你怎么看?Fuchsia 会成为什么?和我一起猜猜看。


作者简介:

Jack Wallen 是 TechRepublic 和 Linux.com 的获奖作家。他是开源的狂热倡导者, 也是 The Android Expert 的代言人。有关 Jack Wallen 的更多消息,请访问他的网站 jackwallen.com。


via: http://www.techrepublic.com/article/what-fuchsia-could-mean-for-android/

作者:Jack Wallen 译者:geekpi 校对:jasminepeng

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

不管你是一位命令行大师,还是只是不想让你的朋友和家人使用你的 Android 设备,那就看下 T-UI Launcher 这个程序。Unix/Linux 用户一定会喜欢这个。

T-UI Launcher 是一个免费的轻量级 Android 程序,具有类似 Linux 的命令行界面,它可将你的普通 Android 设备变成一个完整的命令行界面。对于喜欢使用基于文本的界面的人来说,这是一个简单、快速、智能的启动器。

T-UI Launcher 功能

下面是一些重要的功能:

  • 第一次启动后展示快速使用指南。
  • 快速且可完全定制。
  • 提供自动补全菜单及快速、强大的别名系统。
  • 此外,提供预测建议,并提供有用的搜索功能。

它是免费的,你可以从 Google Play 商店下载并安装它,接着在 Android 设备中运行。

安装完成后,第一次启动时你会看到一个快速指南。阅读完成之后,你可以如下面那样使用简单的命令开始使用了。

T-UI Commandline Help Guide

T-UI 命令行帮助指南

要启动一个 app,只要输入几个字母,自动补全功能会在屏幕中展示可用的 app。接着点击你想打开的程序。

$ Telegram   ### 启动 telegram
$ WhatsApp   ### 启动 whatsapp
$ Chrome     ### 启动 chrome

T-UI Commandline Usage

T-UI 命令行使用

要浏览你的 Android 设备状态(电池电量、wifi、移动数据),输入:

$ status

Android Phone Status

Android 电话状态

其它的有用命令。

$ uninstall telegram                ### 卸载 telegram 
$ search [google, playstore, youtube, files]    ### 搜索在线应用或本地文件
$ wifi                      ### 打开或关闭 WIFI
$ cp Downloads/* Music              ### 从 Download 文件夹复制所有文件到 Music 文件夹
$ mv Downloads/* Music              ### 从 Download 文件夹移动所有文件到 Music 文件夹 

就是这样了!在本篇中,我们展示了一个带有类似 Linux CLI(命令界面)的简单而有用的 Android 程序,它可以将你的常规 Android 设备变成一个完整的命令行界面。尝试一下并在下面的评论栏分享你的想法。


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux 系统管理员和网络开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。


via: https://www.tecmint.com/t-ui-launcher-turns-android-device-into-linux-cli/

作者:Aaron Kili 译者:geekpi 校对:wxy

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

开始投入一件事比远离它更容易。 — Donald Rumsfeld

没有 Kotlin 的生活就像在触摸板上玩魔兽争霸 3。购买鼠标很简单,但如果你的新雇主不想让你在生产中使用 Kotlin,你该怎么办?

下面有一些选择。

  • 与你的产品负责人争取获得使用 Kotlin 的权利。
  • 使用 Kotlin 并且不告诉其他人因为你知道最好的东西是只适合你的。
  • 擦掉你的眼泪,自豪地使用 Java。

想象一下,你在和产品负责人的斗争中失败,作为一个专业的工程师,你不能在没有同意的情况下私自去使用那些时髦的技术。我知道这听起来非常恐怖,特别当你已经品尝到 Kotlin 的好处时,不过不要失去生活的信念。

在文章接下来的部分,我想简短地描述一些 Kotlin 的特征,使你通过一些知名的工具和库,可以应用到你的 Android 里的 Java 代码中去。对于 Kotlin 和 Java 的基本认识是需要的。

数据类

我想你肯定已经喜欢上 Kotlin 的数据类。对于你来说,得到 equals()hashCode()toString()copy() 这些是很容易的。具体来说,data 关键字还可以按照声明顺序生成对应于属性的 componentN() 函数。 它们用于解构声明。

data class Person(val name: String)
val (riddle) = Person("Peter")
println(riddle)

你知道什么会被打印出来吗?确实,它不会是从 Person 类的 toString() 返回的值。这是解构声明的作用,它赋值从 nameriddle。使用园括号 (riddle) 编译器知道它必须使用解构声明机制。

val (riddle): String = Person("Peter").component1()
println(riddle) // prints Peter)
这个代码没编译。它就是展示了构造声明怎么工作的。

正如你可以看到 data 关键字是一个超级有用的语言特性,所以你能做什么把它带到你的 Java 世界? 使用注释处理器并修改抽象语法树(Abstract Syntax Tree)。 如果你想更深入,请阅读文章末尾列出的文章(Project Lombok— Trick Explained)。

使用项目 Lombok 你可以实现 data关键字所提供的几乎相同的功能。 不幸的是,没有办法进行解构声明。

import lombok.Data;

@Data class Person {
    final String name;
}

@Data 注解生成 equals()hashCode()toString()。 此外,它为所有字段创建 getter,为所有非最终字段创建setter,并为所有必填字段(final)创建构造函数。 值得注意的是,Lombok 仅用于编译,因此库代码不会添加到您的最终的 .apk。

Lambda 表达式

Android 工程师有一个非常艰难的生活,因为 Android 中缺乏 Java 8 的特性,而且其中之一是 lambda 表达式。 Lambda 是很棒的,因为它们为你减少了成吨的样板。 你可以在回调和流中使用它们。 在 Kotlin 中,lambda 表达式是内置的,它们看起来比它们在 Java 中看起来好多了。 此外,lambda 的字节码可以直接插入到调用方法的字节码中,因此方法计数不会增加。 它可以使用内联函数。

button.setOnClickListener { println("Hello World") }

最近 Google 宣布在 Android 中支持 Java 8 的特性,由于 Jack 编译器,你可以在你的代码中使用 lambda。还要提及的是,它们在 API 23 或者更低的级别都可用。

button.setOnClickListener(view -> System.out.println("Hello World!"));

怎样使用它们?就只用添加下面几行到你的 build.gradle 文件中。

defaultConfig {
    jackOptions {
        enabled true
    }
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

如果你不喜欢用 Jack 编译器,或者你由于一些原因不能使用它,这里有一个不同的解决方案提供给你。Retrolambda 项目允许你在 Java 7,6 或者 5 上运行带有 lambda 表达式的 Java 8 代码,下面是设置过程。

dependencies {
    classpath 'me.tatarka:gradle-retrolambda:3.4.0'
}

apply plugin: 'me.tatarka.retrolambda'

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

正如我前面提到的,在 Kotlin 下的 lambda 内联函数不增加方法计数,但是如何在 Jack 或者 Retrolambda 下使用它们呢? 显然,它们不是没成本的,隐藏的成本如下。

该表展示了使用不同版本的 Retrolambda 和 Jack 编译器生成的方法数量。该比较结果来自 Jake Wharton 的“探索 Java 的隐藏成本” 技术讨论之中。

数据操作

Kotlin 引入了高阶函数作为流的替代。 当您必须将一组数据转换为另一组数据或过滤集合时,它们非常有用。

fun foo(persons: MutableList<Person>) {
    persons.filter { it.age >= 21 }
           .filter { it.name.startsWith("P") }
           .map { it.name }
           .sorted()
           .forEach(::println)
}

data class Person(val name: String, val age: Int)

流也由 Google 通过 Jack 编译器提供。 不幸的是,Jack 不使用 Lombok,因为它在编译代码时跳过生成中间的 .class 文件,而 Lombok 却依赖于这些文件。

void foo(List<Person> persons) {
    persons.stream()
           .filter(it -> it.getAge() >= 21)
           .filter(it -> it.getName().startsWith("P"))
           .map(Person::getName)
           .sorted()
           .forEach(System.out::println);
}

class Person {
    final private String name;
    final private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    String getName() { return name; }
    int getAge() { return age; }
}

这简直太好了,所以 catch 在哪里? 令人悲伤的是,流从 API 24 才可用。谷歌做了好事,但哪个应用程序有用 minSdkVersion = 24

幸运的是,Android 平台有一个很好的提供许多很棒的库的开源社区。Lightweight-Stream-API 就是其中的一个,它包含了 Java 7 及以下版本的基于迭代器的流实现。

import lombok.Data;
import com.annimon.stream.Stream;

void foo(List<Person> persons) {
    Stream.of(persons)
          .filter(it -> it.getAge() >= 21)
          .filter(it -> it.getName().startsWith("P"))
          .map(Person::getName)
          .sorted()
          .forEach(System.out::println);
}

@Data class Person {
    final String name;
    final int age;
}

上面的例子结合了 Lombok、Retrolambda 和 Lightweight-Stream-API,它看起来几乎和 Kotlin 一样棒。使用静态工厂方法允许您将任何 Iterable 转换为流,并对其应用 lambda,就像 Java 8 流一样。 将静态调用 Stream.of(persons) 包装为 Iterable 类型的扩展函数是完美的,但是 Java 不支持它。

扩展函数

扩展机制提供了向类添加功能而无需继承它的能力。 这个众所周知的概念非常适合 Android 世界,这就是 Kotlin 在该社区很受欢迎的原因。

有没有技术或魔术将扩展功能添加到你的 Java 工具箱? 因 Lombok,你可以使用它们作为一个实验功能。 根据 Lombok 文档的说明,他们想把它从实验状态移出,基本上没有什么变化的话很快。 让我们重构最后一个例子,并将 Stream.of(persons) 包装成扩展函数。

import lombok.Data;
import lombok.experimental.ExtensionMethod;

@ExtensionMethod(Streams.class)
public class Foo {
    void foo(List<Person> persons) {
        persons.toStream()
               .filter(it -> it.getAge() >= 21)
               .filter(it -> it.getName().startsWith("P"))
               .map(Person::getName)
               .sorted()
               .forEach(System.out::println);
    }
}

@Data class Person {
    final String name;
    final int age;
}

class Streams {
    static <T> Stream<T> toStream(List<T> list) {
        return Stream.of(list);
    }
}

所有的方法是 publicstatic 的,并且至少有一个参数的类型不是原始的,因而是扩展方法。 @ExtensionMethod 注解允许你指定一个包含你的扩展函数的类。 你也可以传递数组,而不是使用一个 .class 对象。


我完全知道我的一些想法是非常有争议的,特别是 Lombok,我也知道,有很多的库,可以使你的生活更轻松。请不要犹豫在评论里分享你的经验。干杯!


作者简介:

Coder and professional dreamer @ Grid Dynamics


via: https://medium.com/proandroiddev/living-android-without-kotlin-db7391a2b170

作者:Piotr Ślesarew 译者:DockerChen 校对:wxy

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

Anbox 以基于容器的方式,在像 Ubuntu 这样的常规的 GNU Linux 系统上启动一个完整的 Android 系统。

概述

Anbox 使用 Linux 命名空间(user、pid、uts、net、mount、ipc)来在容器中运行完整的 Android 系统,并在任何基于 GNU Linux 平台上提供 Android 应用。

容器内的 Android 无法直接访问任何硬件。所有硬件访问都通过主机上的 anbox 守护进程进行。我们重用基于 QEMU 的模拟器实现的 Android 中的 GL、ES 加速渲染。容器内的 Android 系统使用不同的管道与主机系统通信,并通过它发送所有硬件访问命令。

有关更多详细信息,请参考下文档:

Anbox 目前适合桌面使用,但也用在移动操作系统上,如 Ubuntu Touch、Sailfish OS 或 Lune OS。然而,由于 Android 程序的映射目前只针对桌面环境,因此还需要额外的工作来支持其他的用户界面。

Android 运行时环境带有一个基于 Android 开源项目镜像的最小自定义 Android 系统。所使用的镜像目前基于 Android 7.1.1。

安装

目前,安装过程包括一些添加额外组件到系统的步骤。包括:

  • 启用用于 binder 和 ashmen 的非发行的树外内核模块。
  • 使用 udev 规则为 /dev/binder 和 /dev/ashmem 设置正确权限。
  • 能够启动 Anbox 会话管理器作为用户会话的一个启动任务。

为了使这个过程尽可能简单,我们将必要的步骤绑定在一个 snap(见 https://snapcraft.io ) 中,称之为 “anbox-installer”。这个安装程序会执行所有必要的步骤。你可以在所有支持 snap 的系统运行下面的命令安装它。

$ snap install --classic anbox-installer

另外你可以通过下面的命令下载安装脚本。

$ wget https://raw.githubusercontent.com/anbox/anbox-installer/master/installer.sh -O anbox-installer

请注意,我们还不支持除所有 Linux 发行版。请查看下面的章节了解支持的发行版。

运行下面的命令进行安装。

$ anbox-installer

它会引导你完成安装过程。

注意: Anbox 目前处于 pre-alpha 开发状态。不要指望它具有生产环境你需要的所有功能。你肯定会遇到错误和崩溃。如果你遇到了,请不要犹豫并报告它们!

注意: Anbox snap 目前 完全没有约束,因此它只能从边缘渠道获取。正确的约束是我们想要在未来实现的,但由于 Anbox 的性质和复杂性,这不是一个简单的任务。

已支持的 Linux 发行版

目前我们官方支持下面的 Linux 发行版:

  • Ubuntu 16.04 (xenial)

未测试但可能支持的:

  • Ubuntu 14.04 (trusty)
  • Ubuntu 16.10 (yakkety)
  • Ubuntu 17.04 (zesty)

安装并运行 Android 程序

从源码构建

要构建 Anbox 运行时不需要特别了解什么,我们使用 cmake 作为构建系统。你的主机系统中应已有下面这些构建依赖:

  • libdbus
  • google-mock
  • google-test
  • libboost
  • libboost-filesystem
  • libboost-log
  • libboost-iostreams
  • libboost-program-options
  • libboost-system
  • libboost-test
  • libboost-thread
  • libcap
  • libdbus-cpp
  • mesa (libegl1, libgles2)
  • glib-2.0
  • libsdl2
  • libprotobuf
  • protobuf-compiler
  • lxc

在 Ubuntu 系统中你可以用下面的命令安装所有的依赖:

$ sudo apt install build-essential cmake cmake-data debhelper dbus \  
    google-mock libboost-dev libboost-filesystem-dev libboost-log-dev \  
    libboost-iostreams-dev libboost-program-options-dev libboost-system-dev \  
    libboost-test-dev libboost-thread-dev libcap-dev libdbus-1-dev \  
    libdbus-cpp-dev libegl1-mesa-dev libgles2-mesa-dev libglib2.0-dev \  
    libglm-dev libgtest-dev liblxc1 libproperties-cpp-dev libprotobuf-dev \  
    libsdl2-dev lxc-dev pkg-config protobuf-compiler

之后用下面的命令构建 Anbox:

$ mkdir build
$ cd build
$ cmake ..
$ make

一个简单的命令会将必要的二进制安装到你的系统中,如下。

$ make install

如果你想要构建 anbox snap,你可以按照下面的步骤:

$ mkdir android-images
$ cp /path/to/android.img android-images/android.img
$ snapcraft

结果会有一个 .snap 文件,你可以在支持 snap 的系统上安装。

$ snap install --dangerous --devmode anbox_1_amd64.snap

运行 Anbox

要从本地构建运行 Anbox ,你需要了解更多一点。请参考“运行时步骤”文档。

文档

在项目源代码的子目录下,你可以找到额外的关于 Anbox 的文档。

有兴趣可以看下:

报告 bug

如果你发现了一个 Anbox 问题,请提交 bug

取得联系

如果你想要与开发者联系,你可以在 FreeNode 中加入 #anbox 的 IRC 频道。

版权与许可

Anbox 重用了像 Android QEMU 模拟器这样的其他项目的代码。这些项目可在外部/带有许可声明的子目录中得到。

anbox 源码本身,如果没有在相关源码中声明其他的许可,默认是 GPLv3 许可。


via: https://github.com/anbox/anbox/blob/master/README.md

作者:Anbox 译者:geekpi 校对:jasminepeng

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