利用Robotinum对给的apk文件进行自动化测试,在不知道源码的情况下,只有apk文件如何进行自动化测试呢?

  首先需要对apk文件进行重签名,并获得该apk文件的包名和程序入口的类名。

  最开始网上说用re-sign.jar这个jar包,但是我用mac电脑实验了很多次都不行,一直提示JAVA_HOME环境变量没有设置,可是我已经设置了,echo $PATH输出也能看到JAVA_HOME,不过在Windows系统上实验是好的,可惜我是mac电脑,实验了好几个小时都不行,特别是在真心实意的请教测试的小姑娘帮忙,但是小姑娘不鸟我的情况下,于是一怒之下就自己实现了re-sign.jar的功能。

  通过在Windows上看到的情况,re-sign.jar做了哪些事呢?首先是对已有的apk进行重签名,然后是获得该apk文件的包名和程序入口的类名,为了获得apk文件的包名和入口类名我们需要用到apktool这个工具,因为有些apk是做了混淆的,需要反编译才能得到清晰的AndroidManifest.xml文件。我们知道apk的包名是有这样的标示的: package="xxxxxx",而程序入口类名就是<activity > </activity>标签中包含<xxx.action.MAIN>和<category.LAUCNCH>的部分。这样通过解析Manifest.xml文件,就能获得包名和入口类名了。

  注意:其中需要配置JAVA环境变量,Android环境变量,还需要将apktool所在目录加入到环境变量。该shell脚本需要与apk在同级目录下

  开始动手写shell 脚本。

#!/bin/bash

# Program :
# re-sign to specialy apk
# History :
# 2015.9.4 evilking First release

echo ===============================
echo 1.将此.sh文件放置您需要签名的apk同级目录下
echo 2.传入FILE_NAME参数,并设置为需要签名的apk文件名
echo 3.设置ANDROID_TOOLS_PATH 环境变量 为sdk下的tools路径
echo 4.设置JDK/bin 环境变量
echo 5.需要将/Users/你的用户名/.android/debug.keystore复制到apk同级目录下
echo 5.此脚本是基于JDK1.6来签名的,如果之前的apk不是用此版本签名可能会出血“无法对jar进行签名”的情况,用ZIP工具打开,找到下面的目录META-INF,删除目录
echo 6.如果出现未提供-tsa或-tsacert的警告,签名指令后加上-tsa https://timestamp.geotrust.com/tsa
echo ===============================

#获得当前路径
Cur_Dir=$(pwd)

#需要签名的apk文件名
FILE_NAME=$1

#验证该apk文件是否存在
if [ ! -e ${FILE_NAME}.apk ];then
  echo "error: not fount ${FILE_NAME}.apk file"
  exit 1
fi

#查看指定apk的签名信息
echo 查看指定apk的签名信息
jarsigner -verify -verbose -certs ${Cur_Dir}/${FILE_NAME}.apk | tail -n 10

#删除掉apk中的签名信息
echo =================================
echo 开始删掉apk中的签名信息
mv ${FILE_NAME}.apk ${FILE_NAME}.zip

