-
单元测试:为了在一定程度上规避问题代码的上线,在构建之前,我们需要先对代码进行单元测试。只有通过了单元测试才能继续进行SDK构建。
-
SDK 构建:个推 SDK 经常会有一些定制需求,而这些定制需求的功能类似,所以我们可以根据不同的定制需求,结合个推的预编译插件,选择编译不同的代码,以减少开发成本。
-
Jar/AAR 文件合规性检验:对 SDK 来说,构建输出的产物一般为 aar 或 jar 文件。为保证输出的文件合规性,我们需要对输出产物的格式(包括版本号、域名等信息)做最终的检测。
-
真机自动化测试(可选):如果我们希望生成的 SDK 可以在真机上模拟运行测试,则可以选择这个步骤。
-
资料包归档:由于我们最后输出的文件包含集成文档、demo 等等,所以构建的最后阶段,我们需要将这些资源文件进行归档并放到指定的目录下。
-
通知构建者:有些时候构建可能需要一定的时间,构建者会异步地去处理其他事情。当构建完成的时候,我们需要通知相关的构建人员。
根据上述需求的分析,一个完整的持续集成流程图如下所示:
首先,进入准备阶段(prepare), 在该阶段会进行打包前的准备工作,比如环境准备等。接着是解析编译打包相关参数(parse jenkinsConfig), 用于之后的打包构建,包括模块依赖组合的支持等。
然后是拉取相关打包代码(checkout code)阶段。随后进入代码检测(Android Lint)阶段和单元测试阶段(Unit Testing)。通过前面的单元测试以及代码检测之后就可以进入我们的编译 SDK 阶段(Build SDK)了, 在该阶段我们可以配合个推的预编译插件以及相关的打包环境变量参数,选择相对应的模块组合或者选择对应的功能代码进行按需编译。
编译完成后,我们需要对相关的输出产物(JAR/AAR)进行格式检测(CheckJar 阶段)。待检测通过就可以进行真机模拟测试了(Automated Testing 阶段,可选),随后就可以输出构建产物(PrintSDK 阶段)并发送邮件通知相关构建人员(Email Notification 阶段)。至此,一次完整的打包流程已经结束。
Android 构建环境管理
==================
上文介绍了打包构建方案的流程,但是在实践中,我们会发现随着构建的任务越来越多,构建的环境会变得越来越繁杂,难以管理。
痛点分析:当我们依赖于宿主机构建 Android 时,不同的项目有着不同的 gradle 环境。随着 gradle 的升级、项目的迭代,当不同的构建项目任务数量越来越庞大时,宿主机的 gradle 环境就越容易出现污染。另外,由于构建的环境依赖宿主机的编译环境,一旦宿主机的编译环境发生变化,就很容易对构建项目产生影响。
为解决这个问题,我们可以将不同的 Android gradle 构建环境放进一个 Docker 容器中。Docker 是一个开源的应用容器引擎,可以实现虚拟化,也可以由开发者打包应用或者依赖包到一个轻量级、可移植的容器,然后发布至不同的机器上。容器完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 App), 更重要的是容器性能开销极低。
在每次编译构建时我们都依赖于一个 Docker 容器的环境,通过这种方式将任务之间的编译环境以及与宿主机之间通过 Docker 容器隔离开来,这样可以保证宿主机的环境变化对编译任务不产生影响,保证构建环境的干净。再之后随着 gradle 版本升级,我们需要升级并发布对应的Docker镜像版本,以兼容高版本的编译环境、做相应的环境版本管理。
Jenkins Pipeline 提供了使用 Docker 镜像作为构建环境的功能,代码如下:
pipeline {
agent {
docker {
image ‘allbears/jenkins-android:1.0.1’
}
}
}
维护和扩展
使用 Pipeline 构建时,开发者可以通过维护 Jenkinsfile对打包功能进行版本管理。这种构建方式更方便,开发者可以自由地回归历史版本进行打包。Jenkinsfile 的大致结构模板如下。
pipeline{
agent {
docker {
image ‘allbears/jenkins-android:1.0.1’ //指定构建环境
}
}
stages {
stage(‘Prepare’){
steps {
echo “构建前准备”
}
}
stage(‘Parse Jenkins Config’){
steps {
echo “Jenkins 构建参数解析”
}
}
stage(‘Checkout Code’){
steps {
echo “构建代码检出”
}
}
stage(‘Android Lint’){
steps {
echo “代码静态检测”
}
}
stage(‘Unit Testing’) {
steps {
echo “单元测试”
}
}
stage(‘Clean’) {
steps {
echo “编译前环境初始化”
}
}
stage(‘Build SDK’) {
steps {
echo “构建 SDK”
}
}
stage(‘Check JAR’) {
steps {
echo “Jar 包合规性分析”
}
}
stage(‘Automated Testing’) {
steps {
echo “自动化测试”
}
}
stage(‘Print SDK’) {
steps {
echo “构建产物归档”
}
}
stage(‘Email Notification’) {
steps {
echo “邮件通知”
}
}
}
}
从上述的 Jenkinsfile 中我们不难得知,每个流水线会由不同的 stage 组成,而每一个 Stage 则可以作为一个独立的小功能模块。开发者可以通过将不同的 stage 进行排列组合来进行相应的扩展。
总结
==
人工构建过程繁琐、操作耗时,还容易在手动打包过程中引入一些风险。个推使用 Jenkins 自动化构建免去了繁琐的人工操作过程,充分解放了研发人员的生产力。此外,个推使用Pipeline方式“持续集成”构建,让研发人员管理、迭代构建工程更加方便。
最后
==
在这里我也分享一份由几位大佬一起收录整理的**Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料**
这些都是我闲暇时还会反复翻阅的精品资料。可以有效的帮助大家掌握知识、理解原理。当然你也可以拿去查漏补缺,提升自身的竞争力。
有需要的话可以前往 Github 链接查阅。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/61e6a9eb550c19552bc05ca0d3bf2928.jpeg)
题外话
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
精编汇总、常见源码分析等学习资料。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
[外链图片转存中…(img-eG9TSL4D-1713613552126)]
希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!