当前位置: 首页 > 工具软件 > CyanogenMod > 使用案例 >

Android学习笔记之cyanogenmod编译篇

刘乐童
2023-12-01
什么是cyanogenmod


CyanogenMod是一个Android第三方固件发布和维护的组织,基于官方的Android开源代码衍生出自己的版本。其中,CyanogenMod 6基于Android 2.2(Froyo),CyanogenMod 7基于Android 2.3(Gingerbread)以及CyanogenMod的定制代码,CyanogenMod 8基于Android 3.x(Honeycomb),CyanogenMod 9则基于Android 4.x( Ice Cream Sandwich)。国内有许多的智能手机民间的Android ROM定制社区,以及官方发布的深度定制OS大多是基于CyanogenMod衍生而来,其中著名的有小米的MIUI、盛大的乐众Rom等。这里使用CyanogenMod 7来进行研究。


此处,编译CyanogenMod的OS,只编译操作系统的主要部分,并不编译修改操作系统内核,使用现成的操作系统内核进行打包。关于cyanogenmod的源码目录怎么下载以及android的开发调试环境如何安装的问题,请参见我之前的文章。


CyanogenMod 7的源码目录中,用device目录下面列出了许多的厂商的各种机型。如果目标设备在其中,则可以直接进行编译。例如,华为的u8150设备在cyanogenmod 7上可以看到设备相关的目录“~/cyanogenmod/device/huawei/u8150”。这里可以推荐一个步骤一步一步执行即可(添加链接)。如果目标设备不在CyanogenMod支持的列表中,则需要生成设备相关的文件。


如何向CyanogenMod添加一种新的设备


基本上,这个很难,需要比较专业的人士才能做。基本的原理是,利用现成的的一个运作良好的设备,例如,买了一台智能手机后,将该智能手机破解(ROOT),权限打开后,将设备相关的文件逐个拷贝出来,这些设备相关的文件都是SO的文件(运行时链接的文件),这些文件在Cyanogenmod编译完成后直接进行打包。为何不直接编译生成SO文件呢?原因是这些文件直接和特定的设备相关,设备厂商并不开放这部分源代码(Android的License允许),主要是Android操作系统中HAL层的文件(关于Android的HAL结构,是导致设备相关的驱动逻辑没有放在内核,而是放在用户空间的原因,可以查资料了解一下)。



设备相关的文件如何获取呢?如何知道要从现成的机器抓取什么文件下来呢?这个对普通的CyanogenMod编译者来说,直接去网上看看有没有大牛的共享好了。例如,本人的C8500,不是cyanogenmod 7支持的设备类型,我只好在互联网上痛苦的寻找编译所缺失的文件,相关下载链接为试验的时候所用,不能保证该链接长久有效。(实际上,我已经发现部分链接无效了,瀑布汗)


C8500设备的编译准备工作


CyanogenMod源码下载请参见前文: http://blog.csdn.net/shallon_luo/article/details/7430794 中的“下载 cyanogenmod 的源码可以生成自定义的 Android Rom” 部分