#从zip包中直接删除META-INF文件夹
zip -d ${FILE_NAME}.zip META-INF/*

mv ${FILE_NAME}.zip ${FILE_NAME}.apk

echo 删除META-INF完成
echo =================================
#将原来的apk修改回来

#再次查看_unsign.apk签名信息
echo =================================
echo 再次查看_unsign.apk的签名信息
jarsigner -verify -verbose -certs ${FILE_NAME}.apk | tail -n 10

#对apk包重新签名
echo =================================
echo 对.apk包重新签名

#检测debug.keystore是否在本目录下
if [ ! -e debug.keystore ];then
  echo "warning:re-sign need username/.android/debug.keystore file"
  read -p "input your uname : " uname
  cp /Users/${uname}/.android/debug.keystore ./debug.keystore
fi

jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore debug.keystore -storepass android -keypass android ${FILE_NAME}.apk androiddebugkey -tsa https://timestamp.geotrust.com/tsa

echo ==================================
echo =========签名成功......开始简化......

zipalign 4 ${FILE_NAME}.apk ${FILE_NAME}_sign.apk
echo ============简化签名完成============

#查看重新签名的apk信息
echo ===================================
echo ======查看重新签名后的apk信息==========
jarsigner -verify -verbose -certs ${FILE_NAME}_sign.apk | tail -n 10

rm ${FILE_NAME}.apk

#下面部分是提取该应用的包名和程序入口类名
echo =======================================
echo ================开始提取包名=============

apktool d ${FILE_NAME}_sign.apk &>/dev/null

echo =============提取包名=================

package_name=$(egrep "package=\".*\"" ${FILE_NAME}_sign/AndroidManifest.xml | sed 's/.*package=//g')
echo "package=$package_name"

#获取程序入口
echo =============获取程序入口================
declare -i last_line
last_line=$(grep -n "action.MAIN" ${FILE_NAME}_sign/AndroidManifest.xml | cut -d ':' -f 1)

declare -i first_line
first_line=$(cat ${FILE_NAME}_sign/AndroidManifest.xml | head -n ${last_line} | egrep -n "<activity" | cut -d ':' -f 1 | tail -n 1)

echo "程序入口类为:"
entry_class=$(head -n $last_line ${FILE_NAME}_sign/AndroidManifest.xml | tail -n +$first_line | sed 's/.*android:name=\"//g' | cut -d "\"" -f 1 |   head -n 1)
if [ "$(echo $entry_class | cut -d "." -f 1)" == "" ];then
  echo "$(echo $package_name | sed 's/"//g')$entry_class"
else
  echo "$entry_class"
fi

rm -r ${FILE_NAME}_sign/
echo ===================结束=============

  整整花了一天的时间,不过值了,久违的成就感啊。

  参考博文:http://blog.csdn.net/h5q8n2e7/article/details/47837653

  

mac下自己实现re-sign.jar对apk进行重签名的更多相关文章

  1. 使用re-sign.jar对apk进行重签名

    准备: ① re-sign.jar重签名工具:(下载地址为:http://troido.de/downloads/category/1): ② 待重签名的apk:      重签名步骤: ① 右键re ...

  2. 【Vegas原创】MAC下,idea手动maven jar包的方法

    1,到自己的项目目录下 Vegass-MacBook-Air:gms-boyol Vegas$ pwd/Users/Vegas/SynologyDrive/Coding/workspace/gms-b ...

  3. 用re-sign.jar重签名apk后安装失败的解决办法

    问题 打开re-sign.jar,将下载好的apk拖入re-sign.jar的界面进行重签名.重签名成功后,通过adb intall命令安装重签名后的apk文件失败.提示:Failure [INSTA ...

  4. 【工匠大道】Mac下Java开发环境配置简述

    本文地址 原文地址 分享提纲: 1. 下载JDK1.7 2. 配置java_home 3 .安装tomcat 4 .安装eclipse或者myeclipse 5.  mysql安装 破解版下载请参考M ...

  5. Mac下手动安装SafariDriver extension

    环境:Mac OS X Yosemite 10.10.4下, Safari 8 Step 1:第一次运行SafariDriver时,先找到WebDriver extension的安装路径,比如/Use ...

  6. 在MAC下搭建JSP开发环境

    1.Mac下JDK的下载安装及配置 在安装jdk之后,需要为jdk安装目录配置环境变量: 任意打开终端,默认是家目录的,然后直接输入: touch .bash_profile 然后输入:vi .bas ...

  7. Mac下lombok无法安装到eclipse mars

    eclipse升级到mars之后 , 在mac下已经不再是文件夹中有很多文件的eclipse了 , 只有一个单独的app文件.用原来的方式运行lombok再选eclipse.app已经不行了. 自己鼓 ...

  8. Mac下使用Apache TCPMon

    Mac下使用Apache TCPMon 参考链接: TCPMon Tutorial Anyone know how to get TCPMON working on a mac? Apache TCP ...

  9. 在mac下安装jdk1.7(转)

    转自:http://vela.diandian.com/post/2012-01-06/15379924 最近呢,想玩玩jdk1.7,不过mac平台下的jvm一直都是Apple自己改的,所有有些麻烦. ...

随机推荐

  1. osg osgViewer::View::setUpViewInWindow()

    void ViewerBase::frame(double simulationTime) { if (_done) return; // OSG_NOTICE<<std::endl< ...

  2. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_01-用户认证-用户认证流程分析

    1 用户认证 1.1 用户认证流程分析 用户认证流程如下: 访问下面的资源需要携带身份令牌和jwt令牌,客户端可以通过身份认证的令牌从服务端拿到长令牌, 一会要实现认证服务请求用户中心从数据库内来查询 ...

  3. React Native 中的 Flex Box 的用法(水平布局、垂直布局、水平居中、垂直居中、居中布局)

     版权声明:本文仅供个人学习. CSS 中 Flex-Box 语法链接 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html Flex 是 ...

  4. WIN 10 看不到SAMBA共享的硬盘

    1.SMB1.0/CIFS协议默认被关闭了,之前的勒索病毒就是用的这个协议的漏洞,所以你去“启动和关闭windows功能”下手动勾选启用SMB1.0/CIFS协议 2.管理员身份执行 sc.exe c ...

  5. 【pep8规范】arc diff 不符合 pep 8 规范

    arc land 的时候,arc报错提示代码不符合pep8规范: 1.单行代码过长(括号中的换行不需要加 /) python代码换行加 / https://blog.csdn.net/codechel ...

  6. iOS-UIScreen,UIFont,UIColor,UIView,UIButton

    6.1 UIScreen // 屏幕的宽度 CGFloat screenW = [UIScreen mainScreen].bounds.size.width; 6.2 UIFont + (UIFon ...

  7. css实现可伸缩的搜索框

    效果图: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...

  8. centos(6,7) 系统常用命令

    目录: 系统服务命令 文件操作 系统信息 文件和目录 文件搜索 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 压缩与解压缩 YUM丶RPM 包 查看文件内容 文本处理 文件系统分析 初始化一个文 ...

  9. python微信服务号关注授权、消息推送流程

    阅读目录 推送的方式: 微信推送的流程: 流程分析: 给用户推送消息功能 推送的方式: 短信推送(第三方) 邮件推送 微信推送 公众号:认证的公众号(个人的认证公众号每天只能发一篇文章),粉丝可以跟公 ...

  10. @ConfigurationProperties和@Value的区别

    @ConfigurationProperties @Value 功能: 批量注入配置文件中的属性 一个个指定,多个属性多个@Value 松散绑定: 支持 不支持 SpEL: 不支持    支持 JSR ...