linphone-android/app/build.gradle.kts

316 lines
12 KiB
Kotlin

import com.android.build.gradle.internal.tasks.factory.dependsOn
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension
import com.google.gms.googleservices.GoogleServicesPlugin
import java.io.ByteArrayOutputStream
import java.io.FileInputStream
import java.util.Properties
plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.kapt)
alias(libs.plugins.ktlint)
alias(libs.plugins.jetbrainsKotlinAndroid)
alias(libs.plugins.navigation)
alias(libs.plugins.crashlytics)
}
val packageName = "org.linphone"
val useDifferentPackageNameForDebugBuild = false
val sdkPath = providers.gradleProperty("LinphoneSdkBuildDir").get()
val googleServices = File(projectDir.absolutePath + "/google-services.json")
val linphoneLibs = File("$sdkPath/libs/")
val linphoneDebugLibs = File("$sdkPath/libs-debug/")
val firebaseCloudMessagingAvailable = googleServices.exists()
val crashlyticsAvailable = googleServices.exists() && linphoneLibs.exists() && linphoneDebugLibs.exists()
if (firebaseCloudMessagingAvailable) {
println("google-services.json found, enabling CloudMessaging feature")
apply<GoogleServicesPlugin>()
} else {
println("google-services.json not found, disabling CloudMessaging feature")
}
var gitBranch = ByteArrayOutputStream()
var gitVersion = "6.0.4"
task("getGitVersion") {
val gitVersionStream = ByteArrayOutputStream()
val gitCommitsCount = ByteArrayOutputStream()
val gitCommitHash = ByteArrayOutputStream()
try {
exec {
commandLine("git", "describe", "--abbrev=0")
standardOutput = gitVersionStream
}
exec {
commandLine(
"git",
"rev-list",
gitVersionStream.toString().trim() + "..HEAD",
"--count",
)
standardOutput = gitCommitsCount
}
exec {
commandLine("git", "rev-parse", "--short", "HEAD")
standardOutput = gitCommitHash
}
exec {
commandLine("git", "name-rev", "--name-only", "HEAD")
standardOutput = gitBranch
}
gitVersion =
if (gitCommitsCount.toString().trim().toInt() == 0) {
gitVersionStream.toString().trim()
} else {
gitVersionStream.toString().trim() + "." +
gitCommitsCount.toString()
.trim() + "+" + gitCommitHash.toString().trim()
}
println("Git version: $gitVersion")
} catch (e: Exception) {
println("Git not found [$e], using $gitVersion")
}
project.version = gitVersion
}
project.tasks.preBuild.dependsOn("getGitVersion")
configurations {
implementation { isCanBeResolved = true }
}
task("linphoneSdkSource") {
doLast {
configurations.implementation.get().incoming.resolutionResult.allComponents.forEach {
if (it.id.displayName.contains("linphone-sdk-android")) {
println("Linphone SDK used is ${it.moduleVersion?.version}")
}
}
}
}
project.tasks.preBuild.dependsOn("linphoneSdkSource")
android {
namespace = "org.linphone"
compileSdk = 36
defaultConfig {
applicationId = packageName
minSdk = 28
targetSdk = 36
versionCode = 600004 // 6.00.004
versionName = "6.0.4"
manifestPlaceholders["appAuthRedirectScheme"] = packageName
ndk {
//noinspection ChromeOsAbiSupport
abiFilters += listOf("armeabi-v7a", "arm64-v8a")
}
}
applicationVariants.all {
val variant = this
variant.outputs
.map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl }
.forEach { output ->
output.outputFileName = "linphone-android-${variant.buildType.name}-${project.version}.apk"
}
}
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
signingConfigs {
create("release") {
val keyStorePath = keystoreProperties["storeFile"] as String
val keyStore = project.file(keyStorePath)
if (keyStore.exists()) {
storeFile = keyStore
storePassword = keystoreProperties["storePassword"] as String
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
println("Signing config release is using keystore [$storeFile]")
} else {
println("Keystore [$storeFile] doesn't exists!")
}
}
}
buildTypes {
getByName("debug") {
if (useDifferentPackageNameForDebugBuild) {
applicationIdSuffix = ".debug"
}
isDebuggable = true
isJniDebuggable = true
if (useDifferentPackageNameForDebugBuild) {
resValue("string", "file_provider", "$packageName.debug.fileprovider")
} else {
resValue("string", "file_provider", "$packageName.fileprovider")
}
resValue("string", "linphone_app_version", gitVersion.trim())
resValue("string", "linphone_app_branch", gitBranch.toString().trim())
resValue("string", "linphone_openid_callback_scheme", packageName)
if (crashlyticsAvailable) {
val path = File("$sdkPath/libs-debug/").toString()
configure<CrashlyticsExtension> {
nativeSymbolUploadEnabled = true
unstrippedNativeLibsDir = path
}
}
buildConfigField("Boolean", "CRASHLYTICS_ENABLED", crashlyticsAvailable.toString())
}
getByName("release") {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
signingConfig = signingConfigs.getByName("release")
resValue("string", "file_provider", "$packageName.fileprovider")
resValue("string", "linphone_app_version", gitVersion.trim())
resValue("string", "linphone_app_branch", gitBranch.toString().trim())
resValue("string", "linphone_openid_callback_scheme", packageName)
if (crashlyticsAvailable) {
val path = File("$sdkPath/libs-debug/").toString()
configure<CrashlyticsExtension> {
nativeSymbolUploadEnabled = true
unstrippedNativeLibsDir = path
}
}
buildConfigField("Boolean", "CRASHLYTICS_ENABLED", crashlyticsAvailable.toString())
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
buildFeatures {
dataBinding = true
buildConfig = true
}
lint {
abortOnError = false
}
}
dependencies {
implementation(libs.androidx.annotations)
implementation(libs.androidx.activity)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.constraint.layout)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.splashscreen)
implementation(libs.androidx.telecom)
implementation(libs.androidx.media)
implementation(libs.androidx.recyclerview)
implementation(libs.androidx.slidingpanelayout)
implementation(libs.androidx.window)
implementation(libs.androidx.gridlayout)
implementation(libs.androidx.security.crypto.ktx)
implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.androidx.emoji2)
implementation(libs.androidx.car)
// https://github.com/google/flexbox-layout/blob/main/LICENSE Apache v2.0
implementation(libs.google.flexbox)
// https://github.com/material-components/material-components-android/blob/master/LICENSE Apache v2.0
implementation(libs.google.material)
// To be able to parse native crash tombstone and print them with SDK logs the next time the app will start
implementation(libs.google.protobuf)
implementation(platform(libs.google.firebase.bom))
implementation(libs.google.firebase.messaging)
implementation(libs.google.firebase.crashlytics)
// https://github.com/coil-kt/coil/blob/main/LICENSE.txt Apache v2.0
implementation(libs.coil)
implementation(libs.coil.gif)
implementation(libs.coil.svg)
implementation(libs.coil.video)
// https://github.com/tommybuonomo/dotsindicator/blob/master/LICENSE Apache v2.0
implementation(libs.dots.indicator)
// https://github.com/Baseflow/PhotoView/blob/master/LICENSE Apache v2.0
implementation(libs.photoview)
// https://github.com/openid/AppAuth-Android/blob/master/LICENSE Apache v2.0
implementation(libs.openid.appauth)
implementation(libs.linphone)
}
configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> {
android.set(true)
ignoreFailures.set(true)
additionalEditorconfig.set(
mapOf(
"max_line_length" to "120",
"ktlint_standard_max-line-length" to "disabled",
"ktlint_standard_function-signature" to "disabled",
"ktlint_standard_no-blank-line-before-rbrace" to "disabled",
"ktlint_standard_no-empty-class-body" to "disabled",
"ktlint_standard_annotation-spacing" to "disabled",
"ktlint_standard_class-signature" to "disabled",
"ktlint_standard_function-expression-body" to "disabled",
"ktlint_standard_function-type-modifier-spacing" to "disabled",
"ktlint_standard_if-else-wrapping" to "disabled",
"ktlint_standard_argument-list-wrapping" to "disabled",
"ktlint_standard_trailing-comma-on-call-site" to "disabled",
"ktlint_standard_trailing-comma-on-declaration-site" to "disabled",
"ktlint_standard_no-empty-first-line-in-class-body" to "disabled",
"ktlint_standard_no-empty-first-line-in-method-block" to "disabled",
"ktlint_standard_no-trailing-spaces" to "disabled",
"ktlint_standard_no-blank-line-in-list" to "disabled",
"ktlint_standard_no-multi-spaces" to "disabled",
"ktlint_standard_try-catch-finally-spacing" to "disabled",
"ktlint_standard_block-comment-initial-star-alignment" to "disabled",
"ktlint_standard_spacing-between-declarations-with-comments" to "disabled",
"ktlint_standard_no-consecutive-comments" to "disabled",
"ktlint_standard_multiline-expression-wrapping" to "disabled",
"ktlint_standard_parameter-list-wrapping" to "disabled",
"ktlint_standard_comment-wrapping" to "disabled",
"ktlint_standard_discouraged-comment-location" to "disabled",
"ktlint_standard_string-template-indent" to "disabled",
"ktlint_standard_parameter-list-spacing" to "disabled",
"ktlint_standard_statement-wrapping" to "disabled",
"ktlint_standard_import-ordering" to "disabled",
"ktlint_standard_paren-spacing" to "disabled",
"ktlint_standard_curly-spacing" to "disabled",
"ktlint_standard_indent" to "disabled",
)
)
}
project.tasks.preBuild.dependsOn("ktlintFormat")
if (crashlyticsAvailable) {
afterEvaluate {
tasks.getByName("assembleDebug").finalizedBy(
tasks.getByName("uploadCrashlyticsSymbolFileDebug"),
)
tasks.getByName("packageDebug").finalizedBy(
tasks.getByName("uploadCrashlyticsSymbolFileDebug"),
)
tasks.getByName("assembleRelease").finalizedBy(
tasks.getByName("uploadCrashlyticsSymbolFileRelease"),
)
tasks.getByName("packageRelease").finalizedBy(
tasks.getByName("uploadCrashlyticsSymbolFileRelease"),
)
}
}