跳转至

【Android ROM定制】CyanogenMod源码下载和编译

【Android ROM定制】CyanogenMod源码下载和编译

前言:

CyanogenMod源码下载和编译是一个耗时、耗精力、耗人品的工程,如果你有足够的毅力、耐心,以及做好了承受各种下载出错、编译出错、固化出错打击的心理准备,请一步一步往下看。考虑到Cyanogenmod支持的手机设备有限,以及广大Android编程爱好者的手机设备差异,本blog是以手机HTC Aria(liberty) 下载、编译Cyanogenmod 7 、并生成固件烧写到手机为例,引导读者根据自己的手机设备选择其支持的Cyanogenmod版本以及其源码分支进行Cyanogenmod源码的下载、编译、固化。

Ps.笔者查看各种资料,从Cyanogenmod是什么都不知道到最终成功下载Cyanogenmod源码、编译、生成固件、在手机上运行CM7系统共折腾了1个星期。其中下载源码耗时3天,每天晚上半夜爬起来看是否全部下载完成。编译3天,包括处理各种编译出错,生成固件并运行系统并利用该系统拨打第一个电话成功时,兴奋之情无以言表,历史的一刻,就像中国发送第一封国际电子邮件一样开启中国互联网时代,开启了自己的Android系统深入学习之路,这还只是开始,后面的路还很长。

一、Cyanogenmod

1、Cyanogenmod官方支持的手机设备

Cyanogenmod官方支持的手机设备类型有Htc、Samsung、Huawei、Sony等其各自旗下的主流型号,详细的信息请查阅Cyanogenmod官方网址:http://wiki.cyanogenmod.org/w/Devices#vendor=;,可以查看Cyanogenmod官方支持的手机设备。

在vendor标签中选中Htc,可看到笔者的手机HTC Aria(liberty),表明支持Cyanogenmod编译生成的固件,如下图所示:

    

2、手机设备支持的CM版本号

查看手机设备支持的CM版本号直接关系到CM源码分支的选择,比如笔者手机是HTC liberty,其支持的CM版本号是CM 7,其对应的分支是gingerbread。

             CM Support: 7
             Latest CM version:     gingerbread
 了解完自己的手机是否支持Cyanogenmod源码编译生成的固件和其支持的CM version。接下来就开始搭建环境、下载、编译CM源码了。

二、环境搭建

1、 ubuntu系统安装

笔者编译的是CyanogenMod 7稳定版、Android源码2.3系列,而Android 2.3系统限制必须使用32位(Android4支持64位系统),故使用ubuntu10.3 32位系统。详细安装步骤请参考网上的安装教程,已安装ubuntu 32位系统请跳过。

2、 安装JDK6

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get installsun-java6-jdk

3、 安装编译所需要的包 (Ubuntu 10.04-- 11.10)

$ sudo apt-get installgit-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-devlib32ncurses5-dev ia32-libs \
  x11proto-core-dev libx11-devlib32readline5-dev lib32z-dev \
  libgl1-mesa-dev g++-multilib mingw32 tofrodospython-markdown \
  libxml2-utils xsltproc
Ubuntu 12.04安装编译所需要的包详细请参考: http://source.android.com/source/initializing.html

4、 配置USB访问权限

(1)、默认将htc类型手机通过usb连接上电脑之后,使用adb devices是没有权限访问手机设备的,如下图所示:

tip:这里要使用到adb工具,如果ubuntu系统安装了android eclipse开发工具,默认是自带adb工具的。

(2)、将设备连接上电脑,查看手机的usb设备:

ubuntu@andy-laptop:~$lsusb
htc 手机对应的usb设备信息如下:

Bus 002 Device 004: ID 0bb4:0c92 High Tech Computer Corp.
如下图所示:

(3)、修改51-android.rules文件:

ubuntu@andy-laptop:sudo gedit /etc/udev/rules.d/51-android.rules
添加一行信息,特别注意,ATTR{idVendor} 与ATTR{idProduct}的值分别于ID 0bb4:0c92对应。

# fastboot protocol onmanta (htc liberty)
SUBSYSTEM=="usb",ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0c92",MODE="0600", OWNER="ubuntu"
 如下图所示:

(4)、保存文件后,重新将手机连接到电脑,使用adb devices查看设备的连接状态,可发现已经拥有了访问usb的权限。

(5)、详细请参考:

http://source.android.com/source/initializing.html Configuring USB Access小节 

三、下载源码

1、 安装Repo

       //从用户根目录开始
       $ mkdir ~/bin
       $ PATH=~/bin:$PATH
       $ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
       $ chmod a+x ~/bin/repo

2、下载源码

(1)、 如何选择分支

