安卓清理大师
您当前位置: 刷机教程 -开发教程 -HTC One 810e
Recovery移植之高级小白教程——Recovery的编译
发布日期:2014/5/13 来源:网络 编辑:我一直这么叼 40743 阅读 2评论

 

       目前一直在学习源码方面的知识,前段时间刚刚搞定了recovery的移植。这方面的资料真实少之又少啊,谷歌了几天,文章也就那几篇而已,更别提国内的资料了。你让我们热爱学习的小白情何以堪。于是乎就开始动手了,编译的过程中,自己做了一些随笔的记录。把自己遇到的一些问题和解决办法都记录了下了,放在自己的笔记里了。今天整理出来,和大家共享一下。

       本教程是针对有一定基础的人。如果你不会Ubuntu,不会环境的搭建。那你还是先学习一下吧。装Ubuntu各种各样的教程,网上一找一大堆。

       教程所用的系统为Ubuntu12.04,示例机型为中兴N880E。源码目录为~/android/system/。

       码字不容易,你懂的。。。。。。。

       教程开始:

       源码的同步大家可以看官方文档,教程直接从源码同步完后开始。

       1、同步源码到最新,我同步的源码目录为~/android/system/,要改为自己的源码目录,下面每一步也一样
·         cd ~/android/system/
·         repo sync -j16



 

       2、更新完成后,执行下面命令,完成环境的安装
·         ./build/envsetup.sh

 




 

       输出结果:

http://e.hiphotos.baidu.com/album/pic/item/c995d143ad4bd113b79babec5aafa40f4afb059d.jpg

       3、下一步,make我们后面要用到的工具
·         make -j4 otatools

       输出结果:

http://f.hiphotos.baidu.com/album/pic/item/b8014a90f603738d741c10fcb31bb051f919ec9e.jpg

 

 

 

       执行完成后的输出:

http://c.hiphotos.baidu.com/album/pic/item/50da81cb39dbb6fde0eff9f80924ab18962b37b3.jpg

       会生成out目录,在/out/host/linux-x86/bin中有后面要用到的工具。

       4、将/out/host/linux-x86/bin加入环境变量,变量具体位置要改成你的:

       gedit ~/.bashrc

       在文本最后添加:

       export PATH=$PATH: ~/android/system/out/host/linux-x86/bin

http://b.hiphotos.baidu.com/album/pic/item/960a304e251f95ca40fa8068c9177f3e660952e4.jpg

       保存退出,执行下面命令,让刚加的环境变量生效:

       source ~/.bashrc

       4、从官方包中,别人的ROM包也可以,拿出boot.img。我放到了~/android/目录

       5、开始建立我们N880E的device目录:

       ./build/tools/device/mkvendor.sh zte n880e ~/android/boot.img

       命令参考:

       ./build/tools/device/mkvendor.sh device_manufacturer_name device_name /your/path/to/the/boot.img

       命令输出为:

http://e.hiphotos.baidu.com/album/pic/item/94cad1c8a786c917eb4c40e7c93d70cf3ac757a4.jpg

       此时在/device/zte/中就会有你的机型n880e了,里面有你的配置文件:AndroidBoard.mk,AndroidProducts.mk, BoardConfig.mk, device_.mk, kernel, system.prop,recovery.fstab, and vendorsetup.sh.

       6、修改配置文件:

       在这里很重要的一个文件就是recovery.fstab,是你手机里各个设备分区对应的挂载点,可以理解为手机的分区表。如果这个文件有错误,那么进入recovery后,会提醒分区挂载失败。

       这个文件我们可以从官方的recovery.img提取出来。也可以直接解包别人编译好的recovery,得到recovery.fstab

       当然,我们也可以自己动手写。目前,自己也没发现什么简洁一点的办法。我是查看刷机包中的updater-script文件中各个分区的挂载点和

       cat /proc/mount

       输出结果:

http://e.hiphotos.baidu.com/album/pic/item/94cad1c8a786c917eb0c40e7c93d70cf3ac757e4.jpg

