無標題文檔

Android 开发的昨天、今天和明天

收到过位将要毕业的同学的来信,问 Android 开发是否有「前途」。我个人从前端转到移动相关的工作也有些时日,虽然期间有点心得但回复类似的问题不免会有「误人子弟」的担忧。

刚好在 Android Weekly 上见到了这篇文章,阐述的部分观点竟然和我不谋而合,因此草译下权当有相关问题的同学作为参考。同时,国内的 Android 环境可以用「奇葩」来形容,因此文章后面我会加入些自己的个人观点。

混沌之初

很难相信,如此的一个系统竟然会有 80% 的市场占有量!在我个人看来,Android 能够做到如此成功在早期并不是它足够的优秀,而是同期的竞争对手做得比它更好。

为什么?我亲爱的读者,在那个时候到处都是问题好吗:

糟糕的开发工具(甚至包括 IDE)

你尝试过用铁锹修车吗?或者,开着你爷爷曾经使用过的有着 40 年历史的 Yugo 载着姑娘去兜风?在那个时代 Android 开发有且只有一个「相对」官方的开发工具:Eclipse 。

请您相信我,Eclipse 有各种的问题甚至能让你在十分钟之内发疯!Eclipse 的 ADT 插件简直就是「Bug 与 Crash 齐飞,重启和关闭共一色」。尤其在相对复杂的项目开发上,那酸爽简直不敢相信!

很大的程度上,光就是 Eclipse 这个开发工具就吓到了很多入门开发者,让他们投入其他开发阵营的怀抱(对,例如 XCode)。

碎片化

Android 的碎片化严重得可以用张麻子脸上的痘痘来形容,我们先来说说软件方面的。Gingerbread (2.3.7) 是相对比较老的系统版本了,对比同期的 iOS 4.x 系列,目前还有百分之 15-20 个点(可能具体地区的占有率稍有不同)。

您或许已经知道,Android 4.0(Ice Cream Sandwich) 是一个巨大革新的版本,新的 UI、新的 API、新的屏幕分辨率,这一切看起来非常的美好。但,缓慢的用户迁移过程让我们不得不面对这些优秀新系统特性的同时,同时还需要兼容那老旧的系统。于是为了兼容新老的两套系统,项目开发中多了非常多的兼容代码,这会使得应用到处是 Bug 和奔溃。

(这段译者自己添加,吐槽我最擅长了。)除了软件方面,硬件的碎片化的问题更加的严重。你甚至不了解你的应用会在什么样的硬件上运行,你需要获取用户的位置信息,对不起设备可能没有 GPS 甚至没有基站定位;你需要打开摄像头扫描二维码,对不起设备可能没有摄像头、即便有摄像头但运行内存不够,崩溃!这个时候用户是嫌弃自己的硬件呢,还是说您的应用有问题…

硬件方面最头疼的还是屏幕分辨率的问题,Android 开发过程中在资源(resource)目录下有各种的目录(drawable-xxhdpi、drawable-xhdpi、drawable-mhdpi、etc…),你需要针对不同的分辨率调整自己的资源文件,对相信我这块有时候会比编码的时间还长!

缓慢的模拟器

当你完成一个应用以后,首先要测试在各个不同 Android 版本以及屏幕分辨率下的运行情况,所以我们购置了不下二十台 Android 设备用于测试。

听起来似乎有点夸张?好吧,感谢上帝我们还有 Android 模拟器!

然后,你兴冲冲的跑去建立 Android 模拟器并尝试让它跑起来,你会发现半小时后你会哭!先不说它那缓慢的运行速度,就连调试过程中你甚至会开始思考你的人生。

从此以后你再也没有勇气打开运行过它,它只是成为你机子文件系统中一块占用地方的文件而已。

UI

「设计 Android 应用是多么得无趣!」如果你对比过同期的 iOS 应用,那么 Android 的应用竟然会如此得暗淡无色。对比 iOS 那流畅的动画、交互以及细节,你会觉得 Android 应用一切都是「静止」的!

当你打算给 Android 添加点生气的时候,你会发现还是那些老旧的系统(例如 Gingerbread)囚禁了你的创意和思想、乃至期望。

全新

