美文网首页
apk 签名

apk 签名

作者: Leo_o | 来源:发表于2023-03-22 14:06 被阅读0次

task signApkAndMeituanChannel() {
    group = "channel"
    description = "签名apk 并生成渠道包"
    doLast {
        File apkFile = null
        def path = "${projectDir.absolutePath}/channel/v${VERSION_CODE}"
        fileTree(path).each {
            def fileName = it.getName()
            if (it.isFile() && fileName.endsWith(".apk") && fileName.contains("_jiagu") && !fileName.contains("_sign")) {
                // 找到未签名的apk文件
                apkFile = it
            }
        }
        if (apkFile == null || !apkFile.exists()) {
            throw new FileNotFoundException('apkFile is not exists')
        }
        apkFile = zipAlignApk(apkFile)
        apkFile = signApkV2(apkFile)
        exec {
            executable = 'java'
            args = ['-jar', "${rootProject.getProjectDir()}/walle-cli-all.jar",
                    'batch', '-f',
                    "${project.getProjectDir()}/channel.txt",
                    apkFile.absolutePath
            ]
        }
    }
}

/**
 * 加固后的apk 对齐压缩
 * @param apk 已加固apk
 * @return 返回对齐压缩后的apk
 */
def zipAlignApk(File apk) {
    if (apk == null || !apk.exists()) {
        println "---zipalign reinforceApk throw exception and forced stop!---"
        throw new FileNotFoundException('apk is not exists and cannot reinforce')
    }
    def file = new File("${apk.absolutePath.replace(".apk", "_zip.apk")}")
    if (file.exists()) {
        file.delete()
    }
    exec {
        commandLine "cmd", "/c", "${getApkSignerAndZipAlignPath()}/zipalign -v -p 4 ${apk.absolutePath} ${file.absolutePath}"
    }
    if (apk.exists()) {
        apk.delete()
    }
    return file
}

/**
 * 对apk签名
 * @param zipApk 压缩对齐后的apk
 * @return 签名后的apk
 */
def signApkV2(File apkFile) {
    if (apkFile == null || !apkFile.exists()) {
        println "---sign apkFile throw exception and forced stop!---"
        throw new FileNotFoundException('apk is not exists and cannot reinforce')
    }
    def file = new File("${apkFile.absolutePath.replace("_zip.apk", "_sign.apk")}")
    if (file.exists()) {
        file.delete()
    }
    def storeFile = rootProject.file("keystore.jks")
    def keyAlias = rootProject.ext.signing["keyAlias"]
    def keyPassword = rootProject.ext.signing["keyPassword"]
    def storePassword = rootProject.ext.signing["storePassword"]
    exec {
        commandLine "powershell", "/c", "${getApkSignerAndZipAlignPath()}/apksigner sign --ks ${storeFile.absolutePath} --ks-key-alias ${keyAlias} --ks-pass pass:${storePassword} --key-pass pass:${keyPassword} --out ${file.absolutePath} ${apkFile.absolutePath}"
    }
    if (apkFile.exists()) {
        apkFile.delete()
    }
    def signBeforeFile = new File("${file.absolutePath}.idsig")
    if (signBeforeFile.exists()) {
        signBeforeFile.delete()
    }
    return file
}

/***
 * 获取 SDK 目录下的最新 SDK 版本路径
 * @return
 */
def getApkSignerAndZipAlignPath() {
    def sdkDirectory = new File("${parseLocalProperties()}\\build-tools")
    def listFiles = sdkDirectory.listFiles()
    def fileSize = listFiles.size()
    return listFiles[fileSize - 1]
}

/***
 * 获取 SDK 路径
 * @return
 */
def parseLocalProperties() {
    File file = rootProject.file("local.properties")
    if (file.exists()) {
        InputStream inputStream = file.newDataInputStream()
        Properties properties = new Properties()
        properties.load(inputStream)
        return properties.getProperty("sdk.dir")
    }
    throw new FileNotFoundException('local.properties is not exists and cannot reinforce')
}

相关文章

网友评论

      本文标题:apk 签名

      本文链接:https://www.haomeiwen.com/subject/vszvrdtx.html