前面花了那么多篇幅做准备,直到此篇才开始真正开始讲适配,读者一定很激动,但先不要高兴得太早,笔者必须先提出一个声明,虽然此系列文章不要求读者有编程基础,但理所当然的不具备者在适配时难度更大(只能靠经验和资料);而具备编程基础的读者也不要高兴得太早,其实很多时候适配并非靠技术,而是靠不懈的毅力。
注意:初次适配者,如果仅靠本系列文章的解惑,依照个人能力、悟性、业余时间的差别,没有2~6个月或更长的时间,是无法做完整个适配过程的。
一、验证编译环境是否正确
首先以高通的内核以及高通提供的范例device来做一次完整编译,以验证开发环境是否OK
在msm-aosp_LNX.LA.2.7-05010-8960.0目录右键打开终端
source build/envsetup.sh
lunch
输入msm8960所在行的编号,比如8. msm8960-userdebug,那么就输入8并回车
make otapackage –j5
这里-j5代表编译使用5个线程,如果是i7则可以使用9个线程,具体依cpu自身线程数读者自行确定
如果没有错误,最后会生成msm8960-ota-eng.root.zip类似这样刷机包
二、验证手机内核版本与msm-aosp系统版本是否匹配
msm-aosp编译系统在进行编译时会引用内核的一些变量,如果版本对不上,编译会出错。
想必读者早早就下载好了手机的官方提供的内核源代码,这步就可以用上它了。
本文及之后的适配教程就以泛泰手机Vega_IM-A870L为例子,所以这个手机的内核代码就必须去泛泰官方的开源站点去下载。
高通的kernel与手机的kernel是不一样的,高通的kernel只是用于高通的骁龙开发板(笔者猜测),而一般手机kernel会在高通kernel的基础上添加许多芯片驱动(当然各家手机公司用的不一样,这个并没有什么统一的标准)
1.放置手机官方内核源代码
首先把aosp源代码目录的kernel文件夹删除。
然后把官方提供的内核代码解压,按照之前的kernel目录结构放置
必须注意的是,msm-aosp编译系统不提供像cm那样的多层目录结构以支持多机型多内核让你可在选device时选中对应的内核。aosp只有kernel这个目录,所以要是未来还要适配其它机型,你仍然得替换这个目录。当然如果读者未来有能力了,参照cm去更改编译系统以支持多个内核源代码就更好了。
2.内核配置文件
然后下一步就要找内核的配置文件名,一般官方内核代码解压后,可以在相关说明文档中或编译脚本中找到,泛泰a870的例子是msm8960_ef52l_tp20_perf_defconfig
这个内核配置文件,可以在内核代码目录的arch/arm/configs里找到,读者不妨打开它,了解一下它的用处,笔者也顺便说说这个文件一个能自定义的地方:
CONFIG_LOCALVERSION="-perf"
这个会显示在系统的关于里,内核版本这个栏位里
许多cm内核会改成CONFIG_LOCALVERSION=”-CM”
读者可以改为自己的id,但请勿尝试使用中文,笔者完全不推荐这么做。
cm的kernel config项是放在BoardConfig.mk里
而msm-aosp是放在AndroidBoard.mk里,这是个不同点
那么就打开AndroidBoard.mk修改msm8960_defconfig换成你的手机内核对应的配置名称,这里笔者的例子就改成msm8960_ef52l_tp20_perf_defconfig
删除源码根目录的整个out目录
然后按照之前介绍的命令,重新完整编译一次。
如果没有错误,才可以继续进行下一个步骤。
如果有问题,请重新回顾上一篇文章的内容,重新找对版本再继续。
三、修改高通自带的device
首先,笔者希望读者能首先熟悉device的编写方法,这个是做编译适配的基础技能,而且有必要从现在就开始练习。
其次,不要指望参考cm之类的第三方rom的device,当你的机型不被cm支持时,不就傻眼了吗。
1.压缩device/qcom备份一下
2.device/qcom改名并处理多余文件
删除device/qcom下除了msm8960和common文件夹以外的文件夹
然后把原device/qcom/msm8960改名为device/pantech/a870
device/pantech/a870文件夹下删除所有.kl、.kcm、.conf、.accept、.deny、.rc、.sh、.ini、.dat、.bin、、sec_config、vold.fstab等文件,并在msm8960.mk里找到相应的copy语句,并删除之。
删除media文件夹、radio文件夹、snd_soc_msm文件夹,同理在msm8960.mk里找到相应的copy语句,并删除之。
最终剩下overlay文件夹、Android.mk、AndroidBoard.mk、AndroidProducts.mk、BoardConfig.mk、egl.cfg、fstab.qcom、msm8960.mk、recovery.fstab、system.prop
3.处理device/pantech/common文件夹
删除device文件夹、dtbtool文件夹、init文件夹、media文件夹、product文件夹、rootdir文件夹、recovery文件夹,并在common.mk里找到相应的copy语句,并删除之。
4.把common合并到a870文件夹里
合并后common文件夹删除,如果碰到同名文件,就把文件内容进行合并
5.再回到device/pantech/a870文件夹
新建bluetooth文件夹,并把bdroid_buildcfg.h移动到新建的文件夹里
对应的BoardConfig.mk里的语句也必须更改
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/pantech/a870/bluetooth
msm8960.mk文件改名为a870.mk,对应的AndroidProducts.mk里也必须打开来修改
然后打开a870.mk,修改
PRODUCT_NAME := a870
PRODUCT_DEVICE := a870
common.mk改名为device.mk,并打开a870.mk修改对应的路径名称
device.mk中删除所有非msm8960的行,PRODUCT_BRAND := qcom改为读者手机生产商,本例里改为pantech
grep –r “recovery”找一找有没有哪个配置文件有recovery相关的编译配置
删除所有含有recovery的行(注意保留第2步里提到的recovery.fstab)
6.修改vendorsetup.sh
仅保留如下语句即可
add_lunch_combo a870-userdebug
7.删除vendor/qcom
删除vendor/qcom/opensource/kernel-tests
并在device.mk中删除对应的#KERNEL_TESTS语句
把vendor/qcom压缩备份,然后把vendor/qcom删除以避免在后续的编译中出错
8.修改过程如果有些文件不知道在哪,请善用grep –r “关键字”来查找文件内容
9.边编译边修正错误
有些错误在编译时才容易找到。
source build/envsetup.sh
lunch
输入a870所对应的数字并回车
make otapackage –j5
10.编译recovery错误
因为我们把相关的配置项删除了,而编译系统又必须编译,所以我们这里要更改编译系统去掉recovery的编译
打开build/tools/releasetools/ota_from_target_files
注释如下语句
line454
#script.UnpackPackageDir("recovery", "/system")
line462
#recovery_img = common.GetBootableImage("recovery.img", "recovery.img",