现状:

有两个开发版,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/*),然后编译通过,在公版上烧录镜像也能正常运行

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