1.生成~/cyanogenmod/device/huawei的c8500设备目录
1.1下载设备描述文件:ioz9-android_device_huawei_c8500-1-856dd9b.zip(下载链接:https://nodeload.github.com/ioz9/android_device_huawei_c8500-1/zipball/gingerbread)
1.2解开后将根目录改名为c8500


2.添加~/cyanogenmod/device/common/gps目录下c8500相关文件,解决编译找不到文件的问题
2.1.下载ShunYea-android_device_common_gps-b7f9c29.zip文件(下载链接:https://nodeload.github.com/ShunYea/android_device_common_gps/zipball/gingerbread)
2.2.解开获取gps.conf_CN_SUPL文件和gps_cn_supl.mk文件拷贝到目录下


以下步骤主要为了向编译系统支持多一种设备的编译。
3.添加~/cyanogenmod/vendor/cyanogen/products目录下的cyanogen_c8500.mk文件
3.1下载ShunYea-android_vendor_cyanogen_products-7c7703d.zip文件(下载链接:https://nodeload.github.com/ShunYea/android_vendor_cyanogen_products/zipball/gingerbread)
3.2解开获取cyanogen_c8500.mk文件拷贝到目录下


4.~/cyanogenmod/vendor/cyanogen$ vi vendorsetup.sh 
添加一行
add_lunch_combo cyanogen_c8500-eng


添加一行
5.~/cyanogenmod$ vi ./vendor/cyanogen/products/AndroidProducts.mk
添加一行
$(LOCAL_DIR)/cyanogen_c8500.mk \


运行~/cyanogenmod/device/huawei/c8500$ ./setup-makefiles.sh 


C8500设备的编译过程


1.获得设备相关的文件,将USB线连接一台ROOT之后的C8500设备,打开C8500设备的开发调试选项,并设置环境变量,使adb命令能被当前用户执行。请参见http://blog.csdn.net/shallon_luo/article/details/7453608关于adb命令的部分。



cd ~/cyanogenmod/device/huawei/c8500
./extract-files.sh 


实际上这个脚本就是调用adb pull命令将设备上的文件逐个抓下来,放到vender/huawei目录下。如果手上没有这样的一台设备,则可以去网上找一找,看看有没有人把目标设备的proprietary包共享出来,例如,C8500的设备,我找到了一个:


下载ioz9-proprietary_vendor_huawei-1d161c3.zip(下载链接:https://nodeload.github.com/ioz9/proprietary_vendor_huawei/zipball/gingerbread)
解开获取其中的c8500目录整个目录拷贝到~/cyanogenmod/vendor/huawei目录下


2.编译命令


cp ~/cyanogenmod/vendor/cyanogen/products/cyanogen_c8500.mk  ~/cyanogenmod/buildspec.mk
cd ~/cyanogenmod/
. build/envsetup.sh
lunch 
make -j4


lunch之后出现了设备列表,选择cyanogen_c8500-eng。eng是工程调试版本的意思。“make -j4”中的4可以修改,根据CPU的个数选择或者CPU个数的两倍来选择,用以加快编译速度。


3.经过漫长的编译过程之后


~/cyanogenmod/out/target/product/c8500目录下可以看到编译结果,主要有用的是:
userdata.img、system.img、boot.img、recovery.img等等。
使用fastboot命令将boot.img 、system.img、userdata.img刷入C8500,然后使用fastboot命令重启设备,详细参见 http://blog.csdn.net/shallon_luo/article/details/7453608的fastboot部分。

静待C8500启动,查看效果。

4. 附录:userdata.img、system.img、boot.img、recovery.img的解包和重新打包工具。

在~/cyanogenmod/out/host/linux-x86/bin/目录下,可以找到下列执行命令。


解开boot.img userdata.img system.img
~/cyanogenmod/out/host/linux-x86/bin/unpackbootimg -i boot.img
BOARD_KERNEL_CMDLINE mem=211M console=ttyMSM2,115200n8 androidboot.hardware=c8500
BOARD_KERNEL_BASE 00200000
BOARD_PAGE_SIZE 4096
shallon@shallon-Joybook-R48:~/cyanogenmod/out/target/product/c8500/test$ ls -al
total 6056
drwxr-xr-x  2 shallon shallon    4096 2012-04-20 14:22 .
drwxrwxr-x 10 shallon shallon    4096 2012-04-20 09:14 ..
-rw-r--r--  1 shallon shallon 3092480 2012-04-20 14:22 boot.img
-rw-rw-r--  1 shallon shallon       9 2012-04-20 14:22 boot.img-base
-rw-rw-r--  1 shallon shallon      61 2012-04-20 14:22 boot.img-cmdline
-rw-rw-r--  1 shallon shallon       5 2012-04-20 14:22 boot.img-pagesize
-rw-rw-r--  1 shallon shallon  153345 2012-04-20 14:22 boot.img-ramdisk.gz
-rw-rw-r--  1 shallon shallon 2930688 2012-04-20 14:22 boot.img-zImage

解开获得2个重要的文件,一个是操作系统的内核文件boot.img-zImage,一个是根文件系统ramdisk文件,boot.img-ramdisk.gz

~/cyanogenmod/out/host/linux-x86/bin/unyaffs userdata.img

解开可以看到userdata.img里面只有一个/data目录

~/cyanogenmod/out/host/linux-x86/bin/unyaffs system.img

解开可以看到原本位于system目录下的子目录。

将data目录生成文件userdata.img

out/host/linux-x86/bin/mkyaffs2image -f out/target/product/c8500/data out/target/product/c8500/userdata.img

生成boot.img
使用unpackbootimg再次打包生成新的myboot.img文件。该文件和原来的boot.img一样大小。
~/cyanogenmod/out/host/linux-x86/bin/mkbootimg --kernel boot.img-zImage --cmdline mem=211M console=ttyMSM2,115200n8 androidboot.hardware=c8500 --base 0x00200000 --pagesize 4096 --ramdisk boot.img-ramdisk.gz --output myboot.img

生成system.img文件

~/cyanogenmod/out/host/linux-x86/bin/mkyaffs2image -f  out/target/product/c8500/system out/target/product/c8500/obj/PACKAGING/systemimage_intermediates/system.img

 类似资料: