文章目录
- 前言
- 1. 查看apk文件的签名类型的shell命令
- 2. 自动校验签名并输出的完整脚本
-
- 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 命令脚本
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
find ${ROOT_DIR} -name "*.apk" | while read line
do
FILE=${line}
${ROOT_DOR}/apksigner verify --verbose "${FILE}" | while read line2
do
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
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
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
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(使用前将#替换为@)