研发工程师为你详解山寨机、品牌机和水货机(57)

  要保护手机厂商的软件代码的利益,只需把核心的驱动及其应用等代码保密即可。如果你是硬件厂商,希望你的硬件能在 Linux kernel 下运作,那么就必须要有驱动程序。如果驱动程序的程序代码公开,等于硬件规格也公开的差不多了。Android 的重点就是商业应用,所以Google采用了一些手法来绕过这问题。他们把驱动程序移到 “userspace”,也就是说,把驱动程序变成在 Linux kernel 上头跑,而不是一起跑的东西,这样就可以避过GPL。然后,在 kernel 这边开个小门,让本来不能直接控制到硬件的 “userspace” 程序也可以碰得到,这样只要把”开个小门”的程序代码公布就行啦。



  说得直白一点,就是Google玩了一个花招,在linux kernel和应用程序之间,自己做了一个中间层,这样就既不违反GPL许可,又能不让外界看到厂商的硬件驱动和应用程序的源码。

  里面的关键在于,Kernel和Android的许可证不一样,前者是GPL许可证,后者是Apache Software License(简称ASL)许可证。GPL许可证规定,对源码的任何修改都必须开源,所以Android开源了,因为它修改了Kernel。而ASL许可证规定,可以随意使用源码,不必开源,所以建筑在Android之上的硬件驱动和应用程序,都可以保持封闭。为了得到更多厂商的支持,Google有意选择了这样做,并且特意修改Kernel,使得原本应该包括在kernel中的某些功能,都被转移到了userspace之中,因此得以避开开源。



  鉴于此,前段时间,Linux Kernel的维护者Greg Kroah-Hartman宣布,将Android 代码从 Linux kernel 代码库中删除。这意味着,Linux Kernel的开发小组不认可Android的贡献。

  虽然如此,但是google的这种做法,的确给andriod的发展带来了很大的好处。然后,google的这种做法,除了底层,andriod的应用程序方面,基本都是JAVA语言编写的。说到JAVA,我在之前的帖子也提过,这是一种解释性的语言。用通俗点的话来说,如果用C或者C++这些语言编码并编译后在手机上运行,就等同于中国人直接用英文和美国人交流,不存在任何障碍,美国人理解起来就很快;而采用JAVA语言,则相当于你用中文和美国人交流,中间还得请个翻译官,你一边说中文,翻译官得一边翻译成英文。这样其速度自然就慢了下来了。所以andriod采用JAVA作为其应用程序的编程语言,虽然给程序的通用性及其移植性带来了好处,但是带来了一个问题,就是速度问题。不管JAVA的fans们如何鼓吹其好处,但在我看来,其速度问题是无论如何都不能和原生态的用C编译的程序的速度快的。拿凯立德导航软件来说,在andriod平台上运行凯立德,我个人感觉其速度的确远不如WM和SB系统的智能机。



  google毕竟是google,估计也看到了这一点,所以对andriod系统也在不断完善。好像是在去年,Google Android发布了NDK(Native Development Kit)。这使得某种程度上用C/C++开发andriod程序方便了很多。关于这个NDK,还得花多点时间才能讲述清楚,改天再继续吧。

日期:2010-09-13 22:31:07



  关于andriod系统的7寸上网本,我后面的帖子会进一步介绍一下。先继续andriod。

  Android NDK是什么,NDK:Native Develpment Kit.也就是原生态开发包的意思。



  众所周知,Android是基于Linux的支持,Android应用程序的运行环境主要是Dalvik虚拟机,开发语言主要就是JAVA。虽然开发语言是Java,但是我们总可以通过各种方式用C等语言开发。google提供的NDK就是这么一个接口。

  但是,在NDK文档中也有这样的描述:

  The NDK is *not* a good way to write generic native code that runs on Android devices. In particular, your applications should still be written in the Java programming language, handle Android system events appropriately to avoid the “Application Not Responding” dialog or deal with the Android application

  life-cycle.

  也就是说,Android的Application不能完全用C或者C++开发,其运行环境主要是Dalvik的JVM,而且NDK没有关于组件声明周期和事件处理的东西。



  NDK的原理大体就是Java中声明接口然后通过JNI(Java Native Interface )调用NDK开发的C和C++代码,文档中也提到,A good understanding of JNI is highly recommended。native code被静态编译为.so的模块,然后加载到.apk中,然后安装到 Android中运行。

  总而言之,就是不能用纯C开发andriod的应用,而是通过JAVA来调用。不过这也比之前全部java运行起来要好很多了。

  andriod的这些特征,我认为是短期内其游戏性能不能和iphone匹敌的重要原因之一。作为程序员,我个人不太喜欢JAVA,而比较喜欢用C,喜欢C指针自由操控一切,喜欢C编译后的机器目标代码,而不是解释性的代码交给虚拟机去解释运行。然而,个人的喜好是无法和google抗衡的,andriod终究还是对java情有独钟。

  不过,我估计这种游戏性能差的局面在后面的版本应该会有改善。特别是2.2版本,支持flash,这点将比iphone更具优势。说到andriod的版本,得再花点时间,改天继续吧。

-=||=-收藏

未经允许不得转载:云破天开 » 研发工程师为你详解山寨机、品牌机和水货机(57)

评论

9+4=