customize/make/xxx.mak 是跟硬件平台相关的编译配置文件,里面定义平台所使用的平台、芯片驱动等信息,是展讯里所谓的project。通过mk脚本可以将project 进行编译,生成最终的烧录文件
目前支持的平台有sc8800g,sc8810
文件中带3RDPARTY_XXX(XXX为大写)的,表示模块放在3rdparty相应目录xxx(xxx为小写)内,如果同时定义多个,需要使用:分隔,如
3RDPARTY_CAMERA = ov5640:ov2655:ov7675:ov2640:gc0309:nmi601
模块内可以存在hal/framework/kernel/special这几个目录,前面三个为对应到Android相应模块中的代码,special是为是兼容已调试好的模块(做以前模块到Android平台的适配层?)
添加驱动包需要注意的地方:
在编译系统的时候,会通过customize/perl/prebuild.pl去检查3rdparty/xxx/xxx/special/build.sh是否可执行
如果不能执行,会导致customize/customer_cfg/$prj/.chiplist.cfg配置错误,从而导致编译失败
所以在添加添加包后,需要将相应的build.sh设置为可执行
open OUTPUT_FILE, ">>$chiplist_dir" or die "$chiplist_dir: $!"; print OUTPUT_FILE "# chiplist.cfg auto generated by Spradtrum\n\n"; print OUTPUT_FILE "chip_path=\""; my @chiplists = &chiplist_get(); foreach my $list(@chiplists) { die "$list is not execuable file\n"if(!-x $list); $list =~s/\/special\/build\.sh//i; $list =~s/^3rdparty//i; print OUTPUT_FILE "$list\n"; } print OUTPUT_FILE "\""; close OUTPUT_FILE;
customize/customer_cfg/XXX/res中存放着相关的rc配置文件,AndroidBoard.mk、BoardConfig.mk、sprd_apps.mk等重要的编译配置文件
还有system.prop、键盘配置文件,分区表
编译出错1
frameworks/base/libs/utils/RefBase.cpp: 在成员函数‘void android::RefBase::weakref_type::trackMe(bool, bool)’中: frameworks/base/libs/utils/RefBase.cpp:507:67: 错误: 将‘const android::RefBase::weakref_impl’作为‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’实参时丢弃了类型限定 [-fpermissive] make[1]: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 错误 1
解决办法:编辑frameworks/base/libs/utils/Android.mk文件,修改
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
为
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive
编译出错2
<命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror] <built-in>:0:0: 附注: 这是先前定义的位置 cc1plus: all warnings being treated as errors make[1]: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] 错误 1
修改build/core/combo/HOST_linux-x86.mk line 61:
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 改为 HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
编译出错3
CC [M] /home/yondy/android/idh.code/3rdparty/tp/CY8C21X34/special/driver/cy8c21x34_ts.o /home/yondy/android/idh.code/3rdparty/tp/CY8C21X34/special/driver/cy8c21x34_ts.c: In function 'cy8c21x34_ts_probe': /home/yondy/android/idh.code/3rdparty/tp/CY8C21X34/special/driver/cy8c21x34_ts.c:490: error: implicit declaration of function 'kzalloc' /home/yondy/android/idh.code/3rdparty/tp/CY8C21X34/special/driver/cy8c21x34_ts.c:490: warning: assignment makes pointer from integer without a cast /home/yondy/android/idh.code/3rdparty/tp/CY8C21X34/special/driver/cy8c21x34_ts.c:585: error: implicit declaration of function 'kfree' make[4]: *** [/home/yondy/android/idh.code/3rdparty/tp/CY8C21X34/special/driver/cy8c21x34_ts.o] 错误 1 make[3]: *** [_module_/home/yondy/android/idh.code/3rdparty/tp/CY8C21X34/special/driver] 错误 2 make[2]: *** [sub-make] 错误 2 make[1]: *** [all] 错误 2
在cy8c21x34_ts.h中添加
#include<linux/slab.h>
下载android的kernel进行对比
git clone https://android.googlesource.com/kernel/common -b android-2.6.39
或
git clone --branch android-2.6.39 https://android.googlesource.com/kernel/common
--------------------------------------
./mk -o=2sim sp6820a u adr 出错
Use of uninitialized value $CUR_MODULE_PATH in string ne at customize/perl/main.pl line 373. 2012/12/16 16:17:26 androiding ... update android SH_INFO:make_android.sh [PATH:/home/yondy] Couldn't locate the top of the tree. Try setting TOP.
编译时定位不到TOP目录,提示出现的位置 customize/shell/make_android.sh中
source ${ANDROID_3RDPARTY_ANDROID_TOP}/build/envsetup.sh cd $1 SHELLINFO echo "SH_INFO:make_android.sh [PATH:$PWD]" >&2 mm
其中的$1为空,也就是回到了home位置,导致无法编译
向上找到实际调用make_android.sh的地方 customize/make/makefile.sprd
android: $(hide) echo $(SHOWTIME) $@ing ... $(hide) echo $(CUR_ACTION) $(CUR_MODULE) $(hide) cd $(SHELL_SCRIPT) && \ ($(BUILD_MODE) ./make_android.sh $(KMOD_PATH)) $(DEAL_STDOUT_MODULE)
继续寻找KMOD_PATH
来自customize/shell/main.pl的调用
$makeCmd = "make -f customize/make/makefile.sprd $cmdArg @mOpts"; #省略若干 if ( ($CUR_MODULE_PATH ne "") && (($uMod eq "android") or ($uMod eq "ko"))) { $result += &system_call("$makeCmd $uMod CUR_ACTION=$uAct CUR_MODULE=$uMod KMOD_PATH=$CUR_MODULE_PATH"); } else { $result += &system_call("$makeCmd $uMod CUR_ACTION=$uAct CUR_MODULE=$uMod"); }
$CUR_MODULE_PATH是获取./mk -o=2sim sp6820a u adr 往后的参数,也就是在编译的时候,需要将编译目录加上,变成
./mk -o=2sim sp6820a u adr ./
或者修改上面的代码,补充KMOD_PATH
由上面可以看出
展讯的new/update的主调用过程是:
./mk -> customize/shell/main.pl -> customize/make/makefile.sprd -> customize/shell/build.products.sh -> customize/customer_cfg/$selected_product/res/build.sh
展讯的编译android主调用过程是:
./mk -> customize/shell/main.pl -> customize/make/makefile.sprd -> customize/shell/make_android.sh
最终调用到/build/envsetup.sh,使用android的mm命令进行编译
-----------------------------------------------------------------
修改frameworks出现的问题
Install: out/host/linux-x86/bin/apicheck Checking API: checkapi-current (unknown): error 5: Added public field android.provider.Settings.System.AVALIABLE_CARD_COUNTS ****************************** You have tried to change the API from what has been previously approved. To make these errors go away, you have two choices: 1) You can add "@hide" javadoc comments to the methods, etc. listed in the errors above. 2) You can update current.xml by executing the following command: make update-api To submit the revised current.xml to the main Android repository, you will need approval. ******************************
修改了frameworks的接口或字段以后,可以有两种选择
1、通过make update-api 将新修改的内容更新到current.xml
在展讯代码里是./mk -o=2sim sp6820a ua
2、通过注解/**{@hide}*/将其标注为不公开
----------------------------------------------------------
在最后阶段打包system.img出错
Install system fs image: system.img Re-install system & userdata image SH_INFO:Error: Can't find .chiplist.cfg [LINE:8] PWD(/home/yondy/android/idh.code/3rdparty) make[1]:正在离开目录 `/home/yondy/android/idh.code'
输出错误的文件位置在customize/customize_cfg/sp6820a/res/build.sh
if [ -f ${ANDROID_CUSTOMIZE_BASE}/customer_cfg/${ANDROID_3RDPARTY_SELECTED_PRODUCT}/.chiplist.cfg ] ;then source ${ANDROID_CUSTOMIZE_BASE}/customer_cfg/${ANDROID_3RDPARTY_SELECTED_PRODUCT}/.chiplist.cfg echo "SH_INFO:chip_path($chip_path)" >&2 else if [ "$1" != "clean" -a "$1" != "idh" -a "$1" != "idhb" ] ; then echo "SH_INFO:Error: Can't find .chiplist.cfg [LINE:$LINENO] PWD($PWD)" >&2 exit 0 fi fi
经检查.chiplist.cfg是存在的,很大的可能是ANDROID_CUSTOMIZE_BASE或ANDROID_3RDPARTY_SELECTED_PRODUCT不正确
customize/shell/build.products.sh中定义了ANDROID_3RDPARTY_SELECTED_PRODUCT;调用过程是build.products.sh >> build.sh
export ANDROID_3RDPARTY_SELECTED_PRODUCT="$selected_product" unset ll_args[0] unset ll_args[1] [ $do_build ] && { $ANDROID_3RDPARTY_PRODUCTS_PATH/$selected_product/res/build.sh $subcmd ${ll_args[@]}; } cd $ANDROID_3RDPARTY_PRODUCTS_PATH/http://www.cnblogs.com/ if [ ${ll_ota} = "1" ]; then make otapackage >&2 customize/customer_cfg/$selected_product/res/build.sh update_image fi
实际上只编译android时,是不会执行到build.products.sh的,所以需要在其他的地方定义ANDROID_3RDPARTY_SELECTED_PRODUCT
customize/shell/build.3rdparty.common.sh定义了ANDROID_CUSTOMIZE_BASE
export ANDROID_3RDPARTY_BASE=$(readlink -f ${ANDROID_3RDPARTY_ANDROID_TOP}/3rdparty) export ANDROID_CUSTOMIZE_BASE=$(readlink -f ${ANDROID_3RDPARTY_ANDROID_TOP}/customize)
build.3rdparty.common.sh由customize/shell/make_android.sh调用
而make.sprd在调用make_android.sh时,只带了一个参数($(BUILD_MODE) ./make_android.sh $(KMOD_PATH)) $(DEAL_STDOUT_MODULE)
需要在这个地方将编译的project信息带进来,所以修改为($(BUILD_MODE) ./make_android.sh $(KMOD_PATH) $(PROJECT)) $(DEAL_STDOUT_MODULE)
make_android.sh中增加ANDROID_3RDPARTY_SELECTED_PRODUCT=$2
------------------------------------------------------
添加wifi的预设文件
/external/wpa_supplicant/wpa_supplicant.conf (/external/wpa_supplicant_6/wpa_supplicant/wpa_supplicant.conf) 可以配置wifi的默认SSID列表及关联优先级别(编译后是/etc/wifi/wpa_supplicant.conf)
network={ ssid="CMCC" key_mgmt=NONE priority=1 } network={ ssid="CMCC-EDU" key_mgmt=NONE priority=2 }
wifi驱动的相关参考见 http://blog.chinaunix.net/uid-27570663-id-3328552.html
----------------------------------
./mk -o=2sim sp6820a new 调用分析
./mk -> customize/shell/main.pl -> customize/make/makefile.sprd -> customize/shell/build.products.sh -> customize/customer_cfg/$selected_product/res/build.sh
customize/shell/main.pl
对输入的参数进行匹配,检查是否合法,提取出$project等参数
检查customize/make/${project}.mak文件是否存在
&parse_custmake(${project}); 解析mak文件,将里面的配置解析后存放到$ENV{$KEY} = $VALUE;
如果是new操作,则将project/mode/sim三个属性写入到 make.ini,再将make.ini的内容再读出来
然后生成相应的编译参数,放到数组mOpts中存起来, 再生成对应的编译命令,先执行prebuild.pl 初始化,再执行相应的命令进行编译
$kernel_ver = &gen_kernelver(); $uboot_ver = &gen_ubootver(); push(@mOpts, "ENABLE_LOG=$log"); push(@mOpts, "PROJECT=$project"); push(@mOpts, "ROOTDIR=$enterdir"); push(@mOpts, "CUR_SIM=$sim"); push(@mOpts, "SUPPORT_WIFI=$wifi"); push(@mOpts, "SUPPORT_BT=$bt"); push(@mOpts, "SUPPORT_GPS=$gps"); push(@mOpts, "SUPPORT_VT=$vt"); push(@mOpts, "CUR_MODE=$mode"); push(@mOpts, "KERNEL_VER=$kernel_ver"); push(@mOpts, "UBOOT_VER=$uboot_ver"); push(@mOpts, "IDH_PARAM=$idhparam"); push(@mOpts, "SUPPORT_MPDP=$ismpdp"); push(@mOpts, "SUPPORT_GSENSOR=$lsensor"); push(@mOpts, "SUPPORT_GSENSOR=$gsensor"); push(@mOpts, "SUPPORT_MSENSOR=$msensor"); if($cust_act eq "new") { &system_call("rm -rf $build_folder"); } ################### $cmdArg = "CMD_ARGU=\"@mOpts\""; $makeCmd = "make -f customize/make/makefile.sprd $cmdArg @mOpts"; &mkdir_according_path($logdir, "false");
执行prebuild.pl进行初始化
&system_call("touch $logdir/${project}_prebuild.log"); push @loglist, "$logdir/${project}_prebuild.log"; &system_call("perl customize/perl/prebuild.pl customize/make/${project}.mak 2>&1 | tee $logdir/${project}_prebuild.log");
customize/build/prebuild.pl
print "#####################################################################\n"; print "step[1]: Judge some error conditions\n"; print "#####################################################################\n"; 检查customize/make/${project}.mak是否存在 print "#####################################################################\n"; print "step[2]: parse customize/make/rules.mak\n"; print "#####################################################################\n"; &rules_parse(); 解析customize/make/rules.cfg,按行读取里面的内容,如CPY_FILE_TYPE = png:apk 进行指定文件的复制操作 print "#####################################################################\n"; print "step[3]: according to $filename generate hash table\n"; print "#####################################################################\n"; &generate_hash($filename); $kver = &kernel_ver_get(); $uver = &uboot_ver_get(); print "#####################################################################\n"; print "step[4]: clean softlink and hardlink\n"; print "#####################################################################\n"; &system_call("perl customize/perl/cleanall.pl $prj $makeValue{BUILD_SPRD_PLATFORM}"); print "#####################################################################\n"; print "step[5]: remove conflict file list \n"; print "#####################################################################\n"; my $conflictp = "3rdparty/conflict/$prj"; my $collision_file = "3rdparty/conflict/collision.lst"; &system_call("rm -rf $collision_file"); print "#####################################################################\n"; print "step[6]: generate customer app feature control files\n"; print "#####################################################################\n"; &system_call("perl customize/perl/appcfg.pl $prj"); ##根据用户的参数,在下面的java和cpp中将对应的APP启用或禁用
##"3rdparty/app/$makeValue{$type}/special/android/frameworks/base/core/java/android/util/SprdFeatureUtils.java";
##"3rdparty/app/$makeValue{$type}/special/android/frameworks/base/include/utils/SprdFeatureUtils.h";
print "#####################################################################\n"; print "step[7]: generate customer kernel cfg files\n"; print "#####################################################################\n"; #&system_call("perl customize/perl/kcfg.pl $prj"); print "#####################################################################\n"; print "generate kernel cfg folders and makefiles\n"; print "step[8]: judge whether kernel cfg src folder and dst folder are exist\n"; print "#####################################################################\n";
##将$kver/arch/arm/mach-$makeValue{BUILD_SPRD_PLATFORM}/board-$prj中与将ustomize/customer_cfg/$prj/kernel里的同名文件先删除
##也就是删除kernel/arch/arm/mach-sc8810/board-sp6820a里的文件
print "#####################################################################\n"; print "generate kernel cfg folders and makefiles\n"; print "step[9]: generate softlink between customer_cfg kernel folder and kernel cfg folder\n"; print "#####################################################################\n";
##将ustomize/customer_cfg/$prj/kernel里的文件软链接到$kver/arch/arm/mach-$makeValue{BUILD_SPRD_PLATFORM}/board-$prj
print "#####################################################################\n";
print "generate kernel cfg folders top Kconfig and Makefiles\n";
print "step[10]: generate kernel cfg top folder makefiles\n";
print "#####################################################################\n";
print "#####################################################################\n";
print "generate kernel cfg sub folders and sub makefiles\n";
print "step[11]: generate kernel cfg sub folder makefiles\n";
print "#####################################################################\n";
print "#####################################################################\n";
print "generate kernel driver folders and makefiles\n";
print "step[12]: generate softlink between 3rdparty module kernel folder and\n";
print "kernel driver folder\n";
print "#####################################################################\n";
##遍历3rdparty中的驱动目录,根据mak中的驱动配置,
print "####################################################################\n";
print "generate customer cfg hal softlink and makefile\n";
print "step[13]: generate softlink between customer cfg hal files and dst hal files\n";
print "####################################################################\n";
print "####################################################################\n";
print "generate 3rdparty module hal/framework/special softlink and makefile\n";
print "step[14]: generate hal/framework/specail softlink and makefile\n";
print "####################################################################\n";
print "####################################################################\n";
print "generate uboot softlink and makefile\n";
print "step[15]: generate uboot softlink and makefile\n";
print "####################################################################\n";
print "####################################################################\n";
print "generate factory mode softlink and makefile\n";
print "step[16]: generate engineering softlink and makefile\n";
print "####################################################################\n";
print "####################################################################\n";
print "generate special module softlink and chiplist\n";
print "step[17]: generate special module softlink and chiplist\n";
print "####################################################################\n";
print "####################################################################\n";
print "check file collision condition\n";
print "step[18]: check patch directory(3rdparty/customize)collision condition\n";
print "####################################################################\n";
&system_call("perl customize/perl/pcollision.pl $prj $collision_file $conflictp");
print "####################################################################\n";
print "generate dummy Android.mk in related folder\n";
print " step[19]: generate dummy Android.mk\n";
print "####################################################################\n";
编译命令调用到customize/make/makefile.sprd
new: $(hide) echo $(SHOWTIME) $@ing ... $(hide) echo $(BUILD_MODE) $(hide) echo $(SIM_OPT) $(hide) echo $(SUPPORT_WIFI) $(hide) echo $(SUPPORT_BT) $(hide) echo $(SUPPORT_GPS) $(hide) echo $(SUPPORT_VT) $(hide) cd $(SHELL_SCRIPT) && \ ($(BUILD_MODE) ./build.products.sh $(PROJECT) $(SIM_OPT) $(SUPPORT_WIFI) $(SUPPORT_BT) $(SUPPORT_GPS) $(SUPPORT_VT) fprebuild) $(DEAL_STDOUT_ACTION)
customize/Shell/build.products.sh >> customize/customer_cfg/$selected_product/res/build.sh update_image
customize/customer_cfg/Sp6820a/res/build.sh
source customize/customer_cfg/Sp6820a/.chiplist.cfg
source costomize/shell/build.3rdparty.common.sh
将编译用的文件复制到vendor目录
customize/customer_cfg/Sp6820a/res/AndroidBoard.mk:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/BoardConfig.mk:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/apns-conf.xml:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/BoardConfig_IDH.mk:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/rc.local:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/vold.fstab:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/system.prop:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/sprd-keypad.kcm:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/sprd-keypad.kl:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/sprd_apps.mk:./vendor/sprd/product customize/customer_cfg/Sp6820a/res/init.sp6820.3rdparty.rc:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/init.sp6820.rc:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/modem_bins:./vendor/sprd/hsdroid customize/customer_cfg/Sp6820a/res/recovery.fstab:./vendor/sprd/hsdroid