mac下自己实现re-sign.jar对apk进行重签名
利用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进行重签名的更多相关文章
- 使用re-sign.jar对apk进行重签名
准备: ① re-sign.jar重签名工具:(下载地址为:http://troido.de/downloads/category/1): ② 待重签名的apk: 重签名步骤: ① 右键re ...
- 【Vegas原创】MAC下,idea手动maven jar包的方法
1,到自己的项目目录下 Vegass-MacBook-Air:gms-boyol Vegas$ pwd/Users/Vegas/SynologyDrive/Coding/workspace/gms-b ...
- 用re-sign.jar重签名apk后安装失败的解决办法
问题 打开re-sign.jar,将下载好的apk拖入re-sign.jar的界面进行重签名.重签名成功后,通过adb intall命令安装重签名后的apk文件失败.提示:Failure [INSTA ...
- 【工匠大道】Mac下Java开发环境配置简述
本文地址 原文地址 分享提纲: 1. 下载JDK1.7 2. 配置java_home 3 .安装tomcat 4 .安装eclipse或者myeclipse 5. mysql安装 破解版下载请参考M ...
- Mac下手动安装SafariDriver extension
环境:Mac OS X Yosemite 10.10.4下, Safari 8 Step 1:第一次运行SafariDriver时,先找到WebDriver extension的安装路径,比如/Use ...
- 在MAC下搭建JSP开发环境
1.Mac下JDK的下载安装及配置 在安装jdk之后,需要为jdk安装目录配置环境变量: 任意打开终端,默认是家目录的,然后直接输入: touch .bash_profile 然后输入:vi .bas ...
- Mac下lombok无法安装到eclipse mars
eclipse升级到mars之后 , 在mac下已经不再是文件夹中有很多文件的eclipse了 , 只有一个单独的app文件.用原来的方式运行lombok再选eclipse.app已经不行了. 自己鼓 ...
- Mac下使用Apache TCPMon
Mac下使用Apache TCPMon 参考链接: TCPMon Tutorial Anyone know how to get TCPMON working on a mac? Apache TCP ...
- 在mac下安装jdk1.7(转)
转自:http://vela.diandian.com/post/2012-01-06/15379924 最近呢,想玩玩jdk1.7,不过mac平台下的jvm一直都是Apple自己改的,所有有些麻烦. ...
随机推荐
- osg::PagedLOD example
int main() { osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; osg::ref_ptr< ...
- Kafka Connect REST Interface
Since Kafka Connect is intended to be run as a service, it also supports a REST API for managing con ...
- C++ - 第一个程序
代码: #include <iostream> using namespace std; int main() { cout << "hello!" < ...
- 取数据超过内存限制的问题-解决方案(sample,takeSample,filter)
遇到的问题 在处理数据过程中,遇到需要取(n)个数的问题,而当样本量过大的时候,就不能简单的take(n),这类问题一般有两种情况: > - 有序取 TopN > - 无序取 N 先来讨论 ...
- java构造方法前加void有什么作用
构造方法前面是没有任何返回符,不能加任何返回类型,包括void.一个构造方法一旦加了void,那么这个就不是构造方法了,变成了一个普通的方法.至于你程序出现的情况,是这样的.任何一个Java类,如果你 ...
- 【Leetcode_easy】617. Merge Two Binary Trees
problem 617. Merge Two Binary Trees 参考 1. Leetcode_easy_617. Merge Two Binary Trees; 完
- iOS-objective-c产生随机数的方法
objective-c 中三种产生随机数的方法 //arc4random() 比较精确不需要生成随即种子 //通过arc4random() 获取0到x-1之间的整数的代码如下: int val ...
- iOS技术面试07:第三方框架
1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio. ...
- netstat -anp/ss -t里的Send-Q和Recv-Q含义
Send-Q 对方没有收到的数据或者说没有Ack的,还在本地缓冲区 Recv-Q 数据已经在本地接收缓冲区,但是还没有recv() The count of bytes not copied by t ...
- Flutter 流式布局列表实例+上拉加载
页面变化的几种方式: 一.StatefulWidget的setState形式 先声明两个变量. ; List<Map> list = []; 写了一个方法,获取数据: void _getH ...