我们将时间推倒 2013 年,这些糟糕的事情总算有了一些改变。

那个时候问题已经足够糟糕到连 Google 自己都看不下去的程度,即便 Android 4.0 发布至今对于上面的问题稍微有些缓解,但还不足够达到能够彻底解决问题的程度。

直到 Android 5.0(Lollipop) 的发布。

所有人都在思考 - Google、设备提供商、开发者。所有人都会自问这样的问题,就是「当我们有了个相对稳定的系统、上千万的应用以及对应的用户。那么我们应当如何让 Android 这个巨无霸化繁为简?如何将开发的过程变得优雅、吸引更多的人加入这个行列?」

Android 5.0(Lollipop) 有着巨大得改变,那些非常多的特性出于篇幅的考虑我只能列出我个人认为重要的几个点:

Android Studio

Android Studio 在 1.0 版本以后就变得非常的稳定。我无法从只言片语来描述这个应用能够给我们带来的巨大的变革。如果您愿意了解详细信息,可以参看原先我写的两篇文章(这里这里)。

The new Android Studio logo

这个 IDE 是如此的优秀,以至于 Eclipse ADT 插件已经停止了官方的维护,因此严重推荐原先如果开发 Android 的同学迁移到这个 IDE 上。

人生苦短、及时行乐。

Gradle

Gradle 是个全自动化的构建工具,在 Android Studio 已经全面替代了 Apache Ant 作为主要的构建系统。

这个全新的系统将会给构建 Android 应用带来全新的体验(听着耳熟?)。当您设置好构建配置脚本以后,所有剩下的事情都将不用你操心。

译者注:Gradle 在大陆使用建议还是需要挂代理,Sigh…

Lollipop

Google 说过 Lollipop 是有史以来变革最大的系统版本(每次它都这样说),我希望他们是对的。

同时,也希望目前的主流机型能够升级到这个版本(译者:个人觉得原文作者有些乐观)。

Lollipop 之外 - Material Design

理所当然,作为 Lollipop 提出的重点之一,自然会有很多的笔墨来阐述 Material Design 这个新的设计理念。我个人非常同意 Material Design 的其中之一的理念,那就是「所有的东西都是重要的(everything is important)」。

One animation, please

例如动画,长期以来我们的观点是动画只是 效果 的一部分,而 Material Design 主张动画也是有 含义 的,就好比文章分段的间隔符。

我们重新设计、重新开发符合 Material Design 的应用,最终的目的在于应用并不仅仅是生活的一部分,而是能像水和空气一样够让它融入到生活中的每处,让它无处不在。

这就为了以后即便在不同的平台下不同的应用看起来风格和体验也是统一的。

Lollipop 之内 - ART

对于 Material Design 提供的外在设计元素,我们开发人员最关注的还是其内在的改变。一个新的运行时(runtime system)称之为 ART 的就内在其中。

其实 ART 并不是新鲜事物,首次出现应该在 Android 4.4(Kitkat)中。我们之所以重新介绍它是因为在 Lollipop 中 ART 已经全面替代了 Dalvik 成为系统默认的运行时(runtime system)。

ART 有很多优秀的特性,处于篇幅考虑我只说明其中两点:

译注,针对这块下面有评论,可以参考

Note that ART still has the same 65k method limit. Multidex support applies to Dalvik as well.
As an addition to the improvements you mentioned, I would add the unit testing support they just released with version 1.1.0 of AS. Hopefully it's a fresh start for better testing of Android apps out of the box. It also works great with Robolectric.

到处都是 Android

现在我们已经可以开始针对智能手表、电视、甚至汽车编写应用。想象下我们坐下来煮上一杯热咖啡,环顾四周将来可能至少有四五个设备运行着 Android 系统:电视、笔记本、平板、相机、乃至厨房电器。

Android 开始逐渐占领所有具有微处理器的设备,犹如水和空气一般得存在。

逐渐高品质的智能手机

Android 的核心平台还是其智能手机这块,但长期以来一直所受的困扰就是运行其系统的智能手机品质差次不齐。老的 Anroid 设备运行起来对比其同时代的 iPhone 设备显得非常的卡顿 - iOS 却依然流畅得多。这「得益于」那些国产厂商提供的众多低端机型。(译者注:原文 This was especially true for cheaper devices produced by a multitude of Chinese manufacturers. 华强北再次被黑)。

