Jenkins-Android源码编译【架构设计】(适用鸿蒙/自动化/多产品/持续迭代)

文章目录

Jenkins-Android源码编译【架构设计】(适用鸿蒙/自动化/多产品/持续迭代)

Android系统开发经常需要用到自动化编译系统,用于正式发布/日构建/验证修改点/远程触发等。

Jenkins是最常用最广泛的DevOps工具之一。本文重点讲解如何在Jenkins上面部署灵活设计/解耦性强/扩展性强的AOSP编译系统。

通俗介绍Jenkins

Jenkins可以简单地理解为一个Server+Web应用,同时具有Winows+Linux+Mac等系统的版本。

https://www.jenkins.io/download/

本人极力推荐使用docker版本,后续维护性强 稳定性强。

可以在上面开发+定制你的自动化构建任务,然后将这个任务部署到内网/公网,其他工程师就可以远程访问了。

  • 开发工程师用于触发构建 + 发版本
  • 测试工程师用于下载固件 + 跑自动化测试

所以工程师之间互不干扰,少一些war!

Jenkins的文件格式就是war,寓意(开发/测试/运维)不再有战争。

框架设计

如果产品规模小, 管理+编译+存放固件 可以在同一个服务器上进行也可以。

当时如果公司规模大,产品杂,就有必要每个服务器各司其职了。

如下是我简单描述的一个框架:

  • Jenkins服务用于账号管理,Job管理,系统环境配置,系统插件配置,用户界面等

  • 编译服务器用于代码下载,更新,编译,整理固件等

  • FTP服务器用于按照规定命名/格式存放固件等,常常用于内部研发使用

  • Jfrpg Artifacts就是类似于Jenkins的服务器应用,可以快速查找/搜索想要的固件,并且支持安全扫描,常用于给别的部门使用,或者释放给客户使用

  • Jenkins Artifacts是自带的插件,存储和管理编译好的固件

Jenkins部署

系统/插件配置

  • 需要安装的系统插件:

  • Publish over SSH:用ssh协议发送固件的

  • E-mail:编译结果通知开发者

  • Build Timestamp: 编译时间戳,每次会默认保存启动的时间戳

  • ANSI Color: 颜色显示更加美观/明显

  • Office 365 Connector: 用于Teams远程触发编译/结果同志, 企业微信也支持的

  • Gitlab: 用于gitlab相关的

  • Repo: repo 相关的接口, manifest sync diff

  • Build periodically with parameters : 编译传入选项的UI控件

  • Set Build Name: 设置任务编译名字的UI控件

  • Active Choices: 可以选择的UI控件

  • File Parameter: 用于传入文件的的UI控件

  • Environment variables

  • Rebuild

  • ...

需要准备的系统配置:

  • Publish over SSH

  • E-mail,注意stmp的端口

  • 内网的用户名+密码

  • ...

JOB配置

  • 创建一个Job, 选择Freestyle project
  • 创建编译的UI界面,使用控件This project is parameterized

如下,是我简单设计的UI模板:


BUILD_PROJECTS(构建的项目)

复制代码
A10
B20
C50

BUILD_ANDROID_VERSION(项目的大版本)

复制代码
a13
a11
a10

BUILD_VERSION_NUMBER(项目的版本号)

复制代码

BUILD_SNAPSHOT(编译快照:将编译选项固定成一个标准的配置,方便于快速启动特定的构建)

复制代码
daily_build
no
user+gms+ota

BUILD_INTENT(开发 or 正式发布 or jenkins调试)

复制代码
dev
rel
jenkins_test

BUILD_SKU (是否支持GMS)

复制代码
gms
aosp

BUILD_VARIANT(编译user/userdebug)

复制代码
user
userdebug
eng

BUILD_TIMESTAMPS(是否指定时间戳)

复制代码

PACKAGES

  • BUILD_FULL_OTA (OTA整包)

  • BUILD_INC_OTA(OTA差分包)

    BUILD_SORCE_TARGETFILES_ID

    复制代码

    BUILD_TARGET_TARGETFILES_ID

    复制代码
  • BUILD_SPECIAL_OTA (客户定制包)

    复制代码
    no
    root ota

BUILD_SOURCE_SYNC (代码同步)

  • BUILD_RM_OUT (是否清除out环境)
  • BUILD_REPO_SYNC (是否同步最新代码)

