build.gradle.kt文件内运行shell脚本

这是一个build.gradle.kts文件,用来构建apk,native部分我用build.sh脚本调用cmake构建共享库,现在我想在这个build.gradle.kts文件里加上运行build.sh的部分,使其能够在构建apk的时候自动构建native,我该怎么做?

android {
    compileSdk = 33
    testOptions {
        unitTests.isReturnDefaultValues = true
    }
    lint {
        abortOnError = false
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId = "com.Chat.WeChat"
        minSdk = 28
        targetSdk = 33
        versionCode = VersionCode
        versionName = VersionName
        val VersionMajor: String by project
        val VersionMinor: String by project
        val VersionBuild: String by project
        buildConfigField("int", "VersionMajor", VersionMajor)
        buildConfigField("int", "VersionMinor", VersionMinor)
        buildConfigField("int", "VersionBuild", VersionBuild)
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    afterEvaluate {
        project.tasks.forEach { task ->
            val taskName = task.name
            if (taskName.contains("assemble")) {
                task.doLast {
                    applicationVariants.forEach inner@{ variant ->
                        val flavor = variant.productFlavors[0].name
                        val buildType = variant.buildType.name
                        val reportMode = if (REPORT2TESTLIB == "false") "on" else "off"
                        if (!taskName.toLowerCaseAsciiOnly()
                                .contains(flavor.toLowerCaseAsciiOnly()) ||
                            !taskName.toLowerCaseAsciiOnly()
                                .contains(buildType.toLowerCaseAsciiOnly())
                        ) return@inner
                        var originalFileName = ""
                        variant.outputs.configureEach {
                            println("outputFileName: " + outputFile.name)
                            originalFileName = outputFile.name
                        }
                        if (originalFileName.isEmpty()) return@inner
                        var originalFolder = File("$buildDir/intermediates/apk/$flavor/$buildType")
                        val destFileName =
                            "Service-v$VersionName-$buildType-$reportMode-$flavor.apk"
                        val destFolder = File("$buildDir/outputs/apk/$flavor/$buildType")
                        if (!originalFolder.exists()) {
                            originalFolder = destFolder
                        }
                        println("from: $originalFolder/$originalFileName")
                        println("into: $destFolder/$destFileName")
                        if (!destFolder.exists()) {
                            destFolder.mkdir()
                        }
                        copy {
                            from("$originalFolder/$originalFileName")
                            into("$destFolder/")
                            rename {
                                destFileName
                            }
                        }
                    }
                }
            }
        }
    }

    signingConfigs {
        create("phone_release") {
            keyAlias = "chat"
            keyPassword = "we-chat"
            storeFile =
                File(file(".").getAbsolutePath() + "/../keystore/-service.jks").getAbsoluteFile()
            storePassword = "M2C7S76"
            enableV2Signing = true
        }
        create("phone_debug") {
            keyAlias = "px3wv6a"
            keyPassword = "android"
            storeFile = File(file(".").absolutePath + "/../keystore/keystore-debug").absoluteFile
            storePassword = "android"
        }
        create("sound_release") {
            keyAlias = "androiddebugkey"
            keyPassword = "android"
            storeFile = File(file(".").absolutePath + "/../keystore/platform.keystore").absoluteFile
            storePassword = "android"

            enableV1Signing = true
            enableV2Signing = true
        }
        create("sound_debug") {
            keyAlias = "androiddebugkey"
            keyPassword = "android"
            storeFile = File(file(".").absolutePath + "/../keystore/platform.keystore").absoluteFile
            storePassword = "android"

            enableV1Signing = true
            enableV2Signing = true
        }
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
            // isTestCoverageEnabled = false // it will break jacoco test report
        }
        getByName("debug") {
            signingConfig = null
            isMinifyEnabled = false
            // isTestCoverageEnabled = true // it will break jacoco test report
        }
    }


    productFlavors {
        val dimensionVersionCode = "versionCode"
        flavorDimensions += dimensionVersionCode

        val phoneSigningVariable = signingConfigs.getByName("phone_debug")
        val soundSigningVariable = signingConfigs.getByName("sound_debug")
        val hardwareTag = "HARD_WARE_TAG"
        val hardwareBle = "android.hardware.bluetooth_le"
        val hardwareTelevision = "android.hardware.type.television"

        create("phoneInternal") {
            dimension = dimensionVersionCode
            manifestPlaceholders[hardwareTag] = hardwareBle
            signingConfig = phoneSigningVariable
            ndk {
                abiFilters += "armeabi-v7a"
                abiFilters += "arm64-v8a"
            }
        }
        create("tvInternal") {
            dimension = dimensionVersionCode
            targetSdk = 29
            manifestPlaceholders[hardwareTag] = hardwareTelevision
            ndk {
                abiFilters += "armeabi-v7a"
                abiFilters += "arm64-v8a"
            }
        }

        create("sound_arm32") {
            dimension = dimensionVersionCode
            manifestPlaceholders[hardwareTag] = hardwareBle
            signingConfig = soundSigningVariable
            ndk {
                abiFilters += "armeabi-v7a"
            }
        }
        create("sound_arm64") {
            dimension = dimensionVersionCode
            manifestPlaceholders[hardwareTag] = hardwareBle
            signingConfig = soundSigningVariable
            ndk {
                abiFilters += "arm64-v8a"
            }
        }
    }

    packagingOptions {
        resources {
            excludes += "notice.html"
            excludes += "edl-v10.html"
            excludes += "epl-v10.html"
            excludes += "3rd-party/APACHE-LICENSE-2.0.txt"
            excludes += "3rd-party/BSD-3-Clause-LICENSE.txt"
            excludes += "3rd-party/MIT-license.html"
            excludes += "3rd-party/cc0-legalcode.html"
        }
        jniLibs {
            useLegacyPackaging = true
        }
    }
    //useLibrary "android.test.runner"
    useLibrary("android.test.base")
    useLibrary("android.test.mock")
}

可以使用exec

在 build.gradle.kt 文件中运行 shell 脚本,可以使用 Kotlin 的 exec 函数来实现。以下是一个示例:


import org.gradle.api.tasks.Exec

task runShellScript(type: Exec) {
    commandLine("sh", "path/to/script.sh")
}

// 在其他任务之前运行 shell 脚本任务
tasks.named("build").configure {
    dependsOn("runShellScript")
}
在上述示例中,我们创建了一个名为 runShellScript 的任务,它使用 Gradle 的 Exec 类型。commandLine 函数用于指定要执行的 shell 脚本,可以根据实际情况修改脚本的路径。

最后,我们通过 dependsOn 方法将 runShellScript 任务添加为其他任务(例如 build)的依赖