MADEYE

字节社 Android 客户端上线手记

字节社

经过半年的开发,字节社 Android 客户端今天正式上线了。这是继去年一系列项目之后我参与开发的第五款 Android App。与以往几个项目不同,这一次我有幸加入了唐茶这样一个如此 Cool 的创业团队,与唐茶的诸位合作完成了这次的项目。

「字节社」是由「唐茶」开发的一款手机上的阅读软件,支持 iOS 和 Android 设备。熟悉移动应用市场的朋友肯定会有这样一个疑问:为什么还要做一个已经被做烂掉的产品呢?关于这个问题,我不想在这里进行深入的讨论,有兴趣的同学可以去网上搜一搜唐茶计划总监李如一的说法。但从一个开发者的角度,其实原因很简单,因为之前的那些阅读软件做的还不够好,并且我们有能力做的更好。

关于如何做出最好的移动阅读应用,唐茶的思路很简单:从内容出发,以正版电子出版为依托,凭借优秀的界面设计,为用户提供最好的移动设备阅读体验。2011年以来,唐茶在 iOS 上获得的阶段性成果,很好的证明了唐茶的思路是可行的。当然了,在实际操作中唐茶也遇到了种种阻碍,特别是面对中文电子出版这样一个如此不成熟的市场时,某些理想主义的行为如同唐吉诃德冲向风车一般可笑。但正是对唐茶思路的理解和认同,才让我下定决心参与到这个项目中,负责字节社 Android 客户端的开发工作。

字节社

与唐茶的理想主义类似,唐茶的人员组成也显得非典型,甚至有些微妙。一半文科生,一半理科生,甚至可以说是一半文艺青年,一半 Nerd。好在文艺青年和 Nerd 在做出优雅的产品上并没有什么分歧,虽然偶尔也会发生一些奇妙的事情:比如「唐茶」如此文艺的团队名称,却配上了「字节社」(Byte Press)这般 Geek 专属的产品命名。

现在 Android 客户端已经正式上线,唐茶今年上线一千本正版电子书的目标眼看着就要达到。至于未来如何,怕是没人能下定论,但是我相信认真做出来的产品才有更大的机会得到市场的认可,理想主义的行为对于一个创业团队来说才是最重要的。

在 Android 应用中为 Webview 设置代理

因为项目的关系,需要在 Android 上实现一个支持 HTTP 代理的 Webview。一个较早的方案 可以很好的工作在 Android 2.3 及以下版本。而 3.0 之后,Android 在系统代理这一块做了较大的改动,前面所提到的方案已难以适用。

通过分析最新的 AOSP 源代码,这儿提供一个改进后的方案供各位参考。经测试可以正常兼容 ICS。

以下代码涉及到 Private API,请谨慎使用

代码见 这个 Gist

你所知道的一切都是错误的!

这是一篇译作,原文发表于 The memories of a Product Manager,记录的是 SPLASH’2011 上由 David Ungar 做的总结性发言。这是一番非常具有前瞻性的言论,至于究竟未来路在何方,请各位稍安勿躁,静观其变。

在这新世纪第一个十年的末尾,芯片制造商们正向我们展示着以众核(Many Core)为基础的未来:台式计算机的 CPU 将拥有成千的同构核心。

不同于云计算或者一般的分布式系统,新系统中核心之间通信的开销将会很小;同时与当下常见的多核系统不同,多达上千路的内存系统,更长的核内与核间连线,意味着核间同步(coherency)的开销将不再小到足以忽略。而如此这般的新架构意味着全新的编程方式。上个世纪80年代,编程模型开始由静态发展为动态,而今天我们也面临着类似的变革。

假如无法打破 Amdahl 定律 的限制,增加的那几百颗核心依然无法带来任何好处。因为哪怕程序中出现一小段的串行部分,都将意味着性能的极大损失。同样的,锁的机制(甚至包括一些 lock-free 的算法)也无法提供足够大的并行度。与之前由静态向动态的转变相似,我们现在需要的是一种全新的完全不存在同步机制的编程方式。

IBM 的 Renaissance 项目正在研究一种反同步锁的(anti-lock),数据竞争并修复的(race-and-repair),端到端不确定的(end-to-end nondeterministic)编程方式。作为种种努力中一部分,他们在一台配备了 64 核心 Tilera 芯片的 Smalltalk 系统上,基于动态语言做了一些有趣的实验。当我们决定放弃同步机制,同时我们也放弃了编程中的确定性。这可以看做是一种妥协,是性能与确定性之间的妥协,犹如静态类型检查与性能之间的妥协。

一个需要首先克服的障碍是:适用于众核系统的编程方式意味着,我们惯常认为的程序执行总能得到确定结果的假设将被破坏。实际上这种假设正强烈的影响着我们的编程方式与思维。可能一些搜索引擎的工程师们已经体会到了这一点,但对于其他绝大多数程序员来说,你所知道的一切都是错误的(Everything You Know Is Wrong)!