多产品共仓
现状:
有两个开发版,cpu相同,开发板有些差异(其中一个是公版),两个产品的代码相识的度高,vendor仓只改了一个配置,内核仓添加了特有驱动,主要适配修改在device/soc和device/board两个仓
系统版本:openharmony 5.1
要求:
共用一个vendor仓,编译命令中product_name不变,device下的soc,board仓根据产品分仓
方案:把新板子的soc,board两个仓合并到主干,共用一个仓,vendor下config.json, patch.yml通过py脚本替换;soc,board仓的代码根据编译参数添加全局变量、定义宏,用宏隔离不同产品的代码(device下有些配置文件的内容难以通过宏隔离,通过添加新文件解决,通过编译文件中的宏等判断选哪个配置文件);
最终方案:在实际做的过程中,参数传递不太方便,还涉及很多编译逻辑修改,调试很麻烦,时间上不允许进行这样的定制修改和调试,还可能引入新问题,然后再进一步简化方案为:soc, board仓也添加ohos_hh文件夹(与build_maker参数值对应),将新板子的适配代码放到此目录下,编译时先把新板子的适配代码替换到对应的位置,然后再编译;后续如果需要编译公版镜像,只需要把编译命令中的--build_maker ohos_hh去掉,这时编译前会先恢复为公版原本的代码,此方案简单易操作,不易引入新问题
1. 查找build 参数有哪些地方处理:找到 build/hb/resources/args/default/buildargs.json 文件,参考其他编译参数,添加build_maker,如果不带这个参数值,如下配置,也会走参数处理函数,传的是默认参数值空字符串

2. 添加编译参数处理函数(build/hb/resolver/build_args_resolver.py), 让编译参数可全局使用:

还需在//build/config/BUILDCONFIG.gn中声明此变量

3. vendor中添加新目录(ohos_hh),用于保存,特定产品的定制化配置(后续编译命令中build_maker参数的值也设为ohos_hh),这两个文件从vendor/${product_company}/${product_name}/下复制过来,后续新板子的特性修改,可通过打patch方式,添加patch和修改ohos_hh下的patch.yml文件;项目配置可修改config.json,如新板子下selinux是关闭的

4. 添加脚本文件,对上面两个文件进行处理(大概内容:1.创建vendor/${product_company}/${product_name}/build_maker/bak文件夹,将默认的config.json,patch.yml复制到bak备份文件夹,用ohos_hh下的文件替换默认的这两个文件;2.也要提供不带参数时正常编译方式,将备份的文件再替换回去,恢复原状)

5. 添加环境变量,通过python文件添加,如:
os.environ['BUILD_MAKER123'] = "88855" // 没有效果
通过sh文件添加,如:
echo "export BUILD_MAKER66=1234" >> ~/.bashrc
source ~/.bashrc
变量写进去了,但通过source命令不能让其立即生效(通过shell窗口手动执行有效),后续此变量也不能用
另一种方法(在最初编译脚本build/build_scripts/build.sh中添加,后续的sh脚本都是此脚本的子进程):
export BUILD_MAKER="$var" // 获取参数,直接用export导出
经验证,此方法可行,但后续执行的其他sh脚本的打印此变量,不能打印出来,但在编译日志中能看到,并不是不生效
6. 编写新板子的适配文件处理脚本 build/hb/util/prebuild/build_maker_deal.py (有些函数后续再合并)
def main():
len_arg = len(sys.argv)
if '--product-name' not in sys.argv:
print(f"[ERROR]: --product-name must be provided")
return -1
else:
index = sys.argv.index('--product-name')
product_name = sys.argv[index + 1]
current_ohos_root_path = os.path.dirname(os.path.dirname(
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
# 找到vendor下基础路径
product_path = os.path.join(current_ohos_root_path, "../vendor/***/{}".format(product_name))
# 如果没有--build_maker参数,将此参数带来的修改复原
if '--build_maker' not in sys.argv:
resume_bak_file(product_path)
del_bak_file(product_path)
resume_soc_bak_file(current_ohos_root_path)
del_soc_bak_file(current_ohos_root_path)
resume_board_bak_file(current_ohos_root_path)
del_board_bak_file(current_ohos_root_path)
return
else:
index_build_maker = sys.argv.index('--build_maker')
if len_arg <= index_build_maker + 1:
resume_bak_file(product_path)
del_bak_file(product_path)
resume_soc_bak_file(current_ohos_root_path)
del_soc_bak_file(current_ohos_root_path)
resume_board_bak_file(current_ohos_root_path)
del_board_bak_file(current_ohos_root_path)
return
# 获取--build_maker编译选项的值
build_maker = sys.argv[index_build_maker + 1]
# 备份vendor下的2个配置文件
if bak_file(product_path) == False:
print('[ERROR]: bak file failed')
if build_maker != None and replace_maker_file(product_path, build_maker) == False: #把ohos_hh的两个配置文件替换过来
print('[ERROR]: replace maker file')
# soc、board下的,ohos_hh的代码替换公版代码、配置
replace_soc_maker_file(current_ohos_root_path, build_maker)
replace_board_maker_file(current_ohos_root_path, build_maker)
7. 在build/build_scripts/build.sh中添加先板子的文件处理脚本的调用,要在开始编译前就调用,处理好相关文件

8. 编译命令(新增了编译选项:--build_maker ohos_hh)
./build.sh --product-name ***** *** *** --build_maker ohos_hh
9. 测试:
重新下载代码编译时带 “--build_maker ohos_hh”编译选项时编译出的镜像在新板子上烧录,运行正常;
不带--build_maker ohos_hh编译选项编译时,有报错( ../kernel/src_tmp/***; 有以前的缓存;我中途也尝试改过内核,其他人不一定遇到),删除缓存(rm -rf ./out/kernel/*),然后编译通过,在公版上烧录镜像也能正常运行
更多推荐

所有评论(0)