Android 发版的小工具

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详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容