使用shell命令校验Android apk的签名信息、校验apk是否使用v1v2v3v4签名

2023-05-16

文章目录

  • 前言
  • 1. 查看apk文件的签名类型的shell命令
  • 2. 自动校验签名并输出的完整脚本
    • 2.1 命令脚本
    • 2.2 命令脚本更新版2.0
  • 3. 本文中使用到的shell命令小结
    • 3.1 shell 查看apk的签名信息
    • 3.2 shell 字符串包含
    • 3.3 shell if...fi语句
    • 3.4 Shell 字符串截取
      • 3.4.1 从字符串左边开始计数
      • 3.4.2 从右边开始计数
    • 3.5 内部域分隔符IFS


前言

最近项目打包新增v2签名,于是想在打包完成后校验是否已经成功使用了v2签名
故打算写一个shell脚本来执行校验


1. 查看apk文件的签名类型的shell命令

shell命令:

apksigner verify --verbose xx.apk

输出结果:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1

从结果中可以看出:该apk使用了v1和v2签名,没有使用v3和v4签名。


2. 自动校验签名并输出的完整脚本

由于项目使用Jenkins自动打包,既然有了shell命令,不妨让命令直接帮我做完,免得每次打完包还需要手动检测。
在Jenkins打包命令完成后,再配置校验签名的shell命令即可。

2.1 命令脚本

//本地apksigner的目录
export ROOT_DOR=/Users/apple/Library/Android/sdk/build-tools/30.0.2 
//待验证签名的apk目录
export ROOT_DIR=/Users/apple/Documents/MyWork/androidCode/workCode/ZjnxEbankUat_Scan/app/uat/debug


//遍历寻找该目录下的apk文件,可能有多个apk
find ${ROOT_DIR} -name "*.apk" | while read line
do 
	//apk文件
	FILE=${line}
	//查看apk的签名信息
	${ROOT_DOR}/apksigner verify --verbose "${FILE}" | while read line2
	do
		//校验是否使用v1签名
		str1="Verified using v1 scheme"
		if [[ ${line2} =~ $str1 ]]
		then
			echo "****************"
			V1_SIGN=${line2: 0-4}
			if [ "true" == "${V1_SIGN}" ]
			then
				echo "v1签名成功"
			else
				echo "v1签名失败"
			fi
			echo "****************"
		fi
		
		//校验是否使用v2签名
		str2="Verified using v2 scheme"
		if [[ ${line2} =~ $str2 ]]
		then
			echo "****************"
			V2_SIGN=${line2: 0-4}
			if [ "true" == "${V2_SIGN}" ]
			then
				echo "v2签名成功"
			else
				echo "v2签名失败"
			fi
			echo "****************"
		fi
		
		//校验是否使用v3签名
		str3="Verified using v3 scheme"
		if [[ ${line2} =~ $str3 ]]
		then
			echo "****************"
			V3_SIGN=${line2: 0-4}
			if [ "true" == "${V3_SIGN}" ]
			then
				echo "v3签名成功"
			else
				echo "v3签名失败"
			fi
			echo "****************"
		fi
		
		//校验是否使用v4签名
		str4="Verified using v4 scheme"
		if [[ ${line2} =~ $str4 ]]
		then
			echo "****************"
			V4_SIGN=${line2: 0-4}
			if [ "true" == "${V4_SIGN}" ]
			then
				echo "v4签名成功"
			else
				echo "v4签名失败"
			fi
			echo "****************"
		fi
		
	done
done

这样配置完成后,Jenkins日志就会自动输出签名信息。

2.2 命令脚本更新版2.0


export ROOT_DOR=/Users/apple/Library/Android/sdk/build-tools/30.0.2 

#export ROOT_DIR=/Users/apple/Documents/MyWork/androidCode/workCode/ZjnxEbankUat_Scan/app/uat/debug
export ROOT_DIR=/Users/apple/Desktop/qqq


find ${ROOT_DIR} -name "*.apk" | while read line
do 
	# 默认没有进行v1v2v3v4签名
	v1="false"
	v2="false"
	v3="false"
	v4="false"
	
	FILE=${line}
	
	# 内部域分隔符:此处做换行处理
	IFS="
