Android加固包签名

我们知道自己的apk在上传市场的时候, 为了更好的包含我们的代码需要加固服务, 加固后的apk是不能直接安装的, 需要我们手动签名.

关于Android签名的知识就不在赘述了,网上有很多相关内容. Android应用数字签名详解

重点我们需要知道:

  1. android的签名不是 google自定义的, 它是一个通用校验算法, 通用与java 应用程序发版中. Android的签名只是在该算法基础上提供了自己的工具;
  2. 我们可以使用android studio 方便的完成对apk的签名,同事也可以使用其他签名工具对apk进行签名.

那么如何多已加固的包进行签名呢? 我们可以使用jarsigner 工具, 这个事jdk自带的签名工具, 将keystore文件(或者jks文件) 作为输入的签名文件来对apk进行签名.
另一个是工具signapk工具进行签名, signapk是Android中提供的工具,其签名输入文件为xxx.pk8xxx.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: ")

代码主要用到三方面知识:

  1. adb 控制应用程序, 实现自动 安装, 卸载和启动;
  2. android 系统中的input 命令工具; 能够实现一些事件的输入, 在上面代码中实现了一个input swipe用于模拟滑动事件 和一个input tap 用于模拟点击事件.
  3. android系统中 monkey 命令工具; 能够随机生成一些列的输入事件, 就像猴子乱按一样.

参考:

adb shell input 命令

Android自动化测试手段之Monkey

android压力测试命令monkey详解

Android 发版的小工具的更多相关文章

  1. 八款Android 开发者必备的小工具

    Photo from https://www.airpair.com 在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大 ...

  2. 几款Android开发人员必备小工具

    在这里我介绍一下我常常在Android Studio里面使用的小工具吧,这些工具都能够在plugin里面搜索到. (当然了哈.我也是从网上找的.用着挺方便的,在这里总结一下) Gsonformat: ...

  3. android生成sdk.jar 小工具

    net.sf.fjep.fatjar_0.0.31.jar 生成jar的工具 把这个net.sf.fjep.fatjar_0.0.31.jar到Eclipse的plugins中,从启Eclipse.点 ...

  4. php 网页版 ftp 小工具

    <?php define('IN_ECS', true); session_start(); header("Content-type:text/html;charset=utf-8& ...

  5. 这些小工具让你的Android 开发更高效

    在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...

  6. [Android Memory] Android性能测试小工具Emmagee

    转载:http://blog.csdn.net/anlegor/article/details/22895993 Emmagee是网易杭州QA团队开发的用于测试指定android应用性能的小工具.该工 ...

  7. 小白突破百度翻译反爬机制,33行Python代码实现汉译英小工具!

    表弟17岁就没读书了,在我家呆了差不多一年吧. 呆的前几个月,每天上网打游戏,我又不好怎么在言语上管教他,就琢磨着看他要不要跟我学习Python编程.他开始问我Python编程什么?我打开了我给学生上 ...

  8. axis2 利用小工具cat.aar

    Axis2: Web Service是现在最适合实现SOAP的技术,而Axis2是实现Web Service的一种技术框架(架构). 昨天把把菜刀脚本打包发现<>在xml会被转义,导致菜刀 ...

  9. 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/ ...

随机推荐

  1. Linux 文件系统大小调整

    有些使用需要进行文件系统的大小调整,比如使用LVM,或者在loopback设备上建立文件系统等,但该文件系统不是根文件系统时可以通过一下步骤,简单的进行: e2fsck -f /dev/loop0 r ...

  2. 51nod 1135 原根(原根)

    题意 题目链接 Sol 可以证明素数的原根不会超过他的\(\frac{1}{4}\) 那么预处理出\(P - 1\)的所有的质因数\(p_1, p_2 \dots p_k\),暴力判断一下,如果$\e ...

  3. 用CSS隐藏页面元素的5种方法

    1.opacity设置一个元素的透明度只是从视觉上隐藏元素,对页面布局还是有影响,读屏软件会原样读出 2.visibility设置为hidden将隐藏我们的元素,对网页布局还是起作用,子元素也会被隐藏 ...

  4. 移动端h5开发相关内容总结css篇--笔记

    原文参考http://mp.weixin.qq.com/s/Nho2DHj-Y59j2F62vpN9jQ 1.开发移动端,头部必要的配置<meta name="viewport&quo ...

  5. QQ 聊天机器人小薇 1.0.1 发布!

    本次发布主要解决了消息丢失(Api返回码[1202])问题,并改进了改进了一些细节. 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 Q ...

  6. Infor SyteLine如何快速锁定用户

    使用Infor Syteline ERP系统,当需要做系统维护时,我们需要通知所有用户退出系统,在维护期间,严禁用户登录,这样的话,我们需要锁定用户.对于这个问题,很多管理员会打开SL的Users窗口 ...

  7. DELPHI SOKET 编程--使用TServerSocket和TClientSocket

    本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...

  8. spfa 的算法实现之一

    问题描述:给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式:第一行两个整数n, m.接下来的m行,每行有三个整 ...

  9. js结构化命名的思考

    var koooke ={androidShare:{ show : function() {alert(1000)}}};koooke.androidShare.show(); 以上JS是偶然缩写. ...

  10. python三次输入错误验证登录

    # login.py# 提示用户输入用户名和密码# 验证用户名和密码# 如果v错误,则输出用户名或密码错误# 如果成功,则输出欢迎,xxxnum = 0while True: name = input ...