Android 使用 Jenkins 实现自动化打包【流程】&【踩坑】

2023-11-09

引言

每个Android开发应该都有经历过正在码代码的时候突然被打断要求打个啥啥环境啥啥配置的安装包,然后就得暂存代码、切换分支、更改配置、等待build、balabala……往大了说就是浪费时间消耗员工价值对公司的不负责(胡扯),往小了说就是这TMD真的好烦啊(真实)。
如果可以将打包操作交给产品/测试/运维/XX呢?谁要安装包谁自己打去别来烦我。Then,就是自动化打包的事情了。自动化打包应该都有听说,感觉很高大上很难搞。然而实际操作后也就那么回事儿。下文将从头至尾图文并叙得记录过程和踩坑。

目录


#正文

1,下载 Jenkins

Jenkins 官网下载地址:https://jenkins.io/download/
选择你喜欢的对应你的操作系统的版本(我的是长期支持的Windows版本)
Jenkins 下载截图

2,安装 Jenkins

下载后别BB直接安装就行。没啥好说的,安装目录想改就改,下一步就行。
安装好你的默认浏览器会自动弹出窗口链接:http://localhost:8080
入门
如图,路径都给了就不用多说了,找到对应文件把里面的密码复制粘贴上去。继续。
新手入门
安装插件。我们只用到2个插件,选择安装就好了。找到Gradle和Git(如果你是SVN,不用我说吧?),勾选后安装,相关的依赖插件会自动安装的。
下面几步就不截图了,并不是必要过程。
然后会让你创建管理员账号,选择继续使用admin就行(想创建也随你开心)。
继续,让你配置路径,也跳过就行(还是随你开心)。
已就绪,开始使用。
PS:如果上述安装插件的地方你没有安装需要的Gradle和Git插件,你也可以进入 Jenkins 环境页面后选择[系统管理] - [管理插件] - [可选插件],然后去找/搜到对应插件安装。
PS:*本博就是本地配置一下试试,服务器上肯定是该创建账号、配置路径、安装需要的别的插件balabala。

3,配置 Jenkins

全局工具配置
配置需要的插件信息
配置JDK、Git、Gradle:
配置JDK信息
我的JDK路径当初安装的时候不规范,打码是为了防止误导。
Git配置
Git貌似不能自动安装,貌似默认的不改动也能用。有兴趣可以试试。
Gradle配置
Gradle配置同上,没啥好说的。
划重点 -- Android SDK需要另行配置,见下图
系统配置
环境变量
[系统管理] - [系统设置] - [全局属性] - [环境变量],对应图去找,添加环境变量,键为“ANDROID_HOME”,值指向SDK目录。
以上,配置完成。

4,新建任务并配置

新建任务
自由风格
选择自由风格,确定。
基本信息
基本信息里点击右下角高级有个“使用自定义的工作空间”,勾选可以指定目录,不勾选默认在 Jenkins 安装目录下的 “workspace” 文件夹里。
源码管理
源码管理选择Git,URL填入你的项目地址,没有认证的时候会报错,点击图中圈出的“Add”,弹出下图:
Add
添加凭证后下拉选择对应凭证,如果正确则不会报错,同时下方展示检出分支。默认master分支,可以自己看情况指定某分支。
构建触发器不用管。
构建
构建2
Tasks是构建执行的语句,一般都是“app:clean app:assembleRelease”,先clean再build。
构建后操作看需求,可以实现自动上传apk到蒲公英/fir、邮件通知等等。

5,构建

构建
点击立即构建后会出现下图进度展示条。
构建后进度条
成功失败
蓝色正常,build成功。红色表明构建失败,鼠标移动右侧有个向下箭头,点击展开选项,点击控制台输出可以查看错误。

6,参数化构建