"
	for line2 in `${ROOT_DOR}/apksigner verify --verbose "${FILE}"`
	do
		
		str1="Verified using v1 scheme"
		if [[ ${line2} =~ $str1 ]]
		then
			v1="true"
			echo "****************"
			V1_SIGN=${line2: 0-4}
			if [ "true" == "${V1_SIGN}" ]
			then
				echo "校验v1签名成功"
			else
				echo "校验v1签名失败"
				exit -1
			fi
			echo "****************"
		fi
		
		str2="Verified using v2 scheme"
		if [[ ${line2} =~ $str2 ]]
		then
			v2="true"
			echo "****************"
			V2_SIGN=${line2: 0-4}
			if [ "true" == "${V2_SIGN}" ]
			then
				echo "校验v2签名成功"
			else
				echo "校验v2签名失败"
				exit -1
			fi
			echo "****************"
		fi
		
		str3="Verified using v3 scheme"
		if [[ ${line2} =~ $str3 ]]
		then
			v3="true"
			echo "****************"
			V3_SIGN=${line2: 0-4}
			if [ "true" == "${V3_SIGN}" ]
			then
				echo "校验v3签名成功"
			else
				echo "校验v3签名失败"
			fi
			echo "****************"
		fi
		
		str4="Verified using v4 scheme"
		if [[ ${line2} =~ $str4 ]]
		then
			v4="true"
			echo "****************"
			V4_SIGN=${line2: 0-4}
			if [ "true" == "${V4_SIGN}" ]
			then
				echo "校验v4签名成功"
			else
				echo "校验v4签名失败"
			fi
			echo "****************"
		fi
		
	done

	if [[ "false" == $v1 ]]
	then
		echo "****************"
		echo "没有检测到有效的v1签名"
		echo "****************"
		exit -1
	fi

	if [[ "false" == $v2 ]]
	then
		echo "****************"
		echo "没有检测到有效的v2签名"
		echo "****************"
		exit -1
	fi

	if [[ "false" == $v3 ]]
	then
		echo "****************"
		echo "没有检测到有效的v3签名"
		echo "****************"
	fi

	if [[ "false" == $v4 ]]
	then
		echo "****************"
		echo "没有检测到有效的v4签名"
		echo "****************"
	fi
done

3. 本文中使用到的shell命令小结

3.1 shell 查看apk的签名信息

apksigner verify --verbose xx.apk

3.2 shell 字符串包含

strA="helloworld"
strB="low"
if [[ $strA =~ $strB ]]
then
    echo "包含"
else
    echo "不包含"
fi

3.3 shell if…fi语句

#!/bin/sh

a=10
b=20

if [ $a == $b ]
then
   echo "a is equal to b"
fi

if [ $a != $b ]
then
   echo "a is not equal to b"
fi

3.4 Shell 字符串截取

Shell字符串截取完整命令

3.4.1 从字符串左边开始计数

${string: start :length}

例如:

url="c.biancheng.net"
echo ${url: 2: 9}

结果为biancheng

3.4.2 从右边开始计数

${string: 0-start :length}

从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符合常人思维)

例如:

url="c.biancheng.net"
echo ${url: 0-13: 9}

结果为biancheng。从右边数,b是第 13 个字符

3.5 内部域分隔符IFS

# 内部域分隔符:此处做换行处理
	IFS="
"
	for line2 in `${ROOT_DOR}/apksigner verify --verbose "${FILE}"`
