今天我们来谈一谈用python做Android项目自动化构建的过程。我们知道在常规的Android开发过程中,开发人员打包的时候需要在Android Studio当中进行,或者通过gradle命令,但是这样的过程不够灵活,最起码它难以满足我们的以下几个需求:

1、如果你公司应用有多个代理商,而且每个代理商在logo,启动页等方面有个性化的需求,而且需要经常打包的情况,这个时候开发人员就不得不经常性的更改代码,替换资源,而且还很容易出错。

2、传统的打包的操作必须要由开发人员来执行,每一次改动都要麻烦开发人员来重新打包,并且开发人员必须要一直关注着Android Studio的打包情况,没有个性化的消息提醒机制。

3、一个应用如果需要做多个代理商打包的情况,那么就需要给每一个代理商在app目录下面建立他独有的文件夹,里面包含该代理商的图片资源或者配置信息,会使得整个代码的目录结构看起来很糟糕,如下图所示:

为了解决这些痛点,我们今天要来实现自动化打包,我们先看一下最终的实现效果再来深入讨论该功能的技术实现,首先我们看到的是一个web页面,这个页面你在任何地方都可以登录:

web页面上有提交资料,打包,下载等功能,顺序是这样的:首先用户提交资料,提交的资料都是每个代理商个性化 的内容,如下图所示:

用户资料上传成功后,点击web页面上的打包项目就可以进行Android项目打包过程,ok,然后你就可以去喝咖啡了,等在钉钉上收到消息了再回来下载吧,如下图所示:

至此,这个Android的自动化打包的过程就结束了。

纳尼?我还没反应过来就这么结束了?没错,就是这么简单,这个过程将需要改变应用的用户,测试人员,开发人员都独立开来,在一定程度上提高了协作效率,还是很有借鉴意义,下面我就和大家分享一下我的实现过程。

在这里由于我们摒弃了Android Studio打包,我采用了python来处理中间的逻辑,一是因为python本身是一门非常容易上手的语言,二是因为公司是做文本大数据的,python高手很多,到时候有搞不定的问题可以找他们嘛。说干就干,我花了一天的时间学习了python的基本语法后就开整了。

构建过程全部都是在Mac上面进行,主要是方便执行python和shell命令,在这片文章中我就不再赘述Linux或者Unix服务器上如何安装jdk,Android SDK, gradle的问题了。在这里我可以告诉大家一个最快速的方法。你可以现在如Mac上下载Android Sutido运行一个Android项目,然后再去设置中看这些东西的路径,这样就方便多了。由于Android Studio内置jdk,因此脱离Android Studio运行项目的时候,需要自己安装jdk。

整个自动化的核心流程是这样的:

1、python接收来自前端web页面的数据,包括代理商List,图片路径,微信分享id,QQ分享id等。(下面讨论的过程中我假设web端的数据已经传到python服务中来,图片也放到了Mac机器上,不讨论这个过程的实现原理,这个也不是我们的重点。)

2、从svn服务器checkout代码到mac机器上。

3、遍历代理商List,循环进行打包操作。

4、将每个代理商的图片资源放到指定的目录。

5、动态修改string.xml等配置文件。

6、执行打包命令。

7、打包结果发送到阿里钉钉。

8、打包成功的apk上传到蒲公英,并下载图片链接发送到阿里钉钉中。

这就是自动化打包的整个流程,下面我们来细细分析一下每个都是怎么实现的,如果在阅读下面的过程中有困难的话,建议去看一下python的基础知识。这个应该不会花太多时间,一天时间足矣。

如果要做自动化处理我有这么几个问题需要考虑:

1、多个代理商打包项目代码总共需要多少份呢?首先我必须要从svn服务器上checkout一份代码到本地,为了避免多次下载项目代码的情况,于是我决定只checkout一次,然后其他代理商打包的时候依次覆盖之前的代码和资源。python从svn checkout代码部分截图如下:

2、为了便于理解,代理商的数据我们以JSONArray的形式举一个例子,如下图:

3�、python提倡以模块和函数的形式构建代码,因此把每一个代理商的打包过程提取成函数:

4、代理商资源图片动态放到drawable和mipmap等目录。在这之前,用户已经在web端上传了相关图片资源,这些图片资源经过一些的处理已经放置在了我们Mac机器上面本地目录下:

