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. 小白学flask之静态文件

    引入css的方式有两种 1 那在flask中,如何处理静态文件? 做法很简单,只要在你的包或模块旁边创建一个名为 static 的文件夹就行了. flask的静态文件是位于应用的 /static 中的

  2. Apache服务器运维笔记(1)----运行多个Apache服务器

    所有的Apache管理员都会遇到一个问题,就是在一台物理系统上运行多个版本的Apache服务器,或是运行多个同一版本的Apache服务器的副本,对于前者,在编译时为不同版本的Apache指定不同的安装 ...

  3. Codeforces(Round #93) 126 B. Password

    B. Password time limit per test  2 seconds memory limit per test  256 megabytes   Asterix, Obelix an ...

  4. 十九、CSS如何引入字体

    将相应的字体放入新建的文件夹,然后在Css文件里面如下图引入 @font-face { font-family: FZLTCXHJW; src: url(../font/FZYouHJW_Xian_a ...

  5. SQL Server ->> Sparse File(稀疏文件)

    Sparse File(稀疏文件)不是SQL Server的特性.它属于Windows的NTFS文件系统的一个特性.如果某个大文件中的数据包含着大量“0数据”(这个应该从二进制上看),这样的文件就可以 ...

  6. jQuery的事件绑定和解绑

    1.绑定事件 $('获取的标签对象').bind('要操作的方法,  {操作的内容  是字典的形式},function(){} ') 语法: bind(type,data,fn) 描述:为每一个匹配元 ...

  7. June 22nd 2017 Week 25th Thursday

    Happiness is when the desolated soul meets love. 幸福是孤寂的灵魂遭遇爱的邂逅. When living alone for a long period ...

  8. sql语句的group by 与 inner join

    一.理解group by和聚合函数 先来看下表1,表名为test: 表1 执行如下SQL语句: 1 2 SELECT name FROM test GROUP BY name 你应该很容易知道运行的结 ...

  9. Vue组件绑定自定义事件

    Vue组件使用v-on绑定自定义事件: 可以分为3步理解: 1.在组件模板中按照正常事件机制绑定事件: template: '<button v-on:click="increment ...

  10. arcgis server 9.3 查看地图服务时出现"No Content"错误

    问题描述: 使用ArcGIS Server Manager的Add new service功能发布一个服务.然后启动服务 用浏览器访问该服务的地址http://localhost/ArcGIS/ser ...