# 相当于:执行apksigner verify --verbose 获取apk的签名信息,并且以
# “换行”作为条件进行循环输出给line2;我们就可以逐行对line2进行判断处理即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用shell命令校验Android apk的签名信息、校验apk是否使用v1v2v3v4签名 的相关文章

  • 判断一条sql是否走了索引

    参考 https zhuanlan zhihu com p 137647823 准备 CREATE TABLE 96 book 96 96 id 96 int 11 NOT NULL AUTO INCREMENT 96 name 96 va
  • C语言网络编程——TCP

    C语言网络编程 TCP 1 1 套接字1 1 1 流套接字 xff08 SOCK STREAM xff09 1 1 2 数据报套接字 xff08 SOCK DGRAM xff09 1 1 3 原始套接字 xff08 SOCK RAW xff
  • ROS入门学习三——launch文件

    launch作用 xff1a 便于一次启动多个节点 xff0c 可启动本地节点和远程节点及修改添加参数服务器参数 lt launch gt lt launch gt 是所有launch文件的根标签 lt node gt node为子集标签
  • ssh连接不上 ping不通 ssh连接虚拟机连不上 远程连接不上可能出现的问题

    如果检查过ssh服务启动 防火墙也关闭了 sshd也安装了 但是怎么ping都ping不通虚拟机网关ip 但是本机可以ping通的话 检查是否虚拟机端 wifi 和 你得xshell 或者finshell 是否在同一个局域网 同一个wifi
  • Shell脚本

    文章目录 第 1 章 shell基础1 1 运维 amp shell 了解 1 1 1 运维基础1 1 2 shell简介 1 2 shell脚本 记忆 1 2 1 创建脚本1 2 2 脚本使用 1 3 变量 应用 1 3 1 什么是变量1
  • Hive基本DDL操作

    1 数据库的DDL操作 xff08 1 xff09 创建数据库 数据库在HDFS上的默认存储路径是 user hive warehouse 数据库名 db hive gt create database db hive 两者等价hive g
  • Windows和Linux双系统时间不对的问题。

    解决Windows与Ubuntu双系统时间同步问题 2016年07月11日 21 05 30 阅读数 xff1a 33115 1 问题发现 本子上装的是Window 10 win7升级 和Ubuntu GNOME 14 04的双系统 一直以
  • stm32移植freertos报错keil

    Using Compiler 39 V5 06 update 7 build 960 39 folder 39 d Keil v5 ARM ARMCC Bin 39 compiling main c USER FreeRTOSConfig
  • ARMv8 (arrch64)pytorch深度学习环境搭建

    Aarch64 安装Anaconda 和 pytorch 一 安装miniconda 参考链接 xff1a 82条消息 Jetson Nano xff08 aarch64 xff09 搭建miniconda 和mmdetection环境 瑾
  • GPU 选择 深度学习 图像识别

    GPU 选择 深度学习 图像识别 1 显卡1 1 Nvidia显卡分类1 1 1 Geforce系列1 1 2 Quadro系列1 1 3 Tesla系列1 2 GPU几个比较重要的参数GPU架构 xff1a CUDA核心数量 xff1a
  • git 合并两个分支

    这里讲解具体的思想 xff0c 具体的提交命令百度上有 目前的场景是将两个非master上的分支进行合并 xff0c 并且不造成冲突 比如现在有两个分支a xff0c b 现在将b合并到a 首先及将b分支上的代码clone下来 xff0c
  • ubuntu中解决ROS--Gazebo添加模型库,解决打开后无模型的问题

    ubuntu中解决Gazebo添加模型库 xff0c 解决打开后无模型的问题 1 在主目录中ctrl 43 h 下载https bitbucket org osrf gazebo models downloads ExBot ROS专区 x
  • 大小端模式

    定义 xff1a 数据存放在地址中 xff0c 一个地址码对应一个字节 内存的低地址存放数据的低位 xff0c 则存储方式为小端存储 xff1b 内存的低地址存放数据的高位 xff0c 则为大端存储 判断大小端的方法有两种 xff1a 数据
  • Matlab二维插值

    Matlab二维插值 interp2函数 xff08 网格节点 xff09 Y 61 interp2 x y z xi yi method method nearest 最邻近插值linear xff08 默认 xff09 双线性插值cub
  • 4、ROS话题通信实战,代码逐行解析

    在前面小节已经实现了ROS工作空间的创建 xff0c 这里开始功能包的开发实战了 首先创建功能包 xff1a cd ROS src 创建功能包topic xff0c 指定依赖roscpp和std msgs包 catkin create pk
  • 大数据学习(三十)JOIN过程中的mapreduce阶段

    前言 xff1a join分为mapjoin 和 common 普通 join mapjoin 是没有reduce阶段 只有map阶段 在map阶段进行join操作 xff08 此知识点也会在大表join小表中体现 xff09 common
  • Gunicorn介绍、安装及使用

    1 简介 Gunicorn Green Unicorn 是一个 UNIX 下的 WSGI HTTP 服务器 xff0c 它是一个 移植自 Ruby 的 Unicorn 项目的 pre fork worker 模型 它既支持 eventlet
  • Spring Boot POM 详解

    正如这幅图所展示的那样 xff0c 在Spring IO Framework体系中 xff0c Spring Boot处在Execution layer xff0c 来看看官方对这层的解释 xff1a The Spring IO Execu
  • 基于阿木实验室P200飞行器simulink模型开发的多旋翼无人机自抗扰控制器(ADRC)参数调整和仿真

    1 飞行器模型参数 参考P200飞行器参数 利用网站https www flyeval com 计算飞行器如下 xff1a 2 参数设置具体如下 1 xff09 模型主要包括总线 期望数据生成模块 控制器 PWM生成器 飞行器对象模型 2
  • mkdir()函数

    一 创建目录 1 1 direct h 头文件 int mkdir const char path mode t mode 函数名 mkdir 功 能 建立一个目录 用 法 int mkdir const char dirname 头文件库

随机推荐