构建时可选参数,这样就可以打出不同参数的包。比如不同baseUrl。
参数化构建
[添加参数] - [选项参数],或者你愿意用某种参数都行。
选项参数
参数化构建配置上了,需要在构建时将参数映射到代码中,如下图:
导入代码
以上, Jenkins 上的参数化构建配置完成。我们还需要在代码中接收该参数。
参数会映射到gradle.properties文件中的对应参数名,我们先在该文件中定义一个参数并赋默认值:

......
baseUrl = "http://qa-xxxxxx.com/api/"
......

然后在build.gradle中获取该参数并添加到BuildConfig.java中:

......
android {
	......
    defaultConfig {
	    ......
        buildConfigField "String", "baseUrl", baseUrl
    }
	......
}
......

BuildConfig.java
代码中可以直接获取该参数:BuildConfig.baseUrl
以上配置后,项目会有所变化:
Build with Parameters

踩坑

坑1:AAPT error

错误日志1
错误提示:java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT error: check logs for details
百度的解决方案有三种,一是说在gradle.properties中加入代码android.enableAapt2=false,二是说统一各module的compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion等,三就是更不相干的东西了。
这里我要说一下,各位的代码本地肯定都是跑过的,编译打包都正常,只是上了 Jenkins 才报了这个错,这三个解决方案都站不住脚啊!理论上不应该是代码里的啥问题啊!!
折腾了好久,最后放弃百度,在某不存在的搜索引擎找到个说法,Gradle路径太长了导致编译错误balabala……
其实仔细看错误日志,会发现那一串错误都是好长的路径(共同点),所以这个说法显然站得住脚。
GRADLE_USER_HOME
项目设置里的构建处,点击右下角高级,找到下方此选项打勾。
再次构建,BUILD SUCCESSFUL。

坑2:aidl is missing

这个问题也是没话说了。
问题发生在我部署到服务器的时候,先是提示说少build-tools,然后说少对应版本的sdk,挨个上传服务器sdk目录。然后就报了这个错。但是本地都是正常的,sdk没问题,没理由到服务器上就不行了啊。
这里我要谴责一下运维同事,他坚定的告诉我服务器上的sdk是从另一个Android同事那里copy上传的(windows),但后来发现是他自己down的(linux)。找该Android同事询问,得到的回复是“我不知道啊”、“你百度看看”。:)
折腾了很久才定位到这个问题,服务器是Linux环境,本地是Windows环境,sdk是分版本的。不同版本的sdk下的文件不一致,so,报错。Fxxk。

结语

很多东西感觉很难,其实实践下来也就那么回事儿。事先少想点儿乱七八糟的,上去就是干。另外,Fxxk。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 使用 Jenkins 实现自动化打包【流程】&【踩坑】 的相关文章

