Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14048
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-15 14:13
个人简介

主要做 Mtk Android资料保存,不注明个人原创的情况下,都是转发他人文章。特此声明。

文章分类
文章存档

2014年(8)

我的朋友

分类: Android平台

2014-11-27 14:50:05




1. Android 整套体系中,Framework可以选择不开源,它就是放在/system分区那一堆东西,完全由Google开发,它使用Apache协议,开发者可以选择不开源这没错,但是Android运行在Linux Kernel 的版权不属于Google,(这个具体属于GNU还是linus torvalds本人,可以请更懂行请教一下),它是明确要求开源.当然Google ,也这么做了。小米这样做是违反了GPL协议的。
Android 看成一台汽车的话,kernel就是发动机,现在开发者要求公布是发动机设计,反对开源的人(我记忆里小米社区有一个长贴,以这里 )就说车身设计可以不开源。

2.早期的Linux的动态模块(ko)可以不开源,但这是个在新的GPLv2已经无法这样做了。
你们自己写一个Linux内核模块试试,只要使用内核原有函数,必须把模块协议设为GPL协议,否则编译报错。而编译好的ko的的协议信息,只要执行一下modinfo命令就能看得清清楚楚,@ 讲那种情况我见过,比如把nand flash的驱动做成nand.ko,这种情况跟小米一样,不开源也是违反协议的。

3.还有一种论点说硬件驱动写在HAL里的就能不开源了,比如有人那位说的中间层。这一条迷惑性很大。因为硬件产商使用HAL驱动有几种策略。

第一种策略,真觉的自己写的驱动金贵,实在不想给其它人一丝一点,可以在HAL通过Google在内核在加入pmem驱动直接对硬件IO进行操作。这样按Google 说法不开源。但是这样Linux版权方不干了,在内核加入这个pmem驱动这个木马等于绕开GPL协议了。争执的结果Google 内核源码被踢出了kernel.org服务器,Google 在自家服务器提供下载,大家各玩各的,所以这种做法是灰色地带。
我编译市面各种各样的Android设备有十多款,手机,平板,盒子的内核。发现所有硬件产家无一采用上面说的策略。无它,只有脑子被驴踢了产家才会用这种策略。
在内核里开发驱动远比开发那HAL驱动方便,有大量成熟工具可以使用。而且HAL开发只有logcat以及不断重启,(你一天重启几十次Android是作死的等待的啊)
芯片都有沿革,在Linux下积累了大量成熟的驱动代码,改改就能稳定工作。
所以现在产商都在在Linux内核开发驱动,简单的在HAL封装一下。这种情况,内核里那部分仍然要开源。
为什么不公开boot和kernel?
1」boot:很多嵌入式产品中boot会去检测/检验(crc/chucksum)BSP标志位或者是kernel等数据,这个是为什么有的时候我们需要刷入特定的boot才可以刷机成功。如果boot公开了,那么它的检验方式和检验值都可以得到并且去除这个验证流程。 其次,boot里面有对一些外设的初始化,这个有可能是公司自己开发的,这个也算是一种技术投入。而且这些驱动中会透露出引脚的连接。

2」kernel:kernel中一样有很多的驱动,当然大部分都可以做成模块的方式,而不是加入到kernel source tree中,但是我们平常的手机、平板大部分还是将驱动内建(built-in)到kernel中(linux下使用 ` find / -name *.ko 2>/devnull` 查找模块),这样子的话,他们如果要公开kernel代码,就意味这也需要公开这些驱动,而公开后,我们可以自己编译kernel甚至将驱动porting到其他版本的kernel或者内核(例如WinCE)。
同样的,公开驱动意味着公开了外设与SoC(理解为CPU,例如MTK的高通的芯片)的连接引脚,这个意味着为别人仿制类似产品提供了便利。某些手机有特有的传感器/外设,例如菊花的手机有一个红外的,如果公开代码,那么别人可以拿来用,省去了部分这一模块的软件开发成本。

除了上面说到了外,还有其他一些因素,例如某些Android嵌入式产品可以在几秒内启动到Home画面,这些都是可以通过改进boot和kernel以及Initramfs和Android来完成的,显然这个还是可以提高竞争力的。
但是这里插入说一下,GPL 协议是对『软件发布』这个行为进行限定的,所以,当你发布一个软件时,如果这个软件中受到了 GPL 协议限制,就可能需要开源,但如果你根本没有发布过软件,则无此限制。

为什么你不发布软件,GPL 就与你关系不大呢?因为所谓开源并不是象你所想象的那样,必须将源代码完全公开,而是:源代码必须与执行程序同步发布到相同的渠道。换句话说是这样,
  • 如果GPL软件发布给一个人,那么,这一个人获得该GPL软件的二进制执行程序的同时,必须能够有权获得对应源代码,其他没有获得程序的人无权索要源代码。(也就是说,只发布源代码不发布执行程序是可以的,只发布执行程序不发布源代码违反了GPL)
  • 如果该GPL软件发布给一个 100 人的封闭团体,那么,这 100 个人获得该GPL软件的二进制执行程序的同时,必须能够有权获得该GPL软件的源代码,而这 100 个人之外的其他人,无权索要源代码。
  • 如果该GPL软件发布给世界上所有人,那么,世界上所有人获得该GPL软件的二进制执行程序的同时,必须能够有权获得该GPL软件的源代码。
  • 如果除了你之外,任何人都无法得到这个 GPL 软件的二进制可执行程序,那么任何人也都无权得到这个 GPL 软件的源代码。(当然,如果作者主观愿意将源代码发布给他人,自然他人可以获得,不过他人无权索要)

如果一款手机从来没有发布过升级,从来都只是内置出厂程序,则你只能使用这个手机的界面,无法访问到该程序的二进制码本身,你无法得到手机软件的二进制可执行程序,所以你也同样无权得到这个软件的源代码。简而言之就是下面一句话:

小米的手机无论卖出多少台,他都不会违反 GPL ,但小米的 MIUI 只要有一个人下载,他就已经违反了 GPL。

至于说大多数 android 平板没有遵守 GPL 协议,我认为这个说法是错误的,因为平板本身不是软件,发布平板不等于发布软件,平板内部的软件的二进制执行文件本身,通常你无法直接访问,除非对平板进行破坏保修协议的逆向工程,否则用户无法直接获得并且复制分发该平板上软件的执行文件,这上面的软件严格意义上根本没有被发布。平板如果不独立发布其软件ROM,就无需受 GPL 约束。

好了,现在问题在于:小米有没有发布过软件?

回答当然是有的,MIUI 就是公开发布的,而小米的内置 ROM 也是在 MIUI 官网公开发布的,这都是非常明确的『发布』行为,只要存在了『发布』行为,就会受到 GPL 的约束。至于 MIUI 中哪些部分需要开源哪些部分不需要开源,这一点可以具体问题具体分析,但其中存在着需要开源的程序,这一点没有疑问。

那么,小米肯定需要开源一部分程序,这个没有疑问了,至于怎么逼迫小米公司开源,就要看你的目的是什么。既然你用了『逼迫』二字,从我的角度,我认为直接通知 FSF 可能是最省事的方式,所以,直接通知 FSF 吧,由他们决定采取什么方法。

另外提示一下:小米开源其源代码并不意味着你有权利得到它,因为,GPL 协议中的源代码只要求同对应的程序一同发布,也就是说,只有 MIUI 的受众有权力要求 MIUI 源代码,所以如果你手头没有 MIUI ,就没有权利找小米要求 MIUI 中的 GPL 源代码。

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

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

阅读(1753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~