在这里我再插播另外一个知识点,我们知道Android Studio项目当中有drawable和mipmap文件夹,都是可以用来放图片的,那么他们有什么区别呢?根据google官方的介绍,google推荐将launcher icon放在mipmap目录中,其他的图片都还是应该放在drawable目录下面的。注意,mipmap对图片进行了很好的优化,只是针对launcher icon的,我们只能在AndroidMainfest.xml才能使用,有兴趣的朋友可以去网上查阅相关资料。

5、动态修改strings.xml的值:

解析xml过程中你看到的ET是这样引入的:

import xml.etree.ElementTree as ET

在这里需要着重注意的一点是:解析完xml后一定要进行保存更改,在这里我将它写回到了原始的xml文件中。

6、执行打包命令,并将到是否成功的消息发送到阿里钉钉上面:

在这里打包命令中的gradle assembleRelease中的gradle我配置的是本地gradle-3.3 bin目录下的可执行文件。在这里有的同学可能要问了,直接调用根项目下面的./gradlew打包不可以么?可以,但是我一开始这样做的时候除了问题,报了如下图所示的错误:

报这个错误的原因我网上查了查之后说是gradle-wrapper.jar所在的位置不正确,我就去看了一下我checkout代码上的结构,果然发现gradle-wrapper.jar外面还多了一层branch ,tag, trunk的目录,如图所示:

但是我们在从svn到checkout代码到Android Studio中去的时候代码结构是正常的,真是奇了怪了,到现在还是一个未解之谜,如果知道情况的朋友还请告知。鉴于此,我就使用了本地gradle-3.3 bin目录下的可执行文件。

此外,如果不熟悉如何通用机器人发消息到阿里钉钉上面的朋友请自行参考钉钉的官方开发文档。

如果你的应有有需要做360加固的需求的话,那么请参考一下我的这篇文章:如何使用python命令行做360应用加固

在这里还需要说明一点,大家看了我代码片段就发现我自己写了很多的配置文件,这些配置文件里面的主要内容是跟app相关的一些信息,如app的版本号,debug还是release版本等,这些信息我在给apk命名的时候需要用到,虽然也可以直接解析build.gradle配置文件,但是感觉太麻烦了,而且build.gradle配置文件也不是规范的文件。为此我就把我需要的,又难以取到的信息写在了xxxxx.properties配置文件当中。而且通过apk命名就可以看到我是通过python命令直接去修改apk的名称,而不是在build.gradle配置文件中采用如下的方式命名的:

applicationVariants.all { variant ->

variant.outputs.each { output ->

def file = output.outputFile

output.outputFile = new File(file.parent,

"myapp-" + defaultConfig.versionName + "-" + buildTime() + ".apk")

//生成的文件名:myapp+版本名+生成日期+.apk

}

}

同理,由于我是循环打包,也就不需要在build.gradle配置文件中配置多渠道的信息,该图片中的名字和你看到的第一张图片中的文件夹是对应关系:

7、上传apk到蒲公英,拽取生成的二维码图片并发送到阿里钉钉中供测试人员下载:

上图中上传apk到蒲公英的命令在蒲公英的官方文档上可以查找到。

8、运行Python脚本,最终会有下图的效果:

通过上图你也看到了不同代理商的apk打成功的时候都有消息提醒和可供下载的连接,非常的方便,至此利用python做Android自动化打包的过程就结束了。

由于以前我没有python基础,学了一天就开始上手做了,可能在python代码的书写规范,异常捕获等方面做得不是很好,但是应该不影响大家理解这其中的内容,有兴趣的朋友赶快来试试吧!

如果文章当中有任何不正确的地方,还请广大读者纠正,非常感谢!

