308 lines
12 KiB
Groovy
308 lines
12 KiB
Groovy
plugins {
|
|
id 'com.android.application' version '8.11.1'
|
|
id 'com.google.gms.google-services' version '4.4.1'
|
|
}
|
|
|
|
repositories {
|
|
google()
|
|
mavenCentral()
|
|
maven {
|
|
url "https://www.jitpack.io"
|
|
name 'JitPack Github wrapper'
|
|
}
|
|
}
|
|
|
|
android {
|
|
dependenciesInfo {
|
|
// Disables dependency metadata when building APKs.
|
|
includeInApk = false
|
|
// Disables dependency metadata when building Android App Bundles.
|
|
includeInBundle = false
|
|
}
|
|
namespace "org.thoughtcrime.securesms"
|
|
flavorDimensions "none"
|
|
compileSdk 36
|
|
|
|
// Set NDK version to strip native libraries.
|
|
// Even though we compile our libraries outside Gradle with `scripts/ndk-make.sh`,
|
|
// without ndkVersion `./gradlew clean` followed by `./gradlew assembleDebug --warning-mode=all` emits the following warning:
|
|
// > Task :stripFatDebugDebugSymbols
|
|
// Unable to strip the following libraries, packaging them as they are: libanimation-decoder-gif.so, libnative-utils.so.
|
|
// See <https://issuetracker.google.com/issues/237187538> for details.
|
|
ndkVersion "27.0.12077973"
|
|
useLibrary 'org.apache.http.legacy'
|
|
|
|
defaultConfig {
|
|
versionCode 30000735
|
|
versionName "2.34.0"
|
|
|
|
applicationId "chat.delta.lite"
|
|
multiDexEnabled true
|
|
|
|
minSdkVersion 21
|
|
targetSdkVersion 36
|
|
|
|
vectorDrawables.useSupportLibrary = true
|
|
|
|
// base name of the generated apk
|
|
project.ext.set("archivesBaseName", "deltachat");
|
|
|
|
buildConfigField "boolean", "DEV_BUILD", "false"
|
|
|
|
ndk {
|
|
if(project.hasProperty("ABI_FILTER")) {
|
|
abiFilters ABI_FILTER
|
|
} else {
|
|
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
|
|
}
|
|
}
|
|
|
|
|
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
|
|
buildConfigField("String", "TEST_ADDR", buildConfigProperty("TEST_ADDR"))
|
|
buildConfigField("String", "TEST_MAIL_PW", buildConfigProperty("TEST_MAIL_PW"))
|
|
buildConfigField("String", "NDK_ARCH", getNdkArch())
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility JavaVersion.VERSION_1_8
|
|
targetCompatibility JavaVersion.VERSION_1_8
|
|
}
|
|
packagingOptions {
|
|
jniLibs {
|
|
doNotStrip '**/*.so'
|
|
keepDebugSymbols += ['*/mips/*.so', '*/mips64/*.so']
|
|
}
|
|
resources {
|
|
excludes += ['LICENSE.txt', 'LICENSE', 'NOTICE', 'asm-license.txt', 'META-INF/LICENSE', 'META-INF/NOTICE']
|
|
}
|
|
}
|
|
|
|
|
|
signingConfigs {
|
|
debug {
|
|
// add `DC_DEBUG_STORE_FILE=/path/to/debug.keystore` to `~/.gradle/gradle.properties`
|
|
if(project.hasProperty("DC_DEBUG_STORE_FILE" )) {
|
|
storeFile file(DC_DEBUG_STORE_FILE )
|
|
}
|
|
}
|
|
releaseFdroid {
|
|
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
|
|
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
|
|
storeFile file(DC_RELEASE_STORE_FILE)
|
|
storePassword DC_RELEASE_STORE_PASSWORD
|
|
keyAlias DC_RELEASE_KEY_ALIAS_FDROID
|
|
keyPassword DC_RELEASE_KEY_PASSWORD
|
|
}
|
|
}
|
|
releaseApk {
|
|
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
|
|
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
|
|
storeFile file(DC_RELEASE_STORE_FILE)
|
|
storePassword DC_RELEASE_STORE_PASSWORD
|
|
keyAlias DC_RELEASE_KEY_ALIAS_GPLAY
|
|
keyPassword DC_RELEASE_KEY_PASSWORD
|
|
}
|
|
}
|
|
releaseBundle {
|
|
if(project.hasProperty("DC_BUNDLE_STORE_FILE")) {
|
|
storeFile file(DC_BUNDLE_STORE_FILE)
|
|
storePassword DC_BUNDLE_STORE_PASSWORD
|
|
keyAlias DC_BUNDLE_KEY_ALIAS
|
|
keyPassword DC_BUNDLE_STORE_PASSWORD
|
|
}
|
|
}
|
|
}
|
|
|
|
productFlavors {
|
|
foss {
|
|
dimension "none"
|
|
buildConfigField "boolean", "USE_PLAY_SERVICES", "false"
|
|
}
|
|
gplay {
|
|
dimension "none"
|
|
apply plugin: "com.google.gms.google-services"
|
|
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
|
|
applicationId "com.github.arcanechat"
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
debug {
|
|
minifyEnabled true
|
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
testProguardFiles 'test-proguard-rules.pro'
|
|
applicationIdSuffix ".beta"
|
|
}
|
|
release {
|
|
// minification and proguard disabled for now.
|
|
//
|
|
// when enabled, it can cut down apk size about 6%,
|
|
// however this also has the potential to break things.
|
|
// so exceptions are needed and have to be maintained.
|
|
// (see git-history and https://github.com/deltachat/deltachat-android/issues/905 )
|
|
//
|
|
// nb: it is highly recommended to use the same settings in debug+release -
|
|
// otherwise problems might be noticed delayed only
|
|
minifyEnabled true
|
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
testProguardFiles 'test-proguard-rules.pro'
|
|
productFlavors.foss.signingConfig signingConfigs.releaseFdroid
|
|
productFlavors.gplay.signingConfig signingConfigs.releaseApk
|
|
}
|
|
}
|
|
|
|
if(!project.hasProperty("ABI_FILTER")) {
|
|
splits {
|
|
abi {
|
|
enable true
|
|
reset()
|
|
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
|
|
universalApk true
|
|
}
|
|
}
|
|
}
|
|
|
|
project.ext.versionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
|
|
|
|
android.applicationVariants.all { variant ->
|
|
variant.outputs.all { output ->
|
|
output.outputFileName = output.outputFileName
|
|
.replace("android", "ArcaneChat")
|
|
.replace("-release", "")
|
|
.replace(".apk", "-${variant.versionName}.apk")
|
|
if(project.hasProperty("ABI_FILTER")) {
|
|
output.versionCodeOverride =
|
|
variant.versionCode * 10 + project.ext.versionCodes.get(ABI_FILTER)
|
|
} else {
|
|
output.versionCodeOverride =
|
|
variant.versionCode * 10 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 4)
|
|
}
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
main {
|
|
jniLibs.srcDirs = ['libs']
|
|
}
|
|
}
|
|
|
|
androidResources {
|
|
generateLocaleConfig true
|
|
}
|
|
|
|
lint {
|
|
abortOnError false
|
|
}
|
|
buildFeatures {
|
|
renderScript true
|
|
aidl true
|
|
}
|
|
|
|
}
|
|
|
|
final def markwon_version = '4.6.2'
|
|
|
|
dependencies {
|
|
// ArcaneChat-only dependencies:
|
|
implementation "io.noties.markwon:core:$markwon_version"
|
|
implementation "io.noties.markwon:ext-strikethrough:$markwon_version"
|
|
implementation "io.noties.markwon:inline-parser:$markwon_version"
|
|
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
|
|
|
|
implementation 'androidx.concurrent:concurrent-futures:1.3.0'
|
|
implementation 'androidx.sharetarget:sharetarget:1.2.0'
|
|
implementation 'androidx.webkit:webkit:1.14.0'
|
|
implementation 'androidx.multidex:multidex:2.0.1'
|
|
implementation 'androidx.appcompat:appcompat:1.7.1'
|
|
implementation 'com.google.android.material:material:1.12.0'
|
|
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
|
|
implementation ('androidx.preference:preference:1.2.1') {
|
|
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel'
|
|
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel-ktx'
|
|
}
|
|
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
|
|
implementation 'androidx.exifinterface:exifinterface:1.4.1'
|
|
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
|
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.2'
|
|
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.2'
|
|
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
|
|
implementation 'androidx.work:work-runtime:2.9.1'
|
|
implementation 'androidx.emoji2:emoji2-emojipicker:1.5.0'
|
|
implementation 'com.google.guava:guava:31.1-android'
|
|
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // plays video and audio
|
|
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
|
|
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
|
|
implementation 'com.google.zxing:core:3.3.0' // fixed version to support SDK<24
|
|
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
|
|
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library
|
|
implementation 'com.github.Baseflow:PhotoView:2.3.0' // does the zooming on photos / media
|
|
implementation 'com.caverock:androidsvg-aar:1.4' // SVG support.
|
|
implementation 'com.github.bumptech.glide:glide:4.16.0'
|
|
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
|
|
annotationProcessor 'androidx.annotation:annotation:1.9.1'
|
|
implementation 'com.makeramen:roundedimageview:2.3.0' // crops the avatars to circles
|
|
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
|
|
// the one-letter circle for the contacts (when there is not avatar) and a white background.
|
|
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
|
|
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') { // for the zooming on photos / media
|
|
exclude group: 'com.android.support', module: 'support-annotations'
|
|
}
|
|
|
|
// Replacement for ContentResolver
|
|
// that protects against the Surreptitious Sharing attack.
|
|
// <https://github.com/cketti/SafeContentResolver>
|
|
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
|
|
|
|
gplayImplementation('com.google.firebase:firebase-messaging:24.1.2') { // for PUSH notifications, don't upgrade: v25.0.0 requires minSdk>=23
|
|
exclude group: 'com.google.firebase', module: 'firebase-core'
|
|
exclude group: 'com.google.firebase', module: 'firebase-analytics'
|
|
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
|
|
}
|
|
|
|
testImplementation 'junit:junit:4.13.2'
|
|
testImplementation 'org.assertj:assertj-core:3.27.3'
|
|
testImplementation 'org.mockito:mockito-core:5.18.0'
|
|
testImplementation 'org.powermock:powermock-api-mockito:1.7.4'
|
|
testImplementation 'org.powermock:powermock-module-junit4:2.0.9'
|
|
testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.9'
|
|
testImplementation 'org.powermock:powermock-classloading-xstream:2.0.9'
|
|
|
|
androidTestImplementation 'androidx.test:runner:1.7.0'
|
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
|
|
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.7.0'
|
|
androidTestImplementation 'androidx.test:rules:1.7.0'
|
|
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
|
|
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
|
|
|
|
androidTestImplementation ('org.assertj:assertj-core:3.27.3') {
|
|
exclude group: 'org.hamcrest', module: 'hamcrest-core'
|
|
}
|
|
}
|
|
|
|
String buildConfigProperty(String name) {
|
|
return "\"${propertyOrEmpty(name)}\""
|
|
}
|
|
|
|
String propertyOrEmpty(String name) {
|
|
Object p = findProperty(name)
|
|
if (p == null) return environmentVariable(name)
|
|
return (String) p
|
|
}
|
|
|
|
static String environmentVariable(String name) {
|
|
String env = System.getenv(name)
|
|
if (env == null) return ""
|
|
return env
|
|
}
|
|
|
|
String getNdkArch() {
|
|
Properties properties = new Properties()
|
|
def file = project.rootProject.file('ndkArch')
|
|
if (!file.exists()) return "\"\""
|
|
properties.load(file.newDataInputStream())
|
|
def arch = properties.getProperty('NDK_ARCH')
|
|
if (arch == null) return "\"\""
|
|
return "\"$arch\""
|
|
}
|