这是一个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)的依赖