SOURCE_CUSTOMZATION

  • BUILD_HOOK_LOCAL_MANIFEST (hook local manifests)

    [-----] chose files

  • BUILD_HOOK_DEFAULT_MANIFEST (指定manifest文件)

    [-----] chose files

  • BUILD_REPO_HOOK_BEFORE_BUILD (编译前执行命令)

复制代码

POST_BUILDS (编译后处理)

BUILD_UPLOAD (上传到服务器)

复制代码
Jenkins artifacts
FTP Server
JFROG

... ...

UI控件设计实际效果如下:

... ...

源码编译

环境准备

android源码编译主要在编译服务器上运行,服务机最好能够Linux系统,内存大,CPU强悍,核数多。

需要安装以下必备的工具:

  • android源码编译

    https://source.android.com/docs/setup/build/building?hl=zh-cn

  • git: 开发者必备的源码管理工具

  • repo: 管理庞大的Android源码各个仓库,每个仓库都是git管理。 由于有2和3两个版本,建议两个都安装

  • ssh/scp/rsync: 用于通过ssh协议传输文件,连接,同步

  • python2 / python3 : 最好都安装,ota包的编译需要两者

  • md5sum :用于文件校验

    ... ...

AOSP编译

基本框架
  • Jenkins UI

    相当于用户交互界面,相当于Jenkins的前端

    后端代码在Build Steps里面引用jenkins build scipts, 如下:

  • jenkins_build_scipts

    用户在Jenkins UI定制自己需要的编译,这个脚本获取这些前端数据,调用AOSP编译脚本进行固件的生成,然后进行分发+处理,可以理解为Jenkins的后端

  • aosp_build_scipts

    • 将被jenkins build scipts调用,是统一的编译脚本,需要使用统一的接口/入参/变量命名,可以适用于各个产品。
    • 此脚本应能避免掉高通/MTK产品编译方式的差异。不仅仅是jenkins使用,开发者平时也用
编译脚本
aosp_build_scipts

aosp_build_scipts需要根据公司产品的特色和需求,自行定制和开发,大概的模板类似于:

复制代码
./aosp_build.sh  [product_id] [variant] [gms/aosp] [sys/vnd/ota/inc_ota/...] [jobs]

也可以用环境变量的方式传入:

复制代码
export product_id=A11; export variant=user; ... ; ./aosp_build.sh

根据产品特点和团队建议选择,这里不再赘述。

jenkins_build_scipts
  • Step1:获取用户数据

jenkins获取前端主要是通过jenkins的环境变量加载功能实现。

  • Step2:编译执行

    编译大致可以分为4个阶段:

    • Stage1: 环境变量处理 :

      根据前端需求,对于入参进行处理,

      比如对于snapshot快照编译,需要获取对应的配置文件,进行编译

      比如编译差分包,如果没有传入source targetfiles,就需要中断编译了,不然没有进行

    • Stage2: 代码处理:

      根据前端需求,使用repo进行init/sync工作,抑或是集成local_manifests,抑或是替换掉default manifest。

    • Stage3: 编译+固件预处理

      根据前端需求,进行编译需要的固件,由于aosp_build_scipts是统一的,所以可以无缝衔接。

      编译完成后,根据公司标准的命名格式,进行命名/打包,并分发到同一个jenkins build id下面,用于区分不同的构建。

    • Stage4: 固件发送+编译后工作

      编译完成后,

      如果代码有改动/调整,需要reset原来的状态

      如果有些简单的信息,需要自行测试,比如key是否正确,组件是否都集成。

      根据jenkins build id发送到对应的local FTP 服务器,jfrog服务器,客户网盘等等,以及回传到jenkins artifacts。

      这个过程中需要用scp等,可以自行百度无密码传输的方法。

编译脚本设计结构大致如下:


MAIN:

./jenkins_build.sh : 编译主函数

Stage1

env_setup.sh

  • env_init.sh : 环境变量初始化
  • env_handler.sh : 环境变量处理流程
  • env_hook_configs.sh : 开放hook接口,也可以用于调试
Stage2
  • repo_init.sh : repo init 可以指定manifests的分支和具体的xml清单文件,以及处理local_manifests

  • repo_sync.sh : repo sync 可以指定是否清除本地修改/回退到最新/强制更新等

  • repo_handler.sh : repo manifest/diff/forall等操作

Stage3

