利用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. myeclipse启动的过程中没提示就自动退出,闪退的有效解决方法

      今天遇到一个问题,已经打开myeclipse的电脑因为非正常关机后myeclipse打不开了,进度条进到十分之一就闪退,什么提示都没有的解决方案如下: 1.打开myeclipse工作空间(存放项目 ...

  2. Linux下-bash: Permission denied 或者 sudo: command not found 错误

    有时候执行一个脚本或者运行一个可执行文件时,如执行脚本./foo.sh,会报错-bash: ./foo.sh: Permission denied,你会再试sudo ./foo.sh,发现继续报错su ...

  3. (三)UML之类图关系

    泛化(generalization):表示is-a的关系,是对象之间耦合度最大的一种关系,子类继承父类的所有细节.直接使用语言中的继承表达.在类图中使用带三角箭头的实线表示,箭头从子类指向父类.如下图 ...

  4. 腾讯ios内部视频,什么垃圾视频

    前几天朋友在网上花钱买了个,腾讯ios内部视频,我也跟着下载了, 看着这列表,我感觉没什么东西,一看就是基础的东西,完全没有实战的内容,就像培训机构骗学生的东西啊,讲些毛理论,结果一到实战了,问个Sc ...

  5. 关于类似QQ的展开和折叠效果的实现

    介绍: 1.两级折叠与展开: 实现原理如下: 1>通过表视图的组的头视图和单元格实现; 2>通过改变cell的高度实现; 3>通过cell实现; 实现 UITableView 的ce ...

  6. 多林环境中的ADFS

    公司有两个或更多Active Directory林,但是只有一个ADFS,如何让ADFS支持多个域林呢?(一个ADFS只能部署在一个域中,不能跨域) 答案是:在部署ADFS的林和所有其他林之间建立双向 ...

  7. 【c# 学习笔记】使用virtual和override关键字实现方法重写

    只有基类成员声明为virtual或abstract时,才能被派生类重写:而如果子类想改变虚方法的实现行为,则必须使用override关键字. public class Animal { private ...

  8. 最新 盛天网络java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.盛天网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了盛天网络.6.7月主要是做系统复习.项目复盘.Leet ...

  9. [转帖]支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么?

    支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么? https://mp.weixin.qq.com/s?__biz=MzA3OTg5NjcyMg==&mid=2661671930 ...

  10. Java基础---Java方法

    基本方法的定义: public static void 方法名称() { 方法体 } 方法名称的命名规则和变量一样,使用小驼峰. 方法体:也就是大括号当中可以包含任意条语句. 注意事项: 1. 方法定 ...