怎么用python编写个apk_【android】如何利用python做Android项目自动化构建,并一键实现构建结果发送到钉钉通知以及通过二维码下载apk或者其他处理等功能...相关推荐

  1. 关于扫描二维码下载app功能实现方法

    关于扫描二维码下载app功能实现方法   功能实现思路: Androidapk的下载本质上就是文件的下载,所以我们只需要在后台提供一个下载的方法,就能是实现apk的下载. 在实现后台代码以后,我们生成 ...

  2. 扫描二维码下载app,判断是Android还是ios,并跳转到不同的下载地址

    写在前面 通常,我们开发一个app,有Android版本,有ios版本,但是,我们有时候只有一个二维码可以放置,比如,通过社会化分享,分享到微信一张图片,通过微信识别二维码来下载我们的app,此时,只 ...

  3. 二维码下载,区分是 ios 和 android

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  4. 扫描二维码下载app,判断是Android还是ios,并跳转到不同的下载地

    写在前面 通常,我们开发一个app,有Android版本,有ios版本,但是,我们有时候只有一个二维码可以放置,比如,通过社会化分享,分享到微信一张图片,通过微信识别二维码来下载我们的app,此时,只 ...

  5. 使用前端QrCode.js实现根据输入内容生成二维码,并提供二维码下载功能(已使用在交付项目中)

    前端QrCode 根据输入内容生成二维码,并提供二维码下载功能 简介:这是一个使用前端QrCode自动生成二维码并下载二维码图片的项目. 项目背景:在某个项目的交付阶段,客户提出需要一个可手动生成二维 ...

  6. 用python生成二维码并将APK文件部署到IIS站点变成二维码下载

    1. 将APK文件路径部署在IIS上 2.  首先要在IIS上配置一下 IIS7中下载apk文件会报404错误. 找到:IIS目录,MIME类型 添加.apk文件的MIME类型. 文件扩展名:.apk ...

  7. C#利用zxing.net生成二维码和条形码并实现打印的功能

    C#利用Zxing.net生成条形码和二维码并实现打印的功能     开篇:zxing.net是.net平台下编解条形码和二维码的工具. 下载地址:http://pan.baidu.com/s/1kT ...

  8. 用微信扫一扫功能扫描二维码下载安装APK不能用,不能打开APK下载链接的解决方案

    使用微信推广的用户经常都会遇到推广链接被拦截导致无法下载app的情况,此时用户在微信中打开会提示" 已停止访问该网页 ".这对于使用微信营销的商家来说就很不友好且损失非常大,因为用 ...

  9. C#生成二维码和条形码并实现打印的功能

    转载:https://www.cnblogs.com/xixim/p/4589078.html 下载地址:http://pan.baidu.com/s/1kTr3Vuf Step1:使用VS2010新 ...

最新文章

  1. Linux加载DTS设备节点的过程(以高通8974平台为例)
  2. python列表元素替换的数据结构_Python基础学习数据结构(第2讲:列表;第2讲:列表创建、添加元素、插入元素、替换元素、删除元素、其他常用方法和列表派生),第二,主讲,追加,推导,式...
  3. 错误的模糊应用(类继承问题)
  4. spring+struts2+mybatis
  5. 网络编程在线英英词典之历史查询模块(六)
  6. PPTV发布裸眼3D手机:中国联通加持,又一款“互联网生态手机”---ESM
  7. https://blog.csdn.net/zxp_cpinfo/article/details/53692922
  8. html5 文本框只能输入正整数,控制input文本框只能输入正整数
  9. RIGOL DS70000系列示波器在USB2.0一致性分析测试方案
  10. puppet master/agent
  11. linux 进程 cmd su,linux下常用管理命令
  12. 查询主机名对应的IP地址-C语言
  13. Linux——Linux账号与群组
  14. 格式化代码 format.js
  15. 如何快速而准确地进行 IP 和端口信息扫描:渗透测试必备技能
  16. Lombok基本使用方法
  17. 【沃顿商学院学习笔记】商业分析——People Analytics:15 人才分析 Talent Analytics
  18. c++中的虚指针和虚表
  19. Cyclone V SoC FPGA学习之路第一章:综述
  20. linux查看日志的多种方法集合

热门文章

  1. Android开发 无线Wifi+WifiUtil工具类,android开发网格布局
  2. 代码测试,调试与优化小结
  3. 无人驾驶出租车车队长沙惊艳亮相,BIE保驾护航
  4. 如何查看电脑支持的最大内存是多少
  5. 氢os android 7.0,基于安卓7.0,一加手机3T氢OS公测版发布 支持NFC一卡通
  6. 3、原币金额和本币金额
  7. ubuntu14.04编译ijkplayer备忘
  8. 计算机组成原理 最新教材,《计算机组成原理(本科教材)》—甲虎网一站式图书批发平台...
  9. 至少8位密码,包括大写、小写、数字、特殊字符中的三种即可(一般强密码规则)
  10. 你应该知道的10种软件工具