随机推荐

  • ros 源码安装

    版本lunar 系统版本debian 9 8 参考 http wiki ros org lunar Installation Source 1 Installing bootstrap dependencies sudo apt get i
  • Flutter 实现安卓原生系统级悬浮窗

    Flutter实现安卓原生系统级悬浮窗 原创 As Kai 博客地址 https blog csdn net qq 42362997 如果以下内容对您有帮助 点赞点赞点赞 最近碰到了一个需求 使用Flutter实现悬浮窗效果 想来想去只能使
  • 关于 ioctl 的 FIONREAD 参数

    ioctl 是用来设置硬件控制寄存器 或者读取硬件状态寄存器的数值之类的 而read write 是把数据丢入缓冲区 硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区 ioctl keyFd FIONREAD b 得到缓冲区里
  • cmake message显示

    cmake message 在output中显示 PS C mywork mycpp helloworld build gt cmake Configuring done Generating done Build files have b
  • 雅可比算法求矩阵特征值C语言源代码,雅可比(Jacobi)计算特征值和特征向量

    雅可比迭代法法 在图形图像中不少地方用到求矩阵的特征值和特征向量 好比主成分分析 OBB包围盒等 编程时通常都是用数值分析的方法来计算 这里介绍一下雅可比迭代法求解特征值和特征向量 雅可比迭代法的原理 网上资料不少 详细可见参考资料1 这里
  • 【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

    简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下
  • Linux中桥接模式配置IP

    前言 本文主要介绍如何使用桥接模式配置IP 在使用虚拟机进行通信时 经常需要面临三种模式选择 不同模式之间配置不同 系统环境 CentOS 7 两种模式区别 NAT 虚拟机从属于主机 访问外部网络必须通过主机访问 虚拟机的IP只有主机才能识
  • 用DETR进行目标检测的predicat文件

    文章目录 前言 二 使用步骤 1 更改官方detr中308行的类别数 2 根目录加入检测文件 总结 前言 由于最近研究DETR目标检测 但是发现官方给的代码缺少了predict文件 于是自己写了一个 但是写代码的过程中也想到了一些问题 比如
  • QT QPushButton点击事件的实现

    最近需要对按钮实现效果 当鼠标按下时按钮有效果1 然后鼠标松开时按钮有效果2 分析 这里没有现成的信号可以使用 需要重载mousePressEvent 及 mouseReleaseEvent 事件函数 在mouseReleaseEvent
  • 技术笔记

    https docs qq com doc DUVBFRUNvUW1SUXB5
  • js模仿f11全屏_js触发f11全屏

    document on keydown function e var e event window event arguments callee caller arguments 0 if e e keyCode 122 捕捉F11键盘动作
  • 【CSS】css样式控制div水平垂直居中的六种方法

    1 绝对定位方法 不确定当前div的宽度和高度 采用 transform translate 50 50 当前div的父级添加相对定位 position relative 如图所示 代码如下 div background red posit
  • grep、sed、awk、perl等对正则表达式的支持的差别

    以perl的正则为基准 不同的用法以粉红色标出 因为spacemacs支持vim正则表达式操作 而且能够实时显示匹配内容和替换结果 可以作为perl脚本的正则表达式debug手段 转载来自 grep sed awk perl等对正则表达式的
  • Qt:信号和槽总结(1,C++11下的信号和槽 2,第五个参数 3,阻塞 )

    Qt 信号和槽总结 1 C 11下的信号和槽 2 第五个参数 3 阻塞 信号和槽是Qt特有的一种通讯方法 具有以下特点 信号与槽的连接比较灵活 可以一对一 一对多或者是多对一 信号与槽的绑定与解除也十分的灵活 使用connect以及disc
  • CONTAINING_RECORD宏原理与使用详解

    先不急着说CONTAINING RECORD宏 我们从最浅显的代码开始讲解 一 0指针的妙用 0指针 即nullptr NULL 空指针 是不是很常见 一遇到它往往就是segment fault 代码 如下 struct Test int
  • Vue实现Alert插件

    实现alert插件 在Vue中我们可以使用 Vue component tagName options 进行全局注册 也可以是在组件内部使用 components 选项进行局部组件的注册 全局组件是挂载在 Vue options compo
  • python的with关键字

    前言 with表达式其实是try finally的简写形式 但是又不是全相同 格式 格式 with context as var pass 其中的context是一个表达式 返回的是一个对象 var用来保存context表达式返回的对象 可
  • git pull: Please commit your changes or stash them before you merge

    参考 Git冲突 commit your changes or stash them before you can merge 总结 如果git pull 报错 Please commit your changes or stash the
  • Hyperledger Fabric能否大规模运行?

    我很高兴回答这个问题 简短的回答是 是的 确实如此 我的疑问 我对大规模Hyperledger Fabric Fabric 的性能提出了很多疑问 很多时候 人们已经完成了一些 或阅读 听说过 性能测试 比如在他们的笔记本电脑或早期版本的Fa
  • Android 使用 Jenkins 实现自动化打包【流程】&【踩坑】

    引言 每个Android开发应该都有经历过正在码代码的时候突然被打断要求打个啥啥环境啥啥配置的安装包 然后就得暂存代码 切换分支 更改配置 等待build balabala 往大了说就是浪费时间消耗员工价值对公司的不负责 胡扯 往小了说就是