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

news2025/1/23 4:03:34

jenkins_aosp

文章目录

  • Jenkins-Android源码编译【架构设计】(适用鸿蒙/自动化/多产品/持续迭代)
    • 通俗介绍Jenkins
    • 框架设计
    • Jenkins部署
      • 系统/插件配置
      • JOB配置
    • 源码编译
      • 环境准备
      • AOSP编译
        • 基本框架
        • 编译脚本
          • aosp_build_scipts
          • jenkins_build_scipts
            • Stage1
            • Stage2
            • Stage3
            • Stage4
            • Projects:
            • Utils
    • 发布管理
      • FTP服务器
      • jfrog
      • Jenkins artifacts
    • Tips
    • 结语

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

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

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

通俗介绍Jenkins

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

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

image-20240302184045917

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

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

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

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

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

框架设计

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

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

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

image-20240305184407699

  • 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控件设计实际效果如下:

image-20240305184546432

… …

源码编译

环境准备

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编译

基本框架

image-20240306154914902

  • Jenkins UI

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

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

    image-20240306150515439

  • 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的环境变量加载功能实现。

image-20240306161028439

  • 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

界面如下:

image-20240306145824590

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

Jenkins artifacts

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

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

image-20240305183310716

Tips

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

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

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

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

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

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

  • … …

结语

  • 这类工作理应是DevOps工程师做的,由于缺少HC,作为RD工程师,也顺带做了。老板致力于把我们培养成全栈工程师。
  • 虽然是简单的编译工作,但是完整的开发,内容其实也挺多的,需要长时间debug。
  • 一旦开发好,开发效率杆杆地提升,编译的便捷性也得到了提升。
  • 能效工程虽然是辅助开发的,但是可以无形中明显提升RD进度和产品标准化。
  • 如果是鸿蒙系统开发,只需要适配不同的aosp_build_scipts即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1495497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

灵魂指针,教给(一)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 一、内存和地址 1.1 内存 在介绍知识之前,先来想一个生活中的小栗子: 假如把你放在一个有100间屋子的酒店…

上海亚商投顾:沪指震荡微涨 AI手机、军工板块集体走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日低开后震荡回升,黄白二线分化明显,银行等权重板块走势较强。AI手机概念股持续…

pytorch_retinaface训练Resnet50_Final.pth过程+无图版安装Nvidia+CUDA驱动GPU

背景 当前处于人脸检测分支,项目就是retinaface官方的代码加上数据集目录结构,目的是训练出最后的模型文件Resnet50_Final.pth 代码 https://gitee.com/congminglst/pytorch_-retinaface.git 项目结构与设计 图片数据集采用widerface, 前…

STM32CubeIDE基础学习-STM32CubeIDE软件快捷键介绍

STM32CubeIDE基础学习-STM32CubeIDE软件快捷键介绍 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件快捷键介绍前言第1章 查看快捷键方法第2章 设置快捷键方法第3章 常用快捷键示例总结 前言 这个STM32CubeIDE软件使用的是Eclipse框架的开发环境,所以所使用的快捷…

AntV L7初体验

本案例使用L7库和Mapbox GL JS创建的简单地图可视化示例&#xff0c;加载点数据。 文章目录 1. 引入 CDN 链接2. 导出模块3. 创建地图3.1. 注册 token3.2. 创建地图实例 4. 创建场景5.创建点图层6. 演示效果7. 代码实现 1. 引入 CDN 链接 <!-- 1.引入CDN链接 --> <!--…

泰迪智能科技-2024年高校大数据人才培养探索模式

随着数字经济的高速发展&#xff0c;对于大数据人才的需求日益增长。产业数字化和数字产业化之间的关系&#xff0c;已经成为推动社会发展的关键。为此&#xff0c;高校及产业界需要紧密配合&#xff0c;以培养出符合时代需求的大数据人才。 数字产业化与产业数字化高速发…

HarmonyOS NEXT应用开发案例集

概述 随着应用代码的复杂度提升&#xff0c;为了使应用有更好的可维护性和可扩展性&#xff0c;良好的应用架构设计变得尤为重要。本篇文章将介绍一个应用通用架构的设计思路&#xff0c;以减少模块间的耦合、提升团队开发效率&#xff0c;为开发者呈现一个清晰且结构化的开发…

