不得不说,Android升级的速度非常之快,手机厂商也在不停的追赶Android的步伐,力求更快更多的抢占市场!每次Android升级之后,用不了多久,三星、HTC等一些大厂商就会发布搭载最新android系统的产品,有时甚至完成了系统的深度定制,而一些低配、中低档的手机则无法得到升级,诱使更多的屌丝寻找刷机ROM升级尝鲜。。。对于程序员来说,不必去论坛寻找各种ROM,完全可以自己获取手机的源代码,自编自改,既是乐趣,也可以提升自己。。。
目前CyanogenMod官方支持的机型已经很多,只要你的手机不是太老太烂,都能找到相应的ROM。 但是看官方支持列表 ,你会发现大部分中配、低配,特别是arm-v6 CPU的手机最多只能升级到cm7 (android2.3),而无法升级到cm10.1(android4.2)。 本文将讲解如何下载和编译CM10.1源代码,重点讲述如何编译出这些低配、中配机型的cm10.1-ROM。 请一定要有耐心完成这件事情,各个环节肯定会遇到这样那样的问题,甚至编译出的ROM让你刷机后无法开机,只有耐心的尝试和探索,你才会取得成功!成功之后,你就可以尽情的更改源码,向别人分享你制作的ROM!
一. 编译 CyanogenMod官方 支持 升级到 cm10.1 的机型 ROM (官方支持列表)
阅读上一篇文章 Ubuntu12.10-amd64系统上搭建Android4.2(JellyBean)源码开发环境,按照步骤一路执行,将 “第4步的 3)初始化repo”,修改为下图命令
然后 repo sync 同步源码,同步源码完成后 ,执行下列步骤并编译源码:
$ cd ~/myandroid/vendor/cm
$ ./get-prebuilts //(这一步是为了下载Term.apk并解压到当前propritary目录)
(只需执行一次,以后编译无需执行)
$ cd ~/myandroid
$ source build/envsetup.sh
$ breakfast captivatemtd //(这一步会自动从github下载 三星I897[代号captivatemtd]设备的驱动和内核; 注意 必须是CM官方支持升级到cm10.1的设备才能使用这个命令下载到//内核和驱动!!!) (只需执行一次,以后编译无需执行)
命令执行到这里,你会发现多出了 myandroid/device/samsung/captivatemtd 目录,这个目录下 有一个
extract-files.sh
的脚步!
接下来你要准备 三星I897这台真机,并且已经刷上了CM10.1的ROM,已root,与电脑连接,且在你的ubuntu系统上执行命令 adb devices 可以识别这台设备!(如果无法识别,自己百度google去)
$ cd ~/myandorid/device/samsung/captivatemte
$ chmod a+x extract-files.sh
$ ./extract-files.sh // (这条命令实际上都是组织好的的adb pull,它将真机中的部分库和依赖文件拷贝到本地源码环境,辅助编译!因为部分库和依赖文件的源码我们无法获取,
//相关厂商只提供了这些编译好的东东!这一部很重要,如果跳过,即时编译ROM成功,刷机后手机也跑不起来的!) (只需执行一次,以后编译无需执行)
说明: 如果你不想预先把手机刷成CM10.1,可以以文本打开extract-files.sh,就看到里面其实都是拷贝文件的操作。那么你解压从官方获取的cm10.1的rom压缩包,逐个拷贝相应文件到源码环境相应目录,并编辑相应目录的mk文件,加入 "PRODCUT_COPY_FILES + =..." 这样的语句也是可以的,但是很麻烦!
以下开始真正编译:
$ croot
$ brunch captivatemtd
编译过程中遇到错误了不要怕,百度google吧。。。亲。。。编译完成后的ROM在out目录下,自己找找看!
二. 编译 CyanogenMod官方 不支持 升级到 cm10.1 的机型ROM (例如 三星S5660, 三星S5830,LG-P509...)
这类设备不受CM官方支持升级到CM10.1, 他们有一些共同特点:低配、中低配、中配、RAM小、CPU频率低、CPU采用ARM-V6指令集等。我认为最主要的原因是CPU采用ARM-V6指令集的问题,ARM-V6 指令集没有ARM-V7指令集的指令广,一个很显著的表象就是ARM-V6机器在网页上不能直接看在线flash! Android4.2.2基线的linux内核比较新,如果强制将这些机器升级到cm10.1,相机应用是个瓶颈!我们在网上看到这些低配机器的cm10.1,是因为其他团队或个人 基于CM的代码、专有内核(往往不是最新的linux 3.*内核)、驱动 进行再次开发 ,经过不懈努力才取得的成果!
这里介绍下编译这类手机cm10.1 ROM的方法:
a) 下载cm10.1源码后, 首先明确你要支持的机型,并弄清楚这个机型的代号(比如三星S5660的代号是gio,三星S5830的代号是cooper),在 github 搜索 这个代号(比如 gio),找到类似下列的源码资源(源码必须有代表android4.2基线的分支):
android_device_samsung_msm7x27-common
android_kernel_samsung_msm7x27
这些就是需要的的! 依赖关系自己研究,呵呵! 这个时候你还不能高兴,就算你找到这些了,你编译成功了,ROM还是不能用,。。。你得点进去看看这是哪个牛逼的人 贡献的代码,并进入他的github主页,
(branch这里应该是jellybean或者cm-10.1或者其他代表android4.2的基线分支)
点击“Jellaxy” 进入这个人的主页后,你会发现他fork并维护了很多项目,仔细阅读下这些项目的说明和提交记录,我们需要使用其中一些项目替换自己下载的CM源码项目,比如替换framework/av目录等!
b) ubuntu文件浏览界面,CTRL+H 使隐藏目录可见,然后在 ~/myandroid/.repo/ 目录下 新建 local_manifest.xml,在其中添加以下内容:
<remove-project>节点表示删除CM源码项目,<project>则表示使用这个节点的项目,特别注意的是你下载cm源码的时候使用的是分支cm-10.1,如果这个project的分支名 是代表android4.2的基线,但
不等于cm-10.1,那么你在project节点上必须加上 version="branch名称,例如jellybean".
c> 重新同步,会下载local_manifest.xml 中补充的代码源!
$ cd ~/myandroid/
$ repo sync
d) 同步完成后,你就得到了这个设备的内核和驱动以及部分 闭源 的库 和依赖文件! 依次执行下列命令
$ cd ~/myandroid/vendor/cm
$ ./get-prebuilts //
(只需执行一次,以后编译无需执行)
$ cd ~/myandroid
$ source build/envsetup.sh
接下来你要准备 真机,并且已经刷上了CM10.1的ROM,已root,与电脑连接,且在你的ubuntu系统上执行命令 adb devices 可以识别这台设备!(如果无法识别,自己百度google去)
$ cd ~/myandorid/device/samsung/gio
$ chmod a+x extract-files.sh
$ ./extract-files.sh
开始编译:
$ lunch cm_gio-eng
$ make
或者 $ brunch gio
等价于 以上两条命令
注意:如果 ~/myandroid/device/samsung/gio/ 目录下没有 extract-files.sh 脚本,那么你从CM官方android_device_samsung_gio,branch为cm-7的分支下复制一个脚本补充下,或者打开本地
~/myandroid/vendor/samsung/gio
~/myandroid/vendor/samsung/msm7x27-common
这两个目录下的 mk文件, 你会发现 mk文件中很多 "PRODCUT_COPY_FILES + =..." 这样的语句, 细心的对比 这两个目录下包含的文件 和 你从网上下载的ROM中system/lib下的文件, 缺少什么文件,你就复制一个文件到vendor/samsung下对应深层目录,然后在mk中写一句 "PRODCUT_COPY_FILES + =..." 这样的语句,以后你就不需要执行 extract-files.sh脚本了!
当然,你也可以跳过执行extract-files.sh脚本,先保证把源码编译通过后,对比你编译产生的ROM和网上的ROM,少了什么依赖文件,你就根据这个自己写extract-files.sh脚本呗!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对于采用高通msm7x27平台的中低配手机,包括 三星S5660,三星S5830,中兴skate,中兴blade,LG-P500,LG-P505,LG-P506,LG-P509等手机,androidarmv6团队已经整合了全套代码!可以摒弃上列复杂步骤,extract-files.sh脚本也不需要! 注意下载源码的时候直接下载androidarmv6团队整合过的源码,所有步骤如下:
$ mkdir myandroid
$ cd myandroid
$ repo init -u git://github.com/androidarmv6/android.git -b cm-10.1
$ repo sync
$ cd ~/myandroid/vendor/cm
$ ./get-prebuilts //
(只需执行一次,以后编译无需执行)
$ cd ~/myandroid
$ source build/envsetup.sh
$ brunch DEVICENAME (for ex: brunch gio)
小结:无论你是编译什么ROM,一定要有足够的耐心,特别是对中低配机型,因为官方不支持升级到 cm-10.1, 整合起来真的很麻烦,需要慢慢摸索 !如果遇到编译问题,通过百度
Google慢慢摸索解决! 如果驱动内核实在编译不过,而自己技术水平有限,不妨换套代码,找其他大神的github主页换套内核驱动!既然是整合,就不仅仅是内核驱动的问题,你还可能要
替换一下framework等源代码! 我第一次整合三星S5660的cm10代码花费了半个月,后来直接使用androidarmv6团队的cm10.1代码,也花费了一周...蹦擦擦啊。。