值得庆幸的是随着硬件设备的摩尔定律,目前的 Android 智能手机设备提供商正在逐渐的改变这一现状。很可能在不远的将来,我们能够得到一台性能足够强大但同时性能不差的 Android 智能手机。

例如我个人非常喜欢 Motorola 提供的智能手机(虽然它目前已经是 Lenovo 的子公司),他们出品的 Moto X、Moto G、Moto E 等型号的手机都有着不俗的性价比。

Project Ara parts

同时有个叫 Ara 的项目能够提供类似 PC 的模块化硬件解决和组装方案,在未来相信 Android 智能手机硬件平台这块能够得到非常乐观的发展。

下一步?

远离 Java

当解决完系统和开发工具层面的问题以后,我们继续将 Android 相关的问题聚集到其他地方。

恕我直言,我认为针对 Android 最核心的问题将会是 Java,尤其是 Java6 或者 Java7。Java 是门非常的好的语言,但有时候我们可以考虑跳出这个圈子去思考 - 我们或许针对 Android 开发需要门更新的语言。

作为对比的 Apple ,他们的 Swift 提供了更新以及更现代的特性。这使得它能够支持 iOS 开发人员更便捷的开发应用。明显,Java 在这方面比现代的语言臃肿些。

是时候我们需要更新鲜点的内容了,目前其实已经有了针对 Java 的替代方案,例如我原先关注的 Groovy。它从语法方面和 Java 很接近(实际上它基于 Java),同时我们针对此开发已经有了些原型。 当然,还有别忘记了它是 Gradle 的主要实现语言 - 所以为什么不直接用于 Android 开发呢?

同时,Scala (使用数增长迅速)以及 Kotlin (这里有篇文章或许能让你热血澎湃)也是非常好的考虑对象。

更好的数据管理

还有个必须指出的问题,就是数据管理 API(database management API)。如果你有对比,例如 iOS(严格上说应该是 Core Data),他们提供了众多非常好的抽象方法(method)、图形化的数据管理、对象、数据观察者(database change listeners)等。对比 Android 提供的 API,这简直就像是只土鳖 - 我们仍然在写 SQL 语句并同时期望得到正确的结果。

调试 SQL 语句是件非常不容易的事情,首先需要面对的问题就是我们没有个直观的图形化界面去跟踪这些事务。虽然目前已经有些很优秀的 ORM 类库供我们使用(例如 GreenDAOActiveAndroid、或者 SugarORM),但实际上他们仍然各自有各自的问题。

我还是期待能够像 iOS 一样操作数据库,例如有个数据观察者(database change listeners)等类似工具帮忙。目前能够找到的就类似 DBFlow 等第三方的类库,至少目前而言他们能减少和减轻我很多工作量。

中国的情况(译者加)

很明显,国内的 Android 开发环境比国外的冷酷很多。除了上文提到的问题外,还有因为些政策以及特色的原因造成各种本地化的问题。

缺少 Google 组件包

或者说完全无法使用 Google 提供的服务。我们单说推送服务,Google 官方是提供了推送服务的,但是由于各种方面的原因国内的开发者基本上不会使用。这使得各家自己实现推送方案,从而恶性循环造成应用的品质下降。

无厘头的优化

国内的 Android 用户有「清理内存、杀进程」的习惯,因此很多正常运行的 Service 会被莫名得 kill 掉,而开发人员为了避免被 kill 又频繁的启动后台 Service ,恶性循环。

同时各固件厂商所做得优化有时候不得法,胡乱更改系统底层。例如某固件更改了 TextView 等导致应用显示「怪异」的情况时有出现。

设计方面 iOS 化

这点不用多言,Material Design 即便出来有些时日,但几乎没有跟进的迹象。甚至部分厂商提供的 Android 版本的应用无论从交互还是视觉上和 iOS 版本相差无几。

我个人很悲观的认为这种情况将会持续很久。

低端机型肆虐

正如原文作者所言,国产尤其是华强北出品的大批低端山寨机进一步打碎了 Android 系统的体验。想象下 Android 开发者开发的应用还需要面对的几年前的机型、这在 iOS 平台是无法想象的;同时这造成的巨大的资源浪费以及应用品质的下降。

