稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

下载并编译CyanogenMod源代码

CyanogenMod是除了Android官方源码之外的最受欢迎的Android的一个分支,它是干净,几乎接近原生Android,且方便为设备进行定制,在编译和制作ROM上面较原生有很大改进,是开发者学习源码和自己制作ROM的最佳选择。

官方网站在这里.

repo在这里.

环境说明,本次所有操作都是在Ubuntu 12.04(Precise)里面进行的。另外需要说明的是,我的环境访问谷歌和谷歌相关的服务都是没有问题的,关于如何访问谷歌可以参考这位牛人写的博客

下载源码

下载源代码是第一步,这跟很多教程是不太一样的。因为我觉得,你源码都没有拿到,还搞个毛线啊!有了源码即使无法编译,也至少还可以看源码的,否则安装了toolschain又有啥用。 其实,源码的下载按道理讲是很简单的事情的,但是很多事情到了我大天朝就会变得很复杂,甚至搞不定,特别要从Google的服务器上搞点东西。因为CyanogenMode的源码是在Github上面,所以源码的下载还是很方便的,但是对于一些必要的工具,因为是要从Google取,所以就很蛋疼。

下载repo

因为Android的源码非常多,巨大的源码不可能放在一个git的repo里面,是每个模块都有自己单独的git仓库,但是为了成功编译,又需要所有的源码,但是不可能手动的一个一个的去clone啊,因此就有了repo这个工具,它就是一个Python实现的脚本,先从Server读出来一个所有仓库的配置信息XML文件,然后按这个文件一个一个的把git仓库clone下来。 这个文件是Android官方提供的,CyanogenMod也只是使用了它。所以它还要从官方来取。它就是一个脚本,所以谈不到安装,下载下来,改变文件属性就可以运行了。关键是下载啊!

1
2
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x !$

因为Google的连接不稳定,甚至是无法连接,所以下载这个脚本就要八仙过海,各显神通了,为了方便后来的兄弟们,可以从这里下载。别高兴太早,这才刚开始。后面还会有一大把问题呢。

初始化仓库和分支信息

1
2
3
mkdir -p /work/cyanogenmod
cd /work/cyanogenmod
repo init -u git://github.com/CyanogenMod/android.git -b stable/cm-11.0

注意,为了方便,最好把你的Github帐户配置好ssh,以方便直接以git方式clone。另外,CyanogenMod的仓库在这里,你会发现,这里只有二个配置文件。如前面所说,这里只是列出其他仓库的配置文件,以文件抓取所有的源码。

另外,-b后面跟的是你要抓取的分支, cm-11.0是最新的分支,对应Android 4.4。查看其他的分支可以看这里

如果没有任何错误,那么要恭喜你,但是通常都会遇到错误:

repo init -u git://github.com/CyanogenMod/android.git -b stable/cm-11.0

gpg: key 920F5C65: “Repo Maintainer repo@android.kernel.org” not changed

gpg: key 692B382C: public key “Conley Owens cco3@android.com” imported

gpg: Total number processed: 2

gpg: imported: 1 (RSA: 1)

gpg: unchanged: 1

fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle

fatal: error [Errno 101] Network is unreachable

第一眼看上去貌似是网络连接问题,搜了一下,网站有各种版本,有的说要unset代理,变量,有的说要登录androidsource然后把登录信息加入到.netrc中。但是这些对我的情况都不管用;还有这篇。我的情况与最后一个类似,多试几次,然后就init成功了。看来真的是网络抽风。

下载源码

然后就可以下载源码了:

1
repo sync

因为是在github上面,而github一向是比较给力的,所以只要等待就好了,一般都会成功下载的。这跟官方Android就不同了。记得以前下载官方源码时,经常出现网络问题,下载了几个晚上才搞定。

安装编译所需要的toolschain

CyanogenMod本质上也是Android,所以这个可以参考官方文档,就可以了。

几个关键的点是:

  • 使用Oracle的Java SDK(JDK),至于版本,最新的Android可以用Java 7,所以就装个Java 6吧,2.3到4.4都是使用Java 6
  • 安装需要的软件包
  • 配置ccache

编译

编译模拟器

模拟器在学习和研究代码的时候还是比较有用的,如果你没有一个专门用作测试的手机的话。

1
2
. build/envsetup.sh
lunch

这时会出现一个菜单,仔细寻找cm_goldfish-eng,输入前面的数字,这会对模拟器进行一些配置。这里有一个坑,不要用source build/envsetup.sh,而要用上面的命令,否则会没有goldfish相关的配置项出现在lunch的菜单里。

然后,再到vendor/cm/里面,执行./get-prebuilts,这会把一些需要的东西拉下来。然后就可以正式的编译了:

1
make -j8

之后是漫长的等待。

运行模拟器

1
emulator -system ./out/target/product/generic/system.img -data ./out/target/product/generic/userdata.img -ramdisk ./out/target/product/generic/ramdisk.img

还可以指定skin,skin可以到SDK里面去找。如果多次使用可以把上面的命令保存成Bash脚本。但是这个模拟器会奇慢无比。

参考资料

Comments