笔者的手机是htc G9,支持的CM verison :gingerbread,选择手机设备所支持分支的详细步骤,请参考本blog 1.2、手机设备支持的CM版本号

笔者最终选择的分支是:gingerbread-release

查看https://github.com/CyanogenMod/android.git下所支持的所有分支,如下图所示是分支gingerbread-release。

(2)、使用repo执行下载

       //从用户根目录下开始,分别创建文件夹CyanogenMod/android/CM-7
       $cd ./CyanogenMod/android/CM-7
       //获取gingerbread-release的分支源代码
       $repo init -u git://github.com/CyanogenMod/android.git -b gingerbread-release 
       //同步服务器代码到本地,-j16据网友反应是多开网络连接,从而能提高下载速度
       $repo sync -j16
      repo命令使用参考: http://source.android.com/source/using-repo.html        特别提醒:关于gingerbread分支,我下载之后,发现CyanogenMod/android/CM-7/device目录里没有htc、三星一系列手机对应的版本,折腾了好长一段时间,最终选择gingerbread-release分支下载源码,在CyanogenMod/android/CM-7/device目录成功获得多款手机对应的版本。 

下载成功后,在CyanogenMod/android/CM-7/device文件夹会包含如下所示文件夹,以此判断源码是否下载完整。发现device文件夹里已经包含了htc文件夹,如图所示:

点击htc文件夹进入可发现liberty已安静的躺在那,如图所示:

四、编译源码

1、  读取手机上的一些私有配置文件

将htc手机连接上ubuntu系统,可能没有usb访问权限,具体请参考2.4 配置USB访问权限

$cd  ~/CyanogenMod/android/CM-7/device/htc/liberty
$./extract-files.sh

2、  生成编译脚本文件

$cd ~/CyanogenMod/android/CM-7/vendor/cyanogen
$./get-rommanager
$./extract-google-files
//复制编译脚本文件到目录下,后面编译整个系统用的就是这个文件
$cp ~/CyanogenMod/android/CM-7/vendor/cyanogen/products/cyanogen_lieberty.mk  ~/CyanogenMod/android/CM-7/buildspec.mk

执行./get-rommanager运行结果如图所示:

3、  编译脚本

回到CyanogenMod/android/CM-7目录下,执行脚本。

//初始化脚本,这个是后面的重要基础步骤
$cd ~/CyanogenMod/android/CM-7
$source build/envsetup.sh
//选择编译的产品,这个命令需要一小会儿时间,但是又没提示,耐性等待一下
//或直接执行lunch命令,查看list选项来选择执行哪个版本
$lunch cyanogen_liberty-eng
//开始编译
$make -j4 CYANOGEN_WITH_GOOGLE=true otapackage
执行lunch命令,选择119,显示信息如下图所示:

编译成功显示如下信息,这张图片来的相当不容易,半夜起来截的图:

4、编译可能产出的错误分析(如果没有问题可直接跳过,执行第5步:生成刷机zip包操作):

错误原因:无法访问文件: corrupted zip file

错误原因分析:没有选择正确jar版本,默认情况下选择的是/usr/bin/fastjar自动模式,通过sudo update-alternatives --config jar选择jdk6即可。

问题解决:

32位ubuntu编译android2.3,无法访问 java.lang.Object问题 http://hi.baidu.com/cmdmac/item/93920ff30164270884d278a4

编译android 2.3.4的一个错误http://blog.163.com/covel_zhang/blog/static/81641365201223122541768/ 

5、生产刷机zip包。

在CyanogenMod/android/CM-7目录下执行如下脚本:

$./vendor/cyanogen/tools/squisher
生成固件包成功,显示如下图所示信息:

五、刷机

将cm-7-20131119-UNOFFCIAL-liberty.zip包刷到我htc手机上一切正常,有图有真相,留心"关于手机"修订版本选项,正是第5步生成的刷机包cm-7-20131119-UNOFFCIAL-liberty.zip。

        

六、参考:

Android拓展系列(5)--CyanogenMod源码下载和编译(Android ROM定制基础篇)

Android 第三方ROM CyanogenMod 源码下载,编译,刷机

http://source.android.com/source/initializing.html

http://source.android.com/source/building.html

七、小结:

本文以笔者自身的CyanogenMod源码编译折腾经历描述了利用第三方开源系统定制个性化ROM的过程,之所以要记录这篇博文,完全是本着前人栽树后人乘凉的宗旨,让遇到同样需求的开发者不至于像笔者如此折腾,或者说折腾的少一些,如此,笔者心满意足。最后,本博文虽经笔者多次校验,但难免会有疏漏之处,敬请指正,笔者将在第一时间给予答复指正。
转载请注明出处:http://blog.csdn.net/andie_guo/article/details/16879443

原文链接: https://blog.csdn.net/andie_guo/article/details/16879443