欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

gradle+shell实现自动系统签名

程序员文章站 2022-03-21 21:44:56
前言 有时候我们的应用需要系统级的权限来实现一些功能(如静默安装),这时候需要给应用打上系统签名,常规操作打包apk,解压apk,删除META INF中CERT.RSA和 CERT.SF,然后压缩,用系统签名工具签名,一顿操作后可能十分钟过去了,实在太过繁琐,因此我们做了一些简化,用gradle+s ......

前言

有时候我们的应用需要系统级的权限来实现一些功能(如静默安装),这时候需要给应用打上系统签名,常规操作打包apk,解压apk,删除meta-inf中cert.rsa和
cert.sf,然后压缩,用系统签名工具签名,一顿操作后可能十分钟过去了,实在太过繁琐,因此我们做了一些简化,用gradle+shell帮我们实现自动化。

准备

  1. android studio
  2. 系统签名文件(signapk.jar、platform.x509.pem、platform.pk8)
  3. 如果是mac系统,还需要libconscrypt_openjdk_jni.dylib这个文件
  4. platform.x509.pem和platform.pk8是对应系统的签名,不同厂家可能有不同的
    签名文件,我这里的是google原生的签名文件。
  5. 文件在百度网盘
    提取码: 32wm
  6. 本文以mac系统为例,windows的按着这思路,也差不多

编写系统签名脚本

#解压
unzip -q app-release.apk -d ./release
#删除cert
rm -f ./release/meta-inf/cert.rsa
rm -f ./release/meta-inf/cert.sf
#压缩
cd ./release
for file in $(ls)
do
zip -r -q app-release-tmp.apk -xi $file;
done
mv app-release-tmp.apk ../
cd ..
#系统签名
java -jar signapk.jar platform.x509.pem platform.pk8 app-release-tmp.apk app-sign.apk
#清理临时文件
rm -f app-release-tmp.apk
rm -rf ./release

保存为sign.sh,与signapk.jar、platform.x509.pem、platform.pk8、libconscrypt_openjdk_jni.dylib放在同一目录下,我这里是放在项目的
app/release/sign/目录下

编写打包和调用系统签名脚本

#需注意配置一下路径
#home 本shell放置绝对路径
#debugdir assembledebug 输出路径
#releasedir assemblerelease 输出路径
#signdir 系统签名文件路径

home=/volumes/samsung_t5/android/demo/
debugdir=$home/app/build/outputs/apk/debug/
releasedir=$home/app/build/outputs/apk/release/
signdir=$home/app/release/sign/

#进入工作目录
cd $home
#创建签名后的输出目录$home/out
if [ ! -d out ];then
        echo "create directory out..."
        mkdir out
        echo "create directory out success"
fi

#打release包
echo "assemblerelease..."
./gradlew assemblerelease
echo "assemblerelease success"
#把release包移动到系统签名目录
mv -f $releasedir/app-release.apk $signdir/app-release.apk
echo "system sign apk..."
#进入系统签名目录,执行系统签名
cd $signdir
./sign.sh
#把签名好的包移动到$home/out中,并用时间重命名
cd $home
mv $quanyuyuesigndir/app-sign.apk ./out/app-sign-`date +%y%m%d%h%m`.apk
echo "sign success"

保存上面代码为package.sh,并放在工程目录下,我的是$home目录下。

ps:要打release包还需要配置下app/build.gradle

android {
        ...
        //配置签名文件
        signingconfigs {
            release {
                storefile file("你的签名文件")
                storepassword "你的密码"
                keyalias "你的keyalias"
                keypassword "你的keypassword"
            }
        }
        buildtypes {
            release {
                signingconfigs.release
                ...
            }
        }

编写task调用package.sh脚本

在app/build.gradle中输入

task getpackage(type: exec) {
        executable "sh"
        args "-c", "../packge.sh"
}

这样,我们只要执行下这个task,就可以获得系统签名的apk了。

更多文章,尽在