build.gradle 10.64 KiB
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'org.jlleitschuh.gradle.ktlint' version '11.3.1'
    id 'org.jetbrains.kotlin.android'
def appVersionName = "5.3.0"
def appVersionCode = 52005
def packageName = "org.linphone"
def firebaseAvailable = new File(projectDir.absolutePath +'/google-services.json').exists()
def crashlyticsAvailable = new File(projectDir.absolutePath +'/google-services.json').exists() && new File(LinphoneSdkBuildDir + '/libs/').exists() && new File(LinphoneSdkBuildDir + '/libs-debug/').exists()
def extractNativeLibs = false
if (firebaseAvailable) {
    apply plugin: 'com.google.gms.google-services'
def gitBranch = new ByteArrayOutputStream()
task getGitVersion() {
    def gitVersion = appVersionName
    def gitVersionStream = new ByteArrayOutputStream()
    def gitCommitsCount = new ByteArrayOutputStream()
    def gitCommitHash = new ByteArrayOutputStream()
    try {
        exec {
            executable "git" args "describe", "--abbrev=0"
            standardOutput = gitVersionStream
        exec {
            executable "git" args "rev-list", gitVersionStream.toString().trim() + "..HEAD", "--count"
            standardOutput = gitCommitsCount
        exec {
            executable "git" args "rev-parse", "--short", "HEAD"
            standardOutput = gitCommitHash
        exec {
            executable "git" args "name-rev", "--name-only", "HEAD"
            standardOutput = gitBranch
        if (gitCommitsCount.toString().toInteger() == 0) {
            gitVersion = gitVersionStream.toString().trim()
        } else {
            gitVersion = gitVersionStream.toString().trim() + "." + gitCommitsCount.toString().trim() + "+" + gitCommitHash.toString().trim()
        println("Git version: " + gitVersion + " (" + appVersionCode + ")")
    } catch (ignored) {
        println("Git not found, using " + gitVersion + " (" + appVersionCode + ")")
    project.version = gitVersion
configurations {
    customImplementation.extendsFrom implementation
task linphoneSdkSource() {
    doLast {
        configurations.customImplementation.getIncoming().each {
            it.getResolutionResult().allComponents.each {
                if (it.id.getDisplayName().contains("linphone-sdk-android")) {
                    println 'Linphone SDK used is ' + it.moduleVersion.version + ' from ' + it.properties["repositoryName"]
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
} } } } } project.tasks['preBuild'].dependsOn 'getGitVersion' project.tasks['preBuild'].dependsOn 'linphoneSdkSource' android { compileOptions { sourceCompatibility = 17 targetCompatibility = 17 } compileSdkVersion 34 defaultConfig { minSdkVersion 23 targetSdkVersion 34 versionCode appVersionCode versionName "${project.version}" applicationId packageName } applicationVariants.all { variant -> variant.outputs.all { outputFileName = "linphone-android-${variant.buildType.name}-${project.version}.apk" } var enableFirebaseService = "false" if (firebaseAvailable) { enableFirebaseService = "true" } // See https://developer.android.com/studio/releases/gradle-plugin#3-6-0-behavior for why extractNativeLibs is set to true in debug flavor if (variant.buildType.name == "release" || variant.buildType.name == "releaseWithCrashlytics") { variant.getMergedFlavor().manifestPlaceholders = [linphone_address_mime_type: "vnd.android.cursor.item/vnd." + packageName + ".provider.sip_address", linphone_file_provider: packageName + ".fileprovider", appLabel: "@string/app_name", firebaseServiceEnabled: enableFirebaseService] } else { variant.getMergedFlavor().manifestPlaceholders = [linphone_address_mime_type: "vnd.android.cursor.item/vnd." + packageName + ".provider.sip_address", linphone_file_provider: packageName + ".debug.fileprovider", appLabel: "@string/app_name_debug", firebaseServiceEnabled: enableFirebaseService] extractNativeLibs = true } } def keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) signingConfigs { release { storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] } } buildTypes { release { minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' resValue "string", "linphone_app_branch", gitBranch.toString().trim() resValue "string", "sync_account_type", packageName + ".sync"
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
resValue "string", "file_provider", packageName + ".fileprovider" resValue "string", "linphone_address_mime_type", "vnd.android.cursor.item/vnd." + packageName + ".provider.sip_address" if (!firebaseAvailable) { resValue "string", "gcm_defaultSenderId", "none" } resValue "bool", "crashlytics_enabled", "false" } releaseWithCrashlytics { initWith release resValue "bool", "crashlytics_enabled", crashlyticsAvailable.toString() if (crashlyticsAvailable) { apply plugin: 'com.google.firebase.crashlytics' firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file(LinphoneSdkBuildDir + '/libs-debug/').toString() } } } debug { applicationIdSuffix ".debug" debuggable true jniDebuggable true resValue "string", "linphone_app_branch", gitBranch.toString().trim() resValue "string", "sync_account_type", packageName + ".sync" resValue "string", "file_provider", packageName + ".debug.fileprovider" resValue "string", "linphone_address_mime_type", "vnd.android.cursor.item/vnd." + packageName + ".provider.sip_address" resValue "bool", "crashlytics_enabled", crashlyticsAvailable.toString() if (!firebaseAvailable) { resValue "string", "gcm_defaultSenderId", "none" } if (crashlyticsAvailable) { apply plugin: 'com.google.firebase.crashlytics' firebaseCrashlytics { nativeSymbolUploadEnabled false } } } } buildFeatures { dataBinding = true } namespace 'org.linphone' packagingOptions { jniLibs { useLegacyPackaging extractNativeLibs } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.core:core-splashscreen:1.0.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2' implementation 'androidx.media:media:1.6.0' implementation "androidx.security:security-crypto-ktx:1.1.0-alpha06"
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
implementation "androidx.window:window:1.2.0" def emoji_version = "1.4.0" implementation "androidx.emoji2:emoji2:$emoji_version" implementation "androidx.emoji2:emoji2-emojipicker:$emoji_version" def nav_version = "2.7.5" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" implementation "androidx.slidingpanelayout:slidingpanelayout:1.2.0" implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.gridlayout:gridlayout:1.0.0" implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.drawerlayout:drawerlayout:1.2.0' // https://github.com/material-components/material-components-android/blob/master/LICENSE Apache v2.0 implementation 'com.google.android.material:material:1.10.0' // https://github.com/google/flexbox-layout/blob/main/LICENSE Apache v2.0 implementation 'com.google.android.flexbox:flexbox:3.0.0' // https://github.com/coil-kt/coil/blob/main/LICENSE.txt Apache v2.0 def coil_version = "2.4.0" implementation("io.coil-kt:coil:$coil_version") implementation("io.coil-kt:coil-gif:$coil_version") implementation("io.coil-kt:coil-svg:$coil_version") implementation("io.coil-kt:coil-video:$coil_version") // https://github.com/Baseflow/PhotoView/blob/master/LICENSE Apache v2.0 implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation platform('com.google.firebase:firebase-bom:32.5.0') if (crashlyticsAvailable) { debugImplementation 'com.google.firebase:firebase-crashlytics-ndk' releaseWithCrashlyticsImplementation 'com.google.firebase:firebase-crashlytics-ndk' releaseCompileOnly 'com.google.firebase:firebase-crashlytics-ndk' } else { compileOnly 'com.google.firebase:firebase-crashlytics-ndk' } if (firebaseAvailable) { implementation 'com.google.firebase:firebase-messaging' } implementation 'org.linphone:linphone-sdk-android:5.4+' // Only enable leak canary prior to release // debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' } task generateContactsXml(type: Copy) { from 'contacts.xml' into "src/main/res/xml/" outputs.upToDateWhen { file('src/main/res/xml/contacts.xml').exists() } filter { line -> line .replaceAll('%%AUTO_GENERATED%%', 'This file has been automatically generated, do not edit or commit !') .replaceAll('%%PACKAGE_NAME%%', packageName) } } project.tasks['preBuild'].dependsOn 'generateContactsXml' ktlint { android = true ignoreFailures = true } project.tasks['preBuild'].dependsOn 'ktlintFormat' if (crashlyticsAvailable) {
281282283284285286
afterEvaluate { assembleReleaseWithCrashlytics.finalizedBy(uploadCrashlyticsSymbolFileReleaseWithCrashlytics) packageReleaseWithCrashlytics.finalizedBy(uploadCrashlyticsSymbolFileReleaseWithCrashlytics) } }