Android 发版的小工具
Android加固包签名
我们知道自己的apk在上传市场的时候, 为了更好的包含我们的代码需要加固服务, 加固后的apk是不能直接安装的, 需要我们手动签名.
关于Android签名的知识就不在赘述了,网上有很多相关内容. Android应用数字签名详解
重点我们需要知道:
- android的签名不是 google自定义的, 它是一个通用校验算法, 通用与java 应用程序发版中. Android的签名只是在该算法基础上提供了自己的工具;
- 我们可以使用android studio 方便的完成对apk的签名,同事也可以使用其他签名工具对apk进行签名.
那么如何多已加固的包进行签名呢? 我们可以使用jarsigner 工具, 这个事jdk自带的签名工具, 将keystore文件(或者jks文件) 作为输入的签名文件来对apk进行签名.
另一个是工具signapk工具进行签名, signapk是Android中提供的工具,其签名输入文件为xxx.pk8和xxx.x509.pem. signapk签名apk
keystore 签名文件中是可以提取signapk工具需要的签名文件的 详见keystore文件转换格式为pk8+x509.pem
介绍了上述关于android签名的内容, 今天的重点是放出一个通过jarsigner 签名加固宝的python脚本.
#coding=utf-8
import os, sys
# 你的jks文件名称
jksname = "jskfilename.jks"
# 注意yourpass 需要配置为你自己的密码
signerformat = "jarsigner -verbose -sigalg SHA1withRSA -storepass yourpass -digestalg SHA1 -keystore '{jksfile}' -signedjar '{signedpath}' '{unsignedpath}' wujikeji"
zipalignformat = "zipalign -v -f 4 '{signedapk}' '{alignedapk}'"
if __name__ == "__main__":
cur_path = sys.path[0]
for parent, dirnames, filenames in os.walk(cur_path):
if parent == cur_path:
for filename in filenames:
print os.path.join(parent, filename)
# 过滤非apk文件以及已签名apk
if filename.endswith(".apk") and "signed" not in filename:
# 提取文件名标示
apktag = filename.replace("app","").replace("-","").\
replace(".","").replace("release","").\
replace("apk","").replace("_","").replace("encrypted","").replace("legu","")
jksfile = os.path.join(cur_path, jksname)
signedpath = os.path.join(cur_path, apktag+"_signed.apk")
# 签名apk
os.popen(signerformat.format(jksfile=jksfile, signedpath=signedpath, unsignedpath=os.path.join(parent,filename)))
alignedapk = os.path.join(cur_path, apktag+"_signed_zipaligned.apk")
# 对其apk
os.popen(zipalignformat.format(signedapk = signedpath, alignedapk = alignedapk))
# 删除中间文件
os.remove(signedpath)
pass
该脚本针对加固后的包进行批量签名, 将加固后apk包和签名文件(jks文件)放入该脚本文件相同目录下, 运行脚本即可得到签名并对其的apk包. 前提需要配置自己的密码.
渠道包测试
渠道生成之后按理说应该可以直接发不了,但对于一般的程序猿都会多多少少有点强迫症, 要每个渠道都安装运行一下, 不需要多么详细的测试, 只是看下每个应用能不能运行起来.
国内十多个市场, 每个市场对应一个渠道包, 仅这些渠道包的简单测试就话费了好长时间. 并且每次有不需要多么仔细的测试. 于是想到直接用adb 控制手机自动完成测试的方法.
使用python作为控制脚本, 直接上代码:
import os, sys, time
adb_start_cmd ="adb shell am start -n pkgname/launchActivity"
adb_install_format = "adb install '{apk_path}'"
adb_uninstall = "adb uninstall yourpackagename"
if __name__ == "__main__":
cur_path = sys.path[0]
for parent, dirnames, filenames in os.walk(cur_path):
if parent == cur_path:
all_apk_num = len(filenames) -2
cur_count = 0;
for filename in filenames:
# 过滤非apk文件以及已签名apk
if filename.endswith(".apk") :
cur_count +=1
print filename
# 提取文件名标示
apktag = filename.replace("app","").replace("-","").\
replace(".","").replace("release","").\
replace("apk","").replace("_","").replace("encrypted","").replace("legu","")
os.popen(adb_uninstall)
os.popen(adb_install_format.format(apk_path=os.path.join(cur_path, filename)))
print apktag + "\t" + str(cur_count)+"/"+str(all_apk_num)
print "monkey go:"
os.popen(adb_start_cmd)
# 通过adb shell input 命令,先将首次启动页跳过
time.sleep(5)
os.popen("adb shell input swipe 800 200 50 200")
time.sleep(1)
os.popen("adb shell input tap 300 300")
time.sleep(1)
os.popen("adb shell input keyevent 4")
os.popen("adb shell input keyevent 4")
# 真正放候啦
# os.popen("adb shell monkey -p com.rong.jieqian.daikuanba -v 20 --throttle 1000 --pct-touch 50% --pct-trackball 25% --pct-motion 25%")
os.popen("adb shell monkey -p com.rong.jieqian.daikuanba -v 2000")
raw_input("input anything to continue: ")
代码主要用到三方面知识:
- adb 控制应用程序, 实现自动 安装, 卸载和启动;
- android 系统中的input 命令工具; 能够实现一些事件的输入, 在上面代码中实现了一个
input swipe用于模拟滑动事件 和一个input tap用于模拟点击事件. - android系统中 monkey 命令工具; 能够随机生成一些列的输入事件, 就像猴子乱按一样.
参考:
Android 发版的小工具的更多相关文章
- 八款Android 开发者必备的小工具
Photo from https://www.airpair.com 在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大 ...
- 几款Android开发人员必备小工具
在这里我介绍一下我常常在Android Studio里面使用的小工具吧,这些工具都能够在plugin里面搜索到. (当然了哈.我也是从网上找的.用着挺方便的,在这里总结一下) Gsonformat: ...
- android生成sdk.jar 小工具
net.sf.fjep.fatjar_0.0.31.jar 生成jar的工具 把这个net.sf.fjep.fatjar_0.0.31.jar到Eclipse的plugins中,从启Eclipse.点 ...
- php 网页版 ftp 小工具
<?php define('IN_ECS', true); session_start(); header("Content-type:text/html;charset=utf-8& ...
- 这些小工具让你的Android 开发更高效
在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...
- [Android Memory] Android性能测试小工具Emmagee
转载:http://blog.csdn.net/anlegor/article/details/22895993 Emmagee是网易杭州QA团队开发的用于测试指定android应用性能的小工具.该工 ...
- 小白突破百度翻译反爬机制,33行Python代码实现汉译英小工具!
表弟17岁就没读书了,在我家呆了差不多一年吧. 呆的前几个月,每天上网打游戏,我又不好怎么在言语上管教他,就琢磨着看他要不要跟我学习Python编程.他开始问我Python编程什么?我打开了我给学生上 ...
- axis2 利用小工具cat.aar
Axis2: Web Service是现在最适合实现SOAP的技术,而Axis2是实现Web Service的一种技术框架(架构). 昨天把把菜刀脚本打包发现<>在xml会被转义,导致菜刀 ...
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...
随机推荐
- JS里的居民们7-对象和数组转换
编码 学习通用的数据用不同的数据结构进行存储,以及相互的转换 对象转为数组: var scoreObject = { "Tony": { "Math": 95, ...
- 2-3 Sass的函数功能-列表函数
列表函数主要包括一些对列表参数的函数使用,主要包括以下几种: length($list):返回一个列表的长度值: nth($list, $n):返回一个列表中指定的某个标签值 join($list1, ...
- Javascript之全局变量和局部变量部分讲解
以此文作为自己学习的一个总结. 关于全局变量和局部变量的一句简单的定义:在函数外声明的变量都为全局变量,在函数内声明的为局部变量. 一.局部变量和全局变量重名会覆盖全局变量 var a = 1; fu ...
- SQL Server ->> OFFSET & FETCH子句
SQL Server 2012引入OFFSET + FETCH字句.它俩出现在SELECT .... ORDER BY ...后面.作用是告诉SQL Server在结果集中忽略前N行然后取前M行出来. ...
- Linux的inode的理解 ZZ
文件名 -> inode -> device block 转自:http://www.ruanyifeng.com/blog/2011/12/inode.htmlhttp://blog.s ...
- 【Leetcode】【Medium】Populating Next Right Pointers in Each Node
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- nest 排序
var result = client.Search<Person>(x => x.Index("personindex").Type("persont ...
- @vue-cli3配合element和scss打包的配置
@vue-cli3配合element和scss打包的配置 标签(空格分隔): Vue 使用@vue-cli3初始化项目,且使用ElementUI,然后按照官方文档自定义主题. 自己的scss全局变量文 ...
- February 10 2017 Week 6 Friday
Example is always more efficacious than precept. 身教胜于言教. Always match your words with your actions. ...
- php生成csv文件并提供下载及相关注意事项
1.生成文件过程略,只要逗号分割就可以了 2.提供下载加上如下代码: header("Content-type: application/octet-stream"); heade ...