G2 Magic ROM在G1上可用哦
更新: 放出下载,感谢 吹友吧 提供下载空间
下载链接
下载后把文件名改为update.zip,和一般的刷机一样刷就行
这两天好消息不断唉,不过我也是看到androidin.net的帖子才注意到的啦,那这里也帮他们打下广告
这些有许多图
http://www.androidin.net/read.php?tid=4799
原帖首发是在这里
http://forum.xda-developers.com/showthread.php?t=498026
Read more
最新的cupcake
更新: <讨论刷机及使用请至 该版面 >
请不要更新本版ROM,转用G2 Magic的ROM吧,见 本帖
0329更新,用旧版的部分代码结合进来,声音有用了,来短信有声音了。电话键和HOME键也有用了。不过还是接不了电话,挂不了电话
下载 QQ中转 提取码:c51b4468
QQ中转站下载 提取码:a1dd9fb2
因为这是编译版,不能改成update.zip就直接升级
1. 首先,你必须确定自己的机器是用test-keys的,如果你的机器买来时刷了国内做的中文版,就已经是test-keys的了。否则,就比较麻烦,可以参照这文章 http://www.androidin.net/read.php?tid=1320 一直进行到 “7、下面从网上下载最新的自制RC30 、RC8 和 ADP1 v1.3 版” 这步前为止。检验是不是test-keys版本,也在上面有提及,HOME键+开机启动键启动机器,按alt+L,看顶端是不是提示使用的test-keys。总体来说,这步是最复杂的
Android源码中开始出现拼音输入法的代码了
三小时前的更新
http://android.git.kernel.org/?p=platform/packages/providers/Pinyin.git;a=summary
http://android.git.kernel.org/?p=platform/packages/inputmethods/OpenWnn.git;a=summary
我打算马上试一试可不可以用:)
不过他们太土了,把Pinyin扔到providers目录下了。
使用G1感受 – 第一天
我没打算写连载的,只是先写下这一天半用下来的感受。这机器去年上市后就买,不太记得清几月了,反正很久了。可是一直只是偶尔开发时玩玩,我本来就不太喜欢这样子,还有侧开键盘。这次手机坏了,是想着就强迫着试用下吧。第一天多下来,感觉是,这东西真是个垃圾,我快受不了了,对它完全没有爱。
有些很好笑的问题,比如来电时,声音先响,近三秒后屏才亮,刚用我又分不出是短信还是电话,就按红键开屏,就每次都把电话挂了。短信程序中,没有地方给当前对话者发起通话,只能再去电话本找。电话本不知道按什么排序的,中文排序很混乱,GB2312区默认是拼音排序的,在这上面竟然不是,我都不知道它怎么实现的,当然,更不可能支持拼音检索,这点来说,还远不如OMS,不过这本来还没考虑中国部分,也就算了。联系人中有个Favorites页,会根据最近联系或是联系次数或者是加星来显示一些系统自认为是常用的联系人,可是这个列表没办法清除,更没办法只清掉其中一个人。这种暴露隐私的东西,也不适合中国人用。
然后电力很弱,wifi,自动同步全开着,将近每个钟头10%的电力消耗。还有,禁用wifi,关掉自动同步,gprs就一直连着,都不知道是什么程序在访问网络,也关不了。就算只用英文输入,光标移动感觉很差,手指定位基本没希望,可是输几个字还用到小球,也很烦心。关掉自动同步后,GMail里发邮件,竟然一直显示着Sending,我还以为gprs联网有问题。必须要自己refresh或者重开自动同步才行,这种行为真难以理解。
系统不自带记事本,临时想起要用还得去Market上载一个。这是我知道的智能手机平台里唯一一个不build in进记事本的平台。
很多问题,看起来都是很小的问题,真用起来,很让人抓狂。我还是个几乎不用手机听歌和拍照的人,不然估计还有能抱怨的。
反正,我就是在想,是不是很多人买来就放抽屉的。至少我朋友里有五六个是这样的。不像iPhone,当初不能输中文时,大家还是用很开心。G1当备用机都嫌烂到家。
Android中要小心的一种内存泄露
今天把android-developers blog上的一些文章看了下,有篇文章《Avoiding memory leaks》虽然以前也扫了眼,今天再看了一遍,觉得好bt啊。
private static Drawable sBackground; @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText("Leaks are bad"); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground); setContentView(label); }
这段代码看得出会内存泄露么?按文中解释说,因为setBackgroundDrawable时,会在Drawable中把label这个TextView设为callBack,就是说Drawable中对label有引用,而label中对当前Activity的Context也有引用。所以当转屏时,系统自动重新建立UI时,原有的整个activity都不能被回收。
作为一个普通的Java程序员,真的能想到这个么?文档里也没有提示过,没看到这篇文章,又没自己去看Drawable的源代码的开发者,怎么能猜到这个。至少在我第一印象中,我是觉得Drawable对象只是类似于Image的一类对象。系统竟然在我不注意的时候自动设置了callBack。唉,我得检查检查自己的代码中有没有这样的问题了。我不知道除了这个Drawable外,还有没有其它类似的东西,真是防不胜防啊
03-15增: 不过我想了下,好像也有点不对啊
当第二次重设label.setBackgroundDrawable(sBackground);时,应该是把sBackground的
callBack改回成当前的label啦。那这时gc不就应该能工作么
Android 是一个好的选择么?(草稿)
还是草稿版本,可能不少bug,待修改完善
前两天在Cnbeta上看到一篇文章 《Symbian:Google Android开源只是幌子》,我是有同感的。前阵子给一家国外运营商做关于定制Android的咨询,顺便就仔细想了下这个问题,加上在水木MobileDev版的讨论,打算总结一下问题。不过这个坑比较大,估计会有很多拍砖的。
首先从用户角度看,Android有什么优势呢?Google的业务吧,好用的GMail客户端,和Google帐户同步联系人,日历。但是Google最近发布了其它几个手机平台的软件,也支持了类似的功能。从硬件角度来看,我觉得至少目前仅有的一款G1体验是不如iPhone的,屏幕表现,操作手感都是不如的。优势是多了一个实体键盘。作为Palm Treo的fans,我是不太喜欢侧推键盘的。对于普通用户来说,虽然有了实体键盘,可是至今的官方升级中还不包括软键盘,输入操作都必须推开键盘才可以,这点很不方便。而对于中国用户来说,字体只支持到GB2312,很多字显示成方块。没有中文输入法,即使复制中文字进短信程序,发送后对方也显示不正常。所以不得不用第三方的短信程序。再说价格,标榜为免费的开源的操作系统,android的手机真的便宜么?德国刚上的G1非签约价是499欧。价格上面并没有体现出什么优势来。
从开发者角度来看。如果你只是一个开源爱好者,喜欢研究研究这种大型项目,看看代码,这个长处我是不否认的。如果你是靠写代码过活的,那我们来看看。我觉得一个很大的优势是,Google学习Apple推出了Google Market。这无疑将可能是一个赚钱的好途径。不过收费项目才上来两周,不好说情况怎么样。但是我个人预期,它是远不如iPhone平台的。首先,用户群不同。Apple从来都有较好的用户群,相对来说更愿意花钱。就好像Mac上程序一般都体积很大,但它的用户不像windows用户会去抱怨开发者,而是会考虑是不是该升级成更大的硬盘。简单的说,Apple fans更偏向于怎么从非技术角度考虑,让事情尽快解决,那么,花钱能解决的问题大约就不是大问题了。何况升级点小硬件,买个小软件也不是什么大钱。相反的,Google fans大多比较geek。对技术有追求,哪天发现Google搜索不如百度好用了,这个例子可能不好,或者说出了个什么更先进点的搜索,立马会换过去,还会作为一个新发现介绍给朋友。就好像曾经Google搜索本身就是口口相传推广开的。Apple则看重品牌些。对于新出的apple产品,甚至没见过,就会想买。就是说,google本身的用户粘性不太好,只是gmail一类应用,由于用户数据在上面,是用户自己的数据把自己缠上了而已。另外,这个用户群,都多少有些技术,或者说IT方面的知识背景。于是,这些用户可以更容易的去获得盗版,破解。iPhone限制相对比较死,还得先破解下机器才能装破解的软件。Android是支持从电脑上直接装的。说完用户群,再讲竞争关系。这其实是我第一反应想到的。Google吸引了更大一批编程爱好者,Android有更容易上手的开发环境以及需要更少的基础知识。Objective-C再简单,对大多数人来讲,也是一门新语言,Java是很多学校的基础课,Java开发者满大街都是。新手写软件,一般都是免费的。所以Android上会有大量的免费软件。曾经我做Palm上的开发,入门时也写了不少免费软件,渐渐的,有了基础后,开始做一些收费软件。这个圈子里,能做这个的不算多,所以开发出的软件能够有市场。作为新手,学写软件其实有个目标最重要,我建议,并且相信不少人的想法也是,找个现有的软件,做个一样的出来。人家要是也是免费的,可能你会觉得做的意义就不大了,所以不如找个收费软件,学着做个免费的出来,这样至少有不少人捧捧场,鼓励下,就更有动力继续了。可是Android上,会有源源不断的新手加入进来,它的门槛实在太低,至少它没要求你必须先买台苹果电脑才能做开发一样。而且吧,Google吸引的开发者中,本身就很多喜欢开源精神的,我不能说这不好,但我个人不喜欢的。培养整个群体对软件应当收费的认识,作为一个开发者,你自己做的软件去收费才心安理得。其实这对用户也不好。比如出现了一大堆练手的做的理财软件,功能都不是非常完善,但都凑和能用。不少用户会退而选择免费软件。于是,真正做好的软件的开发商相对来说收益就有减少,可能继续开发动力也不大。这是一个恶性循环啦。
有人说,平台完全开源,于是不会像微软和Apple那样,保留很多内部API不对外开放。我要说,你一定是不够了解Android。Android有大量内部包和内部类,打了@hide标签,于是不在最终SDK中出现。这些API你当然可以看到,因为它是开源的,可是你又用不了。不信你去看看com.android.internal开头的包。内嵌的程序有用这些API,你用SDK时是不能使用的。人家的理由也很正当,这些API可能随时会变,你去使用这些是不稳定的,所以干脆不让你用好了。说到这里,顺便说下,这个平台的更新过于频繁,G1上市也谈不上很久,RC15, RC29, RC30, RC33一堆升级包出来了。确实每次都可能伴随着内部类的变化,让你也不敢去使用。还不如WM每个版本稳定好一阵子,那些偷偷发现的未公开类也可以放心地使用好一阵子。有些未公开类,M$知道大家用了,为了兼容性,不得不在以后版本也保持兼容,而不去改动接口。Google冠冕堂皇地说,这些API本来就公开了,也说明将来会变的,早说你们不该用。理由看起来还更充分一些。
那么,平台开源了,API实现都能看到了,至少对开发更有帮助吧?不见得。你是更愿意有好的文档和示例清清楚楚写明用法呢,还是打算自己去看源代码自己了解下怎么使用呢?Google的文档远比不上MSDN的。光看TextView的文档,看setText的API说明,你能猜到这个东西竟然是支持文字着色,字体改变,加链接,甚至能在TextView中嵌入图片的么?而且,不是谁都有时间去研究那一大堆代码的。很多情况下,大家不过也是打打工混口饭吃,老板给个活,按要求完成就行了。本来不外乎看看文档,调用下API,能跑了就交差了。这下好了,文档看不明白,只能去看看怎么实现的了。Android还真是个大项目,不说底层和native c lib部分,光Java framework要有个了解,也得先研究两天。不是说程序员就得是技术爱好者的。
然后,说说Android平台本身。开源不等于开放。就我感觉来看,智能平台上,除了blackberry,估计就android限制最多了,可能用词不准确,因为人家不是故意限制,就是没有设计能让你去做到而已,反正意思就是你能做的事情被限制住了。iPhone虽然提供的接口也限制很大,但至少在越狱后,用第三方的头文件,还是可以做到的,并且确实也有不少用户是越狱过的。比如说中文输入法就一度(我不确定现在行不行)在原生iPhone上是安装不了的。举例来说吧,如果是一个非当前前台的程序,你没有能力去得到整个屏幕的句柄。于是很常见的来电归属地功能就不太好实现。Palm, Symbian, WM上人家都可以直接获得系统的Window,直接绘制个字符串上去,android上说,这有安全问题,从来没有打算让你这么做。再比如,WM和Symbian的Idle screen,就是桌面啦,WM上叫Today的那一屏,都是支持plugin。Android的Launcher就不支持,也不支持html widget应用,现有的那个虽然有添加widget,但那都是内置写死的小控件。这点上来说,应该不是故意不让你实现,估计是人家自己都没想到好的解决方案吧。虽然Intent机制可以实现大多plugin功能,但是这种需要自己处理绘制,用户操作事件的,就是想内嵌一个View进另一个程序的,目前好像还没看到解决方案。更不用说,我一直很喜欢的Palm上的“开放性”,你可以处理全局所有的用户事件,拦截处理掉本该给其它程序的事件,这样可以做出很多扩展功能来,像DA一类增强性的,都有点像hack了系统一样。Android有它的安全性考虑。安全性和扩展性大概是有点矛盾的吧。只是,限制得这么死,我觉得开发者的乐趣就少了很多。一般印象中,开源的产品,你觉得不满意,当然可以自己改。作为开发者,你拥有所有代码,你当然可以改,把上面说到的功能点都按自己期望的给做出来,改完后编译出新的ROM烧到自己机器上。可是这只能是给自己玩的而已。难道想发布一个绘制屏幕的来电归属地,就需要让用户自己刷一次机器?
前面说了,对于Java开发者来说,Android入门的门槛很低。但会是一回事儿,做好是另一回事儿。如果你已经熟练使用Java,并且深谙OO(面向对象)之道,那么,你需要好好改改习惯,看看android performance best practice,很多优化是反OO的。比如说,建议你最好直接访问对象的值,而不是用getXXX, setXXX这种方式。那么,如果你熟练了android开发,但按它的思路做,找新的非android开发的java职位时,也得重新准备准备,不然可能过不了笔试面试的基础知识关。
Google的SDK是Java sdk,虽然完全开源了,但仍然没有提供方便的写jni,以及native code lib工具。Google说,那是不需要的,你用Java写应用程序就好了。事实上呢?听说前阵子内部开发分支上的英文输入法,原来是纯Java的,最近一次更新,也改用jni实现了。还有据说,Google打算出个编辑txt文件的记事本工具,也打算用jni实现。说明android里的java效率也不是那么好的。当然,如果你只是一个很普通的应用,应该是可以接受的。曾经android刚出来的时候,有个Quake游戏运行的demo也很有名,事实上,那东西里主要还是c代码。
再来看看运营商和制造商。一般的,运营商要求也不是很多,改个主题显示下品牌,加点自有的服务进去就行了。不幸的,android连主题都不能支持,WM, Symbian一直以来都是支持的。为了改变android的主题,还需要改framework,缺点后面讲。加点应用程序一般不是什么问题。但像HTC做WM,把很多内置程序也换了,像电话本甚至浏览器。不得不说,android这点也是不如WM的。Google07年刚发布Android时,介绍就说,你可以替换任何程序,电话本,桌面,等等。事实上,对于手机制造商和运营商也确实是有这个能力。但是Android老是升级,变化又大,这些内置的程序和系统关联大。每次系统升级,都很有可能会伴随着这些程序的变化。如果厂商自己做了更改,就需要不停地有人去维护这些代码,保持和最新android的兼容。即使merge code的工作量谈不上很大。但是作为一个大量发布的产品,是需要严格的测试的。那么,有的厂商用原生的android出的系统,比如G1,如果你改了很多程序,虽然google新的代码有可能会同时提供给所有厂商,但是你就多了merge code和测试这部分工作,少说也要一两周。那么,你的新rom的发布就会比其它厂商慢。而前面也说过,android的用户是比较geek的,有追新软件一类的癖好,久而久之,用户就可能不喜欢你这种方式,转而用原生的android系统去。前面说的,运营商想改个主题要改framework也是一个道理,这种改动,是需要经常的和google merge code,紧跟发布的。还有点不是很相关的是,因为android开源,所以大佬们都会以为是自己的好机会,目前知道的,个别运营商和制造商都有打算在自己发布的android机器上放上自己的app store。那么,作为开发者来说,你们有得忙了,乐观点看,只是要在不同的平台上发布自己的软件,更糟的情况是,可能各家的SDK都有点变化,你还需要为各款机器做兼容性测试,就像非业内人士都误信j2me可以很好跨手机平台,事实上,几乎要为各款机器做点改动,适应不同分辨率一类的问题。
还有点,android至今仍不是很成熟。一月的新代码里,短信程序才支持发送中文字符,至今官方升级还没有软键盘,更没有输入法框架,做不了输入法。CDMA分支也在开发中。作为厂商,比如你想出款CDMA机器,或想出款适合中国人用的机器,那么你就需要对系统内部做不少改动。那么你将来有长期地维护工作,merge code,以便和android保持兼容。更糟糕的情况可能是,比如你自己费了半年时间,加进了CDMA支持,后来google也终于完成它的cdma支持了,那你打算直接用它的代码,还是维护自己旧的呢?目前看起来,甚至连OHA成员提交的代码merge进主分支都很困难,这也是说android开源不开放的一个原因。
讨论部分完毕。那么android开源了,怎么去利用这个好处呢?而且它的授权协议很好,是Apache license,你改了也不用必须再开源。曾经,大家都认为这是山寨厂商的好机会。现在想来,其实不是。Android怎么说也是智能平台,对硬件配置要求不低,一般来说,成本不可能低于一千。那么,这就和传统的山寨厂商的目标群体的接受度不同。大家觉得android对山寨厂商利好,无非是觉得这个平台免费,成本可以压低。事实上,国内的山寨厂做Windows Mobile的机器时,也是不交钱的~ 而真对于大厂商的好机器来说,到最终用户手上,一款三四千的机器,相差这么两百块钱授权费用,用户又不知道是哪里省出来的,也不是非常在意的。大厂商为了保持和android官方版本兼容性,也不敢大改动。我曾经有个想法就是,反正山寨厂商也从来不在意什么协议。拿android改个好用点平台出来,多加些内置软件,就算不发布SDK,不再支持第三方程序,也会受欢迎。比如说,android上有好的浏览器。山寨厂商可以完全把界面改得和iPhone一模一样,现有的仿iPhone机器大多基于MTK一类,由于平台本身比较弱,也学不得很像,比如那个浏览器就学不来。Android自身又由于苹果专利,没有在G1上打开多点触摸支持,山寨厂可以不管这些。不过现在看来,可惜受限于前面提及的成本问题,估计用户也没兴趣了,何必花一千多买个没扩展性的机器呢。
(Mar. 02增)今天和朋友聊天,我觉得其实腾讯拿android来改改,再找家ODM厂商,出款自己的定制机会不错。反正Android上嵌的几个Google应用,除了GMap,腾讯都有对应的业务,替换了就是了。还能加上自己的游戏,Android平台相对来说开发容易些,又是大屏,对QQ游戏来讲,还算是个易于移植的平台。
总的来讲,我是不看好android的。
用上cupcake了
嘿嘿,实在太无聊了,就想着试试看。很简单,最新的build,01/24的,已经大部分程序汉化了,自带短信也能正常发送中文了,输入法框架也已经有了,可惜原来我移植上去的A4不能正常工作了。在locale中直接加入了中文选项,比起国内一些直接把默认英文状态的字符串给汉化了的土鳖办法还是正统得多了。
嗯,看起来这手机基本上要可用了
想自己编译和刷机的参考以下
http://forum.xda-developers.com/showthread.php?t=462512
http://sites.google.com/a/android.com/opensource/documentation/building-for-dream
最后一个链接比较重要,需要手工merge进两个还没有被通过的补丁,以使wifi可以正常工作。
自带有个英文输入的软键盘,还没有看到中文输入法,这两天有空我把A4移植过来吧。
Android platform study tips
Belows are some tips for getting/building/patching android source code.
1. Getting source
I’m not sure if you could download source code fast, if yes, skip this. But it took me more than 10 hours to finish getting the source code. The main git server limits to 3 connections from 1 IP address, so you can repo sync 3 projects together. For me, I start “repo sync”, “repo sync kernel” and “repo sync prebuilt” together, for the kernel and prebuilt projects are larger, and they could finish before repo sync touch them. Well, you can also start “repo sync external/webkit” first, for it’s not from the git server.
2. Building source
Added on 11-03, 2008. Today I installed a clean Ubuntu Linux 8.10, and did these steps to prepare the installation
$ sudo apt-get install git-core gnupg
$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install valgrind
(this step is optional, its size is about 22M)
$ sudo apt-get install python2.5
$ sudo apt-get install sun-java5-jdk
Warning: Do not use sun-java6-jdk,or you will meet below error when you do “make sdk”
Docs droiddoc: out/target/common/docs/dx
javadoc: error – In doclet class DroidDoc, method start has thrown an
exception java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for
sun.util.resources.OpenListResourceBundle not found
In the document, it says run “make” in the root path of the android code. The result of “make” is generating system.img. For getting the whole runnable sdk, you can run “make sdk”. The sdk will be putted in out/host/YOUR_OS/sdk/. By the way, it’s said “make -j2″ may make it faster.
You can enable CCACHE with
export USE_CCACHE=1
Pls also set a cache dir with “export CCACHE_DIR=YOUR_CACHE_DIR”
After once make the whole projects, if you modify some code, you do not need to re-compile the whole projects with “make”. Run
$. build/envsetup.sh
in the android source code dir. And you can use “mmm” command to compile a project. Like “mmm packages/apps/Contacts”. Well, if you change some code like frameworks/base/core/java/android/widget/ListView.java, you need to run “mmm frameworks/base”, for only frameworks/base is a project, others are only part of this project. There would be a file named “Android.mk” under the root of a project.
Today, I tried to fix some bug in Contacts application. For testing the changes, if you run “make && make sdk” again, it would take a long time. You can easily do as I did:
1. Modify code
2. $mmm packages/apps/Contacts
If there’re compiling errors, go back to 1
3. make snod
With this command, it will build a new system.img very quickly.
4. $cp out/target/product/generic/system.img out/host/YOUR_OS/sdk/YOUR_SDK_PATH/tools/lib/images/
5. $out/host/YOUR_OS/sdk/YOUR_SDK_PATH/tools/emulator -wipe-data
It took about 2 minutes for me on my macbook pro with 2GHz CPU.
Well, you cannot use “make snod” for all the situations. It would not check the dependences. If you change some code in the framework which will effect other applications, please use a clean make.
3. Project layout
Most of the classes you see in the android sdk reference are in frameworks/base/core/java
And the resources like android.R.layout.simple_list_item_1 is defined in frameworks/base/core/res/res/layout
Build in applications are in packages/apps
To be continued..
Android源码研究Tips
从去年12月开始写Android程序开始,都差不多快一年了。上月Google终于公开了Android的较完整的源码。最近几天,闲来无事时就给他们提交一些补丁。
这里讲一些开发中的技巧,或许对大家有帮助,转载请注明出处:
下载源码
首先一个问题是http://source.android.com/在国内访问有时,甚至是大多时候,是有问题的。那么怎么翻墙就需要大家自己解决了。其实只是为了看源码的话,问题并不大,源码更新的站点还是可以正常连接的,但是如果有打算要提交patch,那么用tor都有些麻烦,我是找了个VPN出去的。获取源码请参照
http://source.android.com/download
嗯,我这里也可以给一些简单的步骤介绍吧:
1. 你的系统需要是Linux或者是Mac OS X。需要先安装git-core和gnupg,在Debian/Ubuntu Linux上,可以用apt-get获取,Mac上使用Macports吧。额外的,在mac上你需要先安装XCode 2.4以上版本,另外再用macports安装gmake, libsdl。 事实上编译期还会有问题,这在http://source.android.com/download页文档中没有提及,缺失ncursor和zlib库,也需要单独安装(这个在mail list里有讨论,或许我晚些可以补全些)。
2008-11-03 补 正好干净安装了Ubuntu Linux 8.10记录一下需要的东西
注意可能blog中会自动折行,请以$来区分新行
$ sudo apt-get install git-core gnupg (gnupg实际已自带)
$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install valgrind (可选,有21M大,我觉得一般人是用不到的)
$ sudo apt-get install python2.5 (实际上不用装,Ubuntu 8.10已经自带)
$ sudo apt-get install sun-java5-jdk
注意,不要用 sun-java6-jdk, 不然在make sdk,具体来说是make doc这一步中,遇到这个错误:
Docs droiddoc: out/target/common/docs/dx
javadoc: error – In doclet class DroidDoc, method start has thrown an
exception java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for
sun.util.resources.OpenListResourceBundle not found
2. 下载repo脚本,放到/bin目录下,加上可执行权限
$ curl http://android.git.kernel.org/repo > repo
$ sudo mv repo /bin
$ sudo chmod a+x /bin/repo
其实文档中是把这个放在个人用户的~/bin目录下,但是要改PATH,我嫌麻烦而已就放/bin下了
3. 创建一个放置源码的文件夹,如叫myandroid。这里要注意下,需要区分大小写的分区,Linux下一般是用ext3的,是符合要求的,而mac下默认的分区是不区分大小写的,请自行创建分区。但是事实上,我以前测试过,在非大小写敏感分区上,直接make会报错,但修改Makefile后直接跳过检查这一步,最终是可以成功编译的。
4. 在myandroid目录中执行
$ repo init -u git://android.git.kernel.org/platform/manifest.git
中间会提示输入电子邮件什么的,如果你打算要提交patch的话,用google accounts注册过的邮箱
5. 在myandroid中执行 repo sync就可以开始下载源码了
但是这一步非常慢,这里有些文档中没有的技巧了:
测试发现,主站点是限三线程连接的,也就是说你可以同时开三个窗口做不同部分下载,
我建议是第一个窗口直接执行repo sync,第二个窗口执行repo sync kernel,第三个窗口执行repo sync prebuilt
因为kernel和prebuilt这两个工程比较大。
有时因为多次频繁连接,会有服务器端拒绝连接的错误,此时等两三分钟再重试就好了
repo的使用请看repo help。如果只是要学习源码的话,那只用repo sync一个命令就行。repo sync不带参数的话会更新所有子项目,可以repo sync project_path来指定更新项目。 那么project_path在哪可以找到呢?myandroid/.repo/manifests/default.xml (你至少需要先repo init过才有这些东西)
编译源码
当repo sync全部完毕时,进入myandroid目录,首先执行make,大约会耗时一个小时左右(在我的一代macbook pro上大概是这时间)。make最后会生成system.img。看到mail list里有人问这个干嘛用,其实是文档里没有完全写清楚。一般来说,我想普通人还需要的是make sdk这一步,会在myandroid/out/host/YOUR_OS/sdk中生成sdk。和从google官方下载下来的sdk差不多,可以直接运行了
在进行过一次完整的make后,以后对一些程序的修改,大可不必重新make sdk,因为make sdk实在太慢了。
先在myandroid目录下执行
$ . build/envsetup.sh
然后你就会多出几个可用的命令。在改了Contacts项目后,可以简单的执行mmm packages/apps/Contacts/来单独编译这个部分。为了可以直接测试改动,需要生成新的system.img,在myandroid目录下执行
make snod即可 当然,如果你改动的是emulator或者其它外围相关的,而非系统内部的东西,就不只是要重新生成system.img了
修改测试
这个周末,我提交了大约四到五个patch。主要是联系人程序相关的一些bug修正。如果你是想修改build in的程序,像联系人这样的,最好先在编译前把Contacts包删去,这样编译出来的system.img不带Contacts程序会方便很多,可以直接用eclipse开发Contacts程序,在这个模拟器上调试。像一般情况下,Contacts是带在system.img内的,对程序修改后想测试,比较麻烦,需要先运行emulator,然后adb uninstall掉原先的程序,再安装自己的,并且如果数据没卸干净,会有permission出错或uid不否而报错的情况。最最麻烦的是,每次重启emulator,build in的程序在被adb uninstall后又会出现,这个问题在真机上不会出现。所以我建议你直接去掉Contacts再编译个system.img出来,不过今天的几个修改都比较简单,我全部都是改一点就用mmm重新编译Contacts程序,然后用make snod来出一个新的system.img,覆盖掉sdk目录下旧有的文件,来测试。这个过程熟练了一般两分多钟可以测一把。