总结

那么 Android 开发的出路在哪里?这个问题直到本文结束可能都没有个标准答案。我相信能够提供良好的 Android 体验的往往是些小型的开发团队,相比大公司的团队而言他们的创新思维、试错能力、反应能力会比巨无霸们更强更快。

而 Android 系统本身经过几个大版本的进化以后路线也逐渐的清晰,相信除去目前的智能手机领域外,在其他的平台上也会逐渐得发力。

这点,能看得到。

— EOF —

迁移到了 Digital Ocean 的新加坡节点

不知道现在还有没有人写博客,只知道很多曾经的链接都已经失效了,甚至域名都已经被废弃。

时间过得很快转眼本站点都快十年了,而我还仍然想偶尔写点东西,因为这已经是我的一种生活方式了。

用了一年多的美团云主机,谈不上优秀也谈不上失败。

只是,有点讨厌的就是他们的销售时不时的会打电话来,提醒我不是带宽被沾满了就是服务器的 CPU 过载了,其实在我看来就是铁了心的让我缴费升级 VPS 的配置,而我的那台机子上放置的也仅仅是几个 Blog 程序而已。

所以为了避免麻烦和骚扰,加之 美团云 的主机三月份就到期,于是更换 VPS 的念头就起来了。

选择来选择去,其实符合我要求的 VPS 其实没几家,剩下的无非就是 Linode、MediaTemplate 还有就是 Digital Ocean

最后选择 Digital Ocean 的原因其实很简单,因为性价比。五刀一个月的最基础版本的主机折合人民币也才一顿饭钱,加上现在原本已经冷却下来的中文博客圈流量已经不高,因此性能方面已经足够使用。

听网友的推荐,说 Digital Ocean 在国内综合来看就是 旧金山 的节点速度是最均衡的

网络速度

这个消息偏偏是我选择 新加坡 节点以后获得的,就目前测试的情况来看,Digital Ocean 的新加坡节点喜忧参半:喜的是联通和教育网访问 新加坡 节点似乎是通过日本访问,所以比较快速,而惨的就是国内的电信新路就哀鸿遍野了。

考虑先这个样子吧,因为工作的关系目前实在没时间去再投入这方面大量的精力,只能等到有时间再去处理这些事宜。

— EOF —

升级和改造 NAS 小记

自从多年前开始使用 NAS 存储和备份数据,就慢慢得养成了习惯越来越离不开它了。我使用的是群晖低端的 212J,由于仅仅是备份数据没有离线下载等需求,使用至今都没有出现过性能方面的顾虑。

这次考虑折腾 NAS 是从一开始升级硬盘说起。

选择硬盘

因为预算的问题,一直没有购买新的硬盘,使用的是原先移动硬盘拆下来的两块 320g 笔记本硬盘。

时光推进, 320g 的容量越来越明显感觉到捉襟见肘,加上原有的硬盘使用时间也比较长(从 09 年至今),因此更换硬盘的想法就提上了心头。

http://files.gracecode.com/2014_11_03/1415001492.jpg

http://files.gracecode.com/2014_11_03/1415001505.jpg

根据目前的行情,还是考虑购买了两个不同品牌的监控硬盘,分别是 希捷(Seagate)的 SV35 系列 和 西数(WD) 的 AV-GP 系列,容量都是 2T。

选择不同个品牌,是因为考虑同个品牌可能会同一个批次出现一样的问题。同时,不选择西数的红盘是因为 AV-GP 系列性价比稍微更高些而已(虽然只有 20 大洋)。

http://files.gracecode.com/2014_11_03/1415001468.png

后记:新的硬盘安装进去以后,发现工作温度希捷的稍微比西数的要高些。不过两者硬盘性能似乎没有区别,组 Raid1 运行相互之间不会有谁拖谁的后腿之说。

硬件&改造

NAS 属于不折腾的那种硬件,稳定第一。但由于通常都是放在不起眼的地方,灰尘和散热都是我所担心的,毕竟宝贵的数据全部在这小东西的肚子里。

