zoukankan      html  css  js  c++  java
  • gradle+shell实现自动系统签名

    前言

    有时候我们的应用需要系统级的权限来实现一些功能(如静默安装),这时候需要给应用打上系统签名,常规操作打包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了。

    更多文章,尽在个人博客

  • 相关阅读:
    libpcap编程实例
    libnet发包例子(tcp udp arp广播)
    C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)
    创建一个实例&创建一个线程。。
    (转)C#中的 Interfaces (For 初学者们)
    C#中接口声明属性,但是提示“接口”中不能有属性。
    十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧。
    C#中的多态性
    Windows 程序支持 Unicode
    Python 中的函数与类的方法
  • 原文地址:https://www.cnblogs.com/bosh123/p/11308531.html
Copyright © 2011-2022 走看看