cat /proc/partitions

 

       输出结果:

http://h.hiphotos.baidu.com/album/pic/item/024f78f0f736afc3b65a23bbb319ebc4b645129d.jpg

       一个个排除定位出来的。

       大家有好的办法,可以共同探讨。

       这里有一个分区表比较全的recovery.fstab,大家可以按照自己手机的分区表修改。

       7、开始编译,执行命令:

       ./build/envsetup.sh && lunch full_n880e-eng

       (把n880e替换为自己的机型)

       输出结果:

http://f.hiphotos.baidu.com/album/pic/item/d0c8a786c9177f3ef27beed370cf3bc79e3d56a4.jpg

       下一步命令,编译开始:

       make -j4 recoveryimage

       最后成功时输出结果:

http://h.hiphotos.baidu.com/album/pic/item/c8177f3e6709c93de7bd1c299f3df8dcd00054a4.jpg

       输出的目录为:out/target/product/n8880e/recovery.img文件,就是我们要的。

       NOTE:

       1、 编译时间:实体机,一两分钟的样子(i3-380、2GBDDR3)

       2、 异常处理:(都是自己编译过程中遇到的笔录,非官方)

       错误1:

       执行

       ./build/envsetup.sh

       命令后,提示某些设备文件不存在。

       这是自己当初在CM7源码下编译出现的,因为自己没有把所有的设备的源码同步下来,一些设备自己在~/android/system/.repo/manifest.xml中用注释掉了,所以同步完源码后要修改vendor/cyanogen/products/AndroidProducts.mk 文件,把没有同步的设备删除掉。重新执行命令就行了。

       错误2:

       在编译的最后,提示出错 “Boot.img is too large”,自己当时的解决办法是修改BoardConfig.mk:

       # fix this up by examining /proc/mtd on a running device

       BOARD_BOOTIMAGE_PARTITION_SIZE := 0x01000000

       BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x01000000

       BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x19000000

       BOARD_USERDATAIMAGE_PARTITION_SIZE := 0xA0000000

       BOARD_FLASH_BLOCK_SIZE := 131072

       将后面的十六进制改为自己手机分区的大小,要把兆转换为KB,再转换为十六进制,然后替换0x后面的数字(0x表示十六进制)。

       另一种解决办法,就在下面几篇参考文档中刚看的,未实践:

       打开源码目录中的Build/Core/definitions.mk,将1688 – 1694行替换为:

       # if [ "$total" -gt "$maxsize" ]; then \

       # echo “error: $printname too large ($total > [$(2) - $reserve])”; \

       # false; \

       #el

       if [ "$total" -gt $((maxsize - 32768)) ]; then \

       echo “WARNING: $printname approaching size limit ($total now; limit $maxsize)”; \

       fi \

       然后保存。重新编译即可。

       错误3:

       执行7中的第一个命令时,提示lunch未安装:

http://a.hiphotos.baidu.com/album/pic/item/5ab5c9ea15ce36d3e5559fee3af33a87e850b19e.jpg

       解决办法:

       执行

       source build/envsetup.sh

       再执行上面命令就OK 了。

http://d.hiphotos.baidu.com/album/pic/item/71cf3bc79f3df8dc4a729d4fcd11728b461028a4.jpg

       更进一步,自己也在学习中,还未实践的:

       recovery_ui.c 这个文件里面是手机各按键对应的按键值,这样写入之后才能正确选择按键。对按键的修改自己找了一些资料还在进一步学习中。

       参考资料:

       Porting CWM to other devices:

       http://www.acsyndicate.net/how-to-porting-cwm-to-other-devices-windows/

       Creating a custom ClockWorkMod (CWM)Recovery image:

       http://www.twobitcoder.com/?p=158

       Porting Clockwork Recovery to ourGarminfone:

       http://mygarminfone.blogspot.com/2011/05/porting-clockwork-recovery-to-our.html

       Porting Clockwork Recovery to New Devices:

       http://www.koushikdutta.com/2010/10/porting-clockwork-recovery-to-new.html

发表评论
点击换图
发表