群晖 212J 的原有风扇是 Y.S.Tech
的,从购买至今使用起来一直都很勤勤恳恳,对它唯一诟病的地方就是声音和振动都有点大
。思前想去,毕竟风扇是 NAS 唯一的主动散热设备,所以还是咬咬牙从淘宝上购买了
SANYO DENKI 的 9S 风扇(俗称「9S」)

这个风扇相信玩家都会认识,无论从风噪还是可靠性来讲都比原先的风扇好太多(当然价格也是原有风扇的两倍)。

http://files.gracecode.com/2014_11_03/1415001521.jpg

同时购买了快散热片加装到了原有主板的主控芯片上,其实这部没多大必要但装了也总比没有要好。

http://files.gracecode.com/2014_11_03/1415001568.jpg

http://files.gracecode.com/2014_11_03/1415001634.jpg

顺便给风扇加装了块滤尘网,同时在各个出风口上用双面胶粘贴了防尘垫,用于一般基本的防尘。最后,在安装硬盘的螺丝上加装了橡胶垫子,这里再次感谢下卖家的小心思,替我考虑得很周到。

经过这些步骤以后,重新合上盖子的时候感觉密封性更好了,希望能够使用得更久些。

迁移数据

恢复原有 Raid1 盘的内容并不轻松,我没有使用 Synology Hybrid RAID幸好没用,这玩意很坑),原先认为使用 USB 硬盘盒接上即可读取,发现行不通。

搜索了下,后来才知道群晖的 Raid1 是 Raid1 。于是将原先 NAS 的其中一块硬盘挂在 Linux 下。

先安装必要的软件

apt-get install mdadm lvm2

安装完成以后查看硬盘的分区

fdisk -l /dev/sdb

http://files.gracecode.com/2014_10_31/1414750074.png<br />

发现有几个分区块,先测试下最大得分区块

mdadm --examine /dev/sdb5

http://files.gracecode.com/2014_10_31/1414750097.png<br />

发现的确是软件 Raid1 分区,接下来映射成块设备

mdadm -A -R /dev/md9 /dev/sdb5

其实到达这一步,使用其他分区格式的可以直接使用 /dev/md9 设备 mount 到系统了,但是群晖使用了 LVM 分区,因此还需要多几个步骤。

vgscan && vgchange -ay vg1

激活逻辑卷,然后系统会提示你卷下有几个分区,然后用这些映射设备 mount 即可。

mount /dev/vg1/volume1 /media/hd

http://files.gracecode.com/2014_10_31/1414750111.png<br />

然后在 NAS 上开个 NFS 分区也一并 mount 过来就可以拷贝文件了。

后来发现有网友直接使用 NAS 的 Raid1 的恢复迁移数据,早知道这个方法会方便很多。

下面是些参考资料:

Tips

差不多是最后了,数据方面的迁移和保存毕竟是很谨慎的事情,下面总结下小的 Tips 也算是经验总结了。

接下来考虑是否购入台 UPS 将 NAS 接入到不间断电源中,出于预算考虑估计还得缓缓 :^)

-- eof --

更换倒车摄像头小记

可能是由于夏天雨季雨水多的缘故,原车的倒车影像开始非常的模糊,然后有天就突然的不工作了。本着省钱的心理作怪,决定先自己拆开看看到底是什么问题。

拆开摄像头很简单,原先就是使用卡扣卡上去的,稍微将卡扣掰下摄像头就能扯出来了。然而,看见原车摄像头腐蚀的情况,看来更换是难免的了。

因为摄像头的布线是隐藏在车的保险杠中的,因此需要拆除车子的保险杠,于是这工程量就大上去了。好在两厢车的保险杠还算好拆,后备箱的工具也够用。

因为同时还有倒车雷达的布线,所以暂时将倒车雷达关闭布线用胶布缠绕起来。为了安全起见防止别人追尾,顺手加上了个告示(有人说这是「此地无银三百两」)。

过了几天,在万能的淘宝上拍到的新摄像头到了。考虑到晚上视线不好的缘故,特地买了升级版本带红外的。

为了防止以后类似情况的发生,因此给裸露金属以及接线的部分加注了玻璃胶。

原车的布线由于已经安装好,更换摄像头也就是更换原来的线头,因此干活的过程中就没有记录下来。

