Android 修改assets文件并重新签名——python

需求分析:

产品是一个阅读类软件,在版本上线后因为渠道推广的原因一直有特殊渠道要求内置书的需求,需求并不难做,需要准备好材料,修改软件内的assets文件内容,修改渠道号重新打包。基本步骤是这样的:

1. 接到特殊内置书的需求,书籍的id
2. 通过浏览器拼接url找到书籍的信息,包括书籍信息,章节列表,部分章节内容
3. 把书籍信息保存为特定文件,文件名要和代码逻辑适配
4. 粘贴到项目中
5. 打包
6. 发送测试验收

整个流程作为一个熟练工,大概需要20分钟的时间搞定然后回复到之前的工作状态,包括git分支切换等乱七八糟的事情。其实这个事情说起来也不大,但是,很烦。每次都是重复的工作,并且有越来越频繁的趋势。所以,是时候展示一下技术了(反正本公司测试也不懂),毕竟身为技术人员(不会承认是害怕在自己环节出错的).

其实这个流程涉及到的操作分解一下包含有一下步骤:

1. 网络请求
2. 文件io
3. apk重新签名

这些都可以用脚本实现….所以事情就很简单了。。。。

脚本使用的语言是python,没什么高深的部分,就一个一个实现,下边是具体的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
import urllib
#输入书籍id
inputbookid = raw_input("input bookid:")
#拼接书籍信息url
bookinfoUrl = "http:/***/***.php?bid={bookid}&*****".format(bookid = bookid)
#请求书籍信息
bookinfo = urllib.urlopen(bookinfoUrl)
bookinfodata =bookinfo.read()
#将信息保存在文件中
bookinfoTXT = "{bookid}.txt".format(bookid=filenamebookid)
f = open(bookinfoTXT,"w")
f.write(bookinfodata)
f.close()

网络请求

1
2
3
4
5
6
7
8
9
10
11
import zipfile
# o apk文件
def listdir(o):
#dirpath 文件夹路径 将文件夹内所有的文件写入apk的assets中
for file in os.listdir(dirpath):
print file
with zipfile.ZipFile(o, mode='a') as zipFile:
zipped = zipfile.ZipFile(o, 'a', zipfile.ZIP_DEFLATED)
empty_file = "assets/{filename}".format(filename=file)
zipped.write("./assets"+"/"+file, empty_file, zipfile.ZIP_DEFLATED)
zipped.close()

io操作

1
2
3
import os
cmd = "jarsigner -digestalg SHA1 -sigalg MD5withRSA -verbose -keystore %s.keystore -signedjar %s %s sina" %(keystorename,signedname,unsignedname)
os.system(cmd)

apk重新签名

另外如果还需要动态修改渠道号的话,可以参考美团快速多渠道打包的方案,实现也是通过io操作来的,需要在代码中做适配。

好了,现在就很简单了(直接把脚本给测试)。