build_main.sh : 编译主函数

build_setup.sh : 编译前准备工作,编译参数检验

  • build_image.sh : image编译主函数
    • build_sys.sh : sys编译
    • build_vnd.sh : vnd编译
    • build_image_handler.sh : image打包
  • build_ota.sh : ota编译主函数
    • build_full_ota.sh : 整包
    • build_inc_ota.sh : 差分包
    • build_customization_ota.sh : 定制包
    • ... ...

build_artifacts_handler.sh : 根据标准的命名格式,进行预处理/命名/打包

Stage4

post_build_main.sh :

  • post_build_pretest.sh : 编译完成后,是否进行基本信息的预测试,可以设置开关是否跑
  • source_handler.sh: 编译完成后,是否需要代码调整处理
  • upload_main.sh : 编译完成后,根据需要上传到固件到特定服务器
Projects:
  • init_product_a88.sh : a88产品差异化的部分
  • init_product_a66.sh : a66产品差异化的部分
  • ...
Utils
  • log_utils.sh : log打印/调试

  • common_utils.sh : 常用的工具代码

  • build_utils.sh : 编译的工具代码

  • ssh_utils.sh : ssh相关的工具代码

  • ...


发布管理

FTP服务器

  • 直接用 Publish over SSH,是Jenkins自带的工件发送
  • 但是程序员该有自己的开发/定制化意识,最好是自行写脚本,这样有便于想怎么传就怎么传,而且不用踩坑

jfrog

界面如下:

每个公司产品规划不同,不一定适用于每个公司。 如果要讲解jfrog,需要单独一篇文章了。

Jenkins artifacts

Jenkins Artifacts是自带的插件,固件如果编译完,传回jenkins的特定目录:${JENKINS_DATA_DIR}/jobs/${UPLOAD_BUILD_JOB_NAME}/builds/${UPLOAD_BUILD_ID}/archive

就会显示在任务的build id下面:

Tips

  • docker : 为了方便迁移服务器,解耦服务器环境的不同,最好将整个过程放置到docker

  • ccache : 为了提高编译速度,建议灵活使用ccache编译

  • email / teams/ 企业微信 :使用好通知机制,编译完是否成功,失败log等第一时间告知开发人员。 此外,还有远程触发编译的功能。

  • display name : 显示特定的项目名字

  • Build periodically with parameters: 添加日构建机制,每天编译最新的版本

  • descript name : 编译完成后,显示可以找到固件的网络地址

  • ... ...

结语

  • 这类工作理应是DevOps工程师做的,由于缺少HC,作为RD工程师,也顺带做了。老板致力于把我们培养成全栈工程师。
  • 虽然是简单的编译工作,但是完整的开发,内容其实也挺多的,需要长时间debug。
  • 一旦开发好,开发效率杆杆地提升,编译的便捷性也得到了提升。
  • 能效工程虽然是辅助开发的,但是可以无形中明显提升RD进度和产品标准化。
  • 如果是鸿蒙系统开发,只需要适配不同的aosp_build_scipts即可。
相关推荐
WenGyyyL41 分钟前
《Android 应用开发基础教程》——第十三章:权限管理机制与运行时权限请求(以拍照/存储为例)
android·java·权限·极限编程
帅得不敢出门42 分钟前
Android Framework学习七:Handler、Looper、Message
android·学习·安卓·handler·looper·message
lqj_本人1 小时前
UniApp 实现的文件预览与查看功能#三方框架 #Uniapp
uni-app·harmonyos
ChinaDragonDreamer5 小时前
HarmonyOS:使用PickerController将编辑后的图片替换原图
harmonyos·鸿蒙
HMS Core5 小时前
【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit (3)
华为·harmonyos
bestadc5 小时前
鸿蒙 Location Kit(位置服务)
harmonyos
爱笑的眼睛115 小时前
HarmonyOS Navigation组件深度解析与应用实践
harmonyos·harmonyos next
鸿蒙布道师5 小时前
鸿蒙NEXT开发动画案例9
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
bestadc5 小时前
鸿蒙 Background Tasks Kit(后台任务开发服务)
harmonyos
奔跑吧 android8 小时前
【android bluetooth 协议分析 01】【HCI 层介绍 8】【ReadLocalVersionInformation命令介绍】
android·bluetooth·hci·bt·hcicmd·readlocalver·bt5.3