接头部分为了加固我采用了焊锡点焊,同时使用防水胶布缠绕的办法。

这是晚上使用红外线摄像头的效果,可以看见外部环境已经丝毫没有任何灯光了,但是倒车摄像头还是很清晰。

至于价格方面,红外摄像头比普通摄像头贵个几十元钱,但对于安全和效果而言还是值得的。

顺便顺手给另外一侧的牌照灯也换成了 LED 的,这样子更耐用一点。稍微有点不尽如人意的地方,就是 LED 晚上牌照灯似乎有点太亮。

总的来讲更换倒车影像摄像头难度并不高,但是需要卸下后保险杠是个脏活累活。

下面列下需要用到的材料以及所购买的费用:

-- EOF --

WiFi-Duino 使用小结

年前的时候曾经使用 Arduino 做过个环境检测的小工具 ,总体来说效果都还可以。

后来刚好在点名时间上看见了个名叫
WiFi-Duino 的项目,大体来讲它就是
Arduino + Wifi 模块的集成控制板,刚好合计了下控制板加上 Wifi 模块的价格其实也差不多,因此就尝试购买了块。

不过,从十二月份下单到三月份我几乎都快忘记了这个事情,因此在前几天收到个莫名的邮包感到些意外,打开以后发现原来是它。

前言

邮包里面的内容很简单,除了一个用塑料袋包装的 WiFi-Duino 控制板以外别无他物。

或许是因为量产不多的缘故,硬件做工方面也是中规中矩,没有给人太多的惊喜。

我收到的是红色的 PCB 印刷电路板,和官网上图示的黑色电路板还是有些不同,但其他方面是一样的。

唯一感到让人不舒服的就是,电路板背面的触点没有用焊锡固定。虽然测试的情况上看并没有影响使用,但如果我想在生产环境使用我还是会考虑重新用焊锡固定这些触点。这块也想建议制作方能够注意下。

总得来讲板子可以做到很薄(我讨厌那厚重的电源插口),在一般的用电负荷下除去电源插口直接使用 Micro USB 口子供电,达到控制板的最薄应该不是什么问题。

基本使用

总的来讲,从硬件方面上说 WiFi-Duino 这块控制板可以认为是 Arduino
Leonardo
外加一块 Wifi 网络模块
,所以将 Arduino IDE 中控制板的类型设置为 Arduino Leonardo 以及选对响应的端口即可使用。

WiFi-Duino 的官方网站 可以获取相应的文档和示例代码。总的来讲代码放面还是比较清晰,同时可以根据自己的实际应用情况来精简类库。

可惜,唯一的不足就是 git 库中没有相应的 example 文件,因此你如果想要使用还是需要
自己从官方网站上复制粘贴。

将 WiFi-Duino 作为热点模式连接以后信号还是比较稳定,在十米范围内手机接收的信号强度都还是满格,一般家庭使用环境下应该已经足够满足。

后言

作为在校学生设计的作品个人觉得 WiFi-Duino 已经超出期望要求,想必以后在硬件做工、
软件类库等方面还需要进一步的完善下。

如果说 Arduino 降低了单片机开发的门槛,那么这块 WiFi-Duino 控制板将会降低
Arduino 无线网络连接解决方案的门槛。

不过,恐怕唯一的阻碍就是 169RMB
的价格在其他同类产品面前还是稍欠些竞争力,尤其是面对学生这样的人群。如果成本再降
下来一点,同时加大其他方面的竞争力,想必应该会有更好的前景。

无论如何,作为在校学生组成的团队能够克服或许诸多问题推出这样程度的产品,我还是满怀期待以及会继续支持他们以后的产品的。

-- eof --

我的照片

嗨!我叫「明城」,八零后、技术男、伪果粉、中医黑,宁波佬,现居杭州。

除了我的博客,同时也欢迎您访问我的 GitHubTwitterInstagram 主页。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 其实无所谓叫什么名字,因为我曾经为这个名字伤透了脑筋。最后想到的这个名字都没啥特别的,说到 底是因为我实在给它不了个非常酷的名字。

如果您想联系我,可以发我邮件 echo bHVja3lAZ3JhY2Vjb2RlLmNvbQo= | base64 --decode

文章

项目