从去年12月开始写程序开始,都差不多快一年了。上月Google终于公开了的较完整的源码。最近几天,闲来无事时就给他们提交一些补丁。
这里讲一些开发中的技巧,或许对大家有帮助,转载请注明出处:
下载源码
首先一个问题是在国内访问有时,甚至是大多时候,是有问题的。那么怎么翻墙就需要大家自己解决了。其实只是为了看源码的话,问题并不大,源码更新的站点还是可以正常连接的,但是如果有打算要提交patch,那么用tor都有些麻烦,我是找了个VPN出去的。获取源码请参照
download
嗯,我这里也可以给一些简单的步骤介绍吧:
1. 你的系统需要是Linux或者是Mac OS X。需要先安装git-core和gnupg,在Debian/Ubuntu Linux上,可以用apt-get获取,Mac上使用吧。额外的,在mac上你需要先安装XCode 2.4以上版本,另外再用macports安装gmake, libsdl。 事实上编译期还会有问题,这在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 > 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://.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目录下旧有的文件,来测试。这个过程熟练了一般两分多钟可以测一把。