windows11配置电脑IP

windows11配置电脑IP 选择"开始>设置>“网络&Internet >以太网”。在 "属性"下&#xff0c;编辑IP地址&#xff0c;子网掩码&#xff0c;网关以及DNS。

Qt ini配置文件

ini文件用于保存用户的设置操作&#xff0c;下列以背景颜色设置为例子 暂时默认设置为白色背景 这段代码放置在主窗口的构造函数中&#xff0c;用于初始化读取ini文件 QString color;QSettings *set new QSettings("color.ini",QSettings::IniFormat);set->begi…

《探索虚拟与现实的边界:VR与AR谁更能引领未来?》

引言 在当今数字时代&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术正以惊人的速度发展&#xff0c;并逐渐渗透到我们的日常生活中。它们正在重新定义人与技术、人与环境之间的关系&#xff0c;同时也为各行各业带来了全新的可能性。…

学术论文GPT的源码解读与二次开发:从ChatPaper到gpt_academic

前言 本文的前两个部分最早是属于此旧文的《学术论文GPT的源码解读与微调&#xff1a;从ChatPaper到七月论文审稿GPT第1版》&#xff0c;但为了每一篇文章各自的内容更好的呈现&#xff0c;于是我今天做了以下三个改动 原来属于mamba第五部分的「Mamba近似工作之线性Transfor…

【YOLO v5 v7 v8 v9小目标改进】RevCol:解决深度学习信息从低层(输入)传递至高层(输出)的过程中,信息会逐层丢失问题

RevCol&#xff1a;解决深度学习信息从低层&#xff08;输入&#xff09;传递至高层&#xff08;输出&#xff09;的过程中&#xff0c;信息会逐层丢失问题 学习解耦表示可逆列网络&#xff08;RevCol&#xff09;子特征1&#xff1a;多级可逆单元子特征2&#xff1a;可逆列架构…

实践航拍小目标检测,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测&#xff0c;基于yolov…

LLM | GPT-NEOX论文详解

GPT-NEOX使用旋转位置编码。模型权重使用float16表示。最大序列长度为2048。 论文题目&#xff1a;2022.04.14_GPT-NeoX-20B: An Open-Source Autoregressive Language Model 论文地址&#xff1a;2204.06745.pdf (arxiv.org) 论文代码&#xff1a;EleutherAI/gpt-neox: An imp…

初次安装WordPress后如何进行网站设置(主题安装、插件安装、网站美化、网站备份、安全性提升、伪静态、多域名设置等)WordPress网站常见问题设置指南

专栏地址: WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么?为什么用它建站?怎么安装与部署? 使用腾讯云快速搭建WordPress网站流程详解 ...... 1. 前言 专栏上几篇文章介绍了小白零基础如何使用腾讯…

Golang的Channel源码阅读、工作流程分析。

Channel整体结构 源码位置 位于src/runtime下的chan.go中。 Channel整体结构图 图源&#xff1a;https://i6448038.github.io/2019/04/11/go-channel/ Channel结构体 type hchan struct {qcount uint // total data in the queuedataqsiz uint // si…

09 |「ViewPager」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、ViewPager 简介二、ViewPager 与 Fragment 结合1、ViewPager Fragment 实现底部页面导航2、ViewPager Fragment BottomNavigationView 实现底部页面导航3、ViewPager Fragment TabLayout 实现底部页面…

分类算法(Classification algorithms)

逻辑回归(logical regression&#xff09;&#xff1a; 逻辑回归这个名字听上去好像应该是回归算法的&#xff0c;但其实这个名字只是在历史上取名有点区别&#xff0c;但实际上它是一个完全属于是分类算法的。 我们为什么要学习它呢&#xff1f;在用我们的线性回归时会遇到一…

WPF 自定义彩色控制台功能

文章目录 前言环境流内容一个简单的控制台 自动添加数据无法添加数据模板代码添加参数简单的案例添加和清空功能完善代码 额外功能添加移动到底部添加样式 总结 前言 在WPF中添加模拟控制台&#xff0c;可以试试的看到最新的日志信息。但是普通的TextBlock只是纯粹的黑色&…

【C++】十大排序算法之 堆排序 计数排序

本次介绍内容参考自&#xff1a;十大经典排序算法&#xff08;C实现&#xff09; - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序…