import io.sentry.android.gradle.extensions.InstrumentationFeature import io.sentry.android.gradle.instrumentation.logcat.LogcatLevel apply plugin: "com.android.application" apply plugin: "kotlin-android" apply plugin: "io.sentry.android.gradle" //repositories { // maven { // url 'https://www.jitpack.io' // content { // includeModule 'com.github.UnifiedPush', 'android-connector' // } // } //} def verName = "10.14.5" def verCode = 1187 def officialVer = "10.14.5" def officialCode = 4945 def serviceAccountCredentialsFile = rootProject.file("service_account_credentials.json") def beta = verName.contains("preview") if (serviceAccountCredentialsFile.isFile()) { setupPlay(beta) play.serviceAccountCredentials = serviceAccountCredentialsFile } else if (System.getenv().containsKey("ANDROID_PUBLISHER_CREDENTIALS")) { setupPlay(beta) } void setupPlay(boolean beta) { apply plugin: "com.github.triplet.play" play { track = beta ? "beta" : "production" defaultToAppBundles = true } } configurations { compile.exclude module: "support-v4" } def keystorePwd = null def alias = null def pwd = null def sentry_token = System.getenv("SENTRY_AUTH_TOKEN") def sentry_upload = project.rootProject.file("sentry.properties").exists() def disableCMakeRelWithDebInfo = System.getenv("COMPILE_NATIVE") == null Properties properties def base64 = System.getenv("LOCAL_PROPERTIES") if (base64 != null && !base64.isBlank()) { properties = new Properties() properties.load(new ByteArrayInputStream(Base64.decoder.decode(base64))) } else if (project.rootProject.file("local.properties").exists()) { properties = new Properties() properties.load(project.rootProject.file("local.properties").newDataInputStream()) } if (properties != null) { keystorePwd = properties.getProperty("KEYSTORE_PASS") alias = properties.getProperty("ALIAS_NAME") pwd = properties.getProperty("ALIAS_PASS") sentry_token = properties.getProperty("SENTRY_AUTH_TOKEN", sentry_token) } keystorePwd = keystorePwd ?: System.getenv("KEYSTORE_PASS") alias = alias ?: System.getenv("ALIAS_NAME") pwd = pwd ?: System.getenv("ALIAS_PASS") def targetTask = "" if (!gradle.startParameter.taskNames.isEmpty()) { if (gradle.startParameter.taskNames.size == 1) { targetTask = gradle.startParameter.taskNames[0].toLowerCase() } } def nativeTarget = System.getenv("NATIVE_TARGET") if (nativeTarget == null) nativeTarget = "" android { compileSdkVersion 33 ndkVersion rootProject.ext.ndkVersion defaultConfig.applicationId = 'com.xtaolabs.pagergram' splits { abi { if (targetTask.contains("fdroid")) { enable false universalApk true } else { enable true reset() universalApk false if (!nativeTarget.isBlank()) { include nativeTarget } else { include 'arm64-v8a' } } } } defaultConfig { minSdkVersion 21 //noinspection ExpiredTargetSdkVersion,OldTargetApi targetSdkVersion 33 versionName verName versionCode verCode def appId = "11535358" def appHash = "33d372962fadb01df47e6ceed4e33cd6" //obtain your own keys at https://core.telegram.org/api/obtaining_api_id if (properties != null) { appId = properties.getProperty("TELEGRAM_APP_ID") ?: System.getenv("TELEGRAM_APP_ID") ?: appId appHash = properties.getProperty("TELEGRAM_APP_HASH") ?: System.getenv("TELEGRAM_APP_HASH") ?: appHash } buildConfigField "String", "BUILD_VERSION_STRING", "\"" + verName + "\"" buildConfigField "String", "OFFICIAL_VERSION", "\"" + officialVer + "\"" buildConfigField "int", "OFFICIAL_VERSION_CODE", officialCode + "" buildConfigField "int", "APP_ID", appId buildConfigField "String", "APP_HASH", "\"" + appHash + "\"" externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_static", "-DANDROID_PLATFORM=android-21" } } } bundle { language { enableSplit = false } } externalNativeBuild { cmake { path "jni/CMakeLists.txt" } } compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 coreLibraryDesugaringEnabled true } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } testOptions { unitTests.includeAndroidResources = true } signingConfigs { release { storeFile project.file("pagergram.jks") storePassword keystorePwd keyAlias alias keyPassword pwd } } buildTypes { debug { isDefault true debuggable true jniDebuggable true multiDexEnabled true zipAlignEnabled true signingConfig signingConfigs.release } release { debuggable false jniDebuggable false minifyEnabled true shrinkResources true multiDexEnabled true zipAlignEnabled true proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" matchingFallbacks = ["release", "debug"] signingConfig signingConfigs.release } } sourceSets { main { assets.srcDirs = ["src/main/assets"] } debug { java { srcDirs "src/main/java" } jniLibs { srcDir "src/main/libs" } } release { java { srcDirs "src/main/java" } jniLibs { srcDir "src/main/libs" } } } flavorDimensions "version" tasks.configureEach { task -> if (((task.name.endsWith("Ndk") || task.name.startsWith("generateJsonModel") || task.name.startsWith("externalNativeBuild"))) && !task.name.contains("Debug")) { task.enabled = false } if (task.name.contains("uploadCrashlyticsMappingFile")) { enabled = false } if (disableCMakeRelWithDebInfo && task.name.contains("CMakeRelWithDebInfo")) { enabled = false } } applicationVariants.configureEach { variant -> variant.outputs.configureEach { output -> String gramName = "PagerGram" String first = String.format("%s-v%s(%s)", gramName, versionName, versionCode) String name = outputFileName.replace("TMessagesProj", first) name = name.replace("-release", "") outputFileName = name } } } def fcmVersion = "23.4.1" def crashlyticsVersion = "18.6.2" def playCoreVersion = "1.10.3" dependencies { implementation "androidx.browser:browser:1.5.0" implementation 'androidx.fragment:fragment:1.2.0' implementation "androidx.core:core-ktx:1.9.0" implementation "androidx.palette:palette-ktx:1.0.0" implementation "androidx.viewpager:viewpager:1.0.0" implementation "androidx.exifinterface:exifinterface:1.3.7" implementation "androidx.interpolator:interpolator:1.0.0" implementation 'androidx.biometric:biometric:1.1.0' implementation "androidx.dynamicanimation:dynamicanimation:1.0.0" implementation "androidx.multidex:multidex:2.0.1" implementation "androidx.sharetarget:sharetarget:1.2.0" // just follow official compileOnly 'org.checkerframework:checker-qual:2.5.2' compileOnly 'org.checkerframework:checker-compat-qual:2.5.0' // don"t change this :) //noinspection GradleDependency implementation "com.googlecode.mp4parser:isoparser:1.0.6" implementation "com.google.code.gson:gson:2.10" implementation "org.osmdroid:osmdroid-android:6.1.10" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.23" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0" implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.10" implementation 'com.neovisionaries:nv-websocket-client:2.14' implementation 'dnsjava:dnsjava:3.4.1' implementation "org.dizitart:nitrite:3.4.3" implementation "cn.hutool:hutool-core:5.7.13" implementation "cn.hutool:hutool-crypto:5.7.13" implementation 'cn.hutool:hutool-http:5.7.5' implementation "com.jakewharton:process-phoenix:2.1.2" implementation 'com.google.guava:guava:31.1-android' implementation 'com.airbnb.android:lottie:6.4.0' implementation 'com.google.android.play:integrity:1.3.0' implementation 'com.google.android.gms:play-services-mlkit-subject-segmentation:16.0.0-beta1' implementation 'com.google.android.gms:play-services-mlkit-image-labeling:16.0.8' implementation project(":openpgp-api") compileOnly fileTree("libs") compileOnly "com.google.firebase:firebase-messaging:$fcmVersion" compileOnly "com.google.firebase:firebase-crashlytics:$crashlyticsVersion" compileOnly "com.google.android.play:core:$playCoreVersion" implementation 'com.google.android.gms:play-services-vision:20.1.3' implementation 'com.google.android.gms:play-services-maps:18.2.0' implementation 'com.google.android.gms:play-services-location:21.2.0' implementation "com.google.firebase:firebase-messaging:$fcmVersion" implementation "com.google.firebase:firebase-crashlytics:$crashlyticsVersion" // implementation "com.google.android.play:core:$playCoreVersion" implementation 'com.android.billingclient:billing:5.1.0' testImplementation "junit:junit:4.13.2" testImplementation "androidx.test:core:1.5.0" testImplementation "org.robolectric:robolectric:4.5.1" coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.2.0" } dependencies { // add for undo and redo implementation 'org.lsposed.hiddenapibypass:hiddenapibypass:4.3' // add splash screen implementation("androidx.core:core-splashscreen:1.0.1") // add for music tag flac... implementation 'org:jaudiotagger:2.0.3' // add for auto translate implementation 'com.google.mlkit:language-id:17.0.5' // add for emoji implementation 'com.jaredrummler:truetypeparser-light:1.0.0' // add for up // implementation 'com.github.UnifiedPush:android-connector:2.3.1' } apply plugin: "com.google.gms.google-services" apply plugin: "com.google.firebase.crashlytics" android { packagingOptions { jniLibs { excludes += ['/fabric/**', '/META-INF/native-image/**'] useLegacyPackaging true } resources { excludes += ['/fabric/**', '/META-INF/*.version', '/META-INF/*.kotlin_module', '/META-INF/native-image/**', '/builddef.lst', '/*.txt', '/DebugProbesKt.bin', '/okhttp3/internal/publicsuffix/NOTICE'] } def lib = "libtmessages.*.so" pickFirst "lib/arm64-v8a/$lib" } namespace "org.telegram.messenger" lint { disable 'MissingTranslation', 'ExtraTranslation', 'BlockedPrivateApi' } buildFeatures { buildConfig true } tasks.configureEach { task -> if (task.name.startsWith("uploadCrashlyticsMappingFile")) { task.enabled = false } else if (task.name.contains("Crashlytics") && task.name.contains("NoGcm")) { task.enabled = false } else if (task.name.endsWith("GoogleServices") && task.name.contains("NoGcm")) { task.enabled = false } } } sentry { // Disables or enables debug log output, e.g. for for sentry-cli. // Default is disabled. debug = false // The slug of the Sentry organization to use for uploading proguard mappings/source contexts. org = "pagermaid" // The slug of the Sentry project to use for uploading proguard mappings/source contexts. projectName = "nagram" // The authentication token to use for uploading proguard mappings/source contexts. // WARNING: Do not expose this token in your build.gradle files, but rather set an environment // variable and read it into this property. authToken = sentry_token // The url of your Sentry instance. If you're using SAAS (not self hosting) you do not have to // set this. If you are self hosting you can set your URL here url = null // Disables or enables the handling of Proguard mapping for Sentry. // If enabled the plugin will generate a UUID and will take care of // uploading the mapping to Sentry. If disabled, all the logic // related to proguard mapping will be excluded. // Default is enabled. includeProguardMapping = sentry_upload // Whether the plugin should attempt to auto-upload the mapping file to Sentry or not. // If disabled the plugin will run a dry-run and just generate a UUID. // The mapping file has to be uploaded manually via sentry-cli in this case. // Default is enabled. autoUploadProguardMapping = sentry_upload // Experimental flag to turn on support for GuardSquare's tools integration (Dexguard and External Proguard). // If enabled, the plugin will try to consume and upload the mapping file produced by Dexguard and External Proguard. // Default is disabled. dexguardEnabled = false // Disables or enables the automatic configuration of Native Symbols // for Sentry. This executes sentry-cli automatically so // you don't need to do it manually. // Default is disabled. uploadNativeSymbols = sentry_upload // Whether the plugin should attempt to auto-upload the native debug symbols to Sentry or not. // If disabled the plugin will run a dry-run. // Default is enabled. autoUploadNativeSymbols = sentry_upload // Does or doesn't include the source code of native code for Sentry. // This executes sentry-cli with the --include-sources param. automatically so // you don't need to do it manually. // This option has an effect only when [uploadNativeSymbols] is enabled. // Default is disabled. includeNativeSources = false // Generates a JVM (Java, Kotlin, etc.) source bundle and uploads your source code to Sentry. // This enables source context, allowing you to see your source // code as part of your stack traces in Sentry. includeSourceContext = sentry_upload // Configure additional directories to be included in the source bundle which is used for // source context. The directories should be specified relative to the Gradle module/project's // root. For example, if you have a custom source set alongside 'main', the parameter would be // 'src/custom/java'. additionalSourceDirsForSourceContext = [] // Enable or disable the tracing instrumentation. // Does auto instrumentation for specified features through bytecode manipulation. // Default is enabled. tracingInstrumentation { enabled = true // Specifies a set of instrumentation features that are eligible for bytecode manipulation. // Defaults to all available values of InstrumentationFeature enum class. features = [InstrumentationFeature.DATABASE, InstrumentationFeature.FILE_IO, InstrumentationFeature.OKHTTP, InstrumentationFeature.COMPOSE] // Enable or disable logcat instrumentation through bytecode manipulation. // Default is enabled. logcat { enabled = true // Specifies a minimum log level for the logcat breadcrumb logging. // Defaults to LogcatLevel.WARNING. minLevel = LogcatLevel.WARNING } // The set of glob patterns to exclude from instrumentation. Classes matching any of these // patterns in the project's sources and dependencies JARs won't be instrumented by the Sentry // Gradle plugin. // // Don't include the file extension. Filtering is done on compiled classes and // the .class suffix isn't included in the pattern matching. // // Example usage: // ``` // excludes = ['com/example/donotinstrument/**', '**/*Test'] // ``` // // Only supported when using Android Gradle plugin (AGP) version 7.4.0 and above. excludes = [] } // Enable auto-installation of Sentry components (sentry-android SDK and okhttp, timber and fragment integrations). // Default is enabled. // Only available v3.1.0 and above. autoInstallation { enabled = true // Specifies a version of the sentry-android SDK and fragment, timber and okhttp integrations. // // This is also useful, when you have the sentry-android SDK already included into a transitive dependency/module and want to // align integration versions with it (if it's a direct dependency, the version will be inferred). // // NOTE: if you have a higher version of the sentry-android SDK or integrations on the classpath, this setting will have no effect // as Gradle will resolve it to the latest version. // // Defaults to the latest published Sentry version. sentryVersion = '7.8.0' } // Disables or enables dependencies metadata reporting for Sentry. // If enabled, the plugin will collect external dependencies and // upload them to Sentry as part of events. If disabled, all the logic // related to the dependencies metadata report will be excluded. // // Default is enabled. includeDependenciesReport = true // Whether the plugin should send telemetry data to Sentry. // If disabled the plugin won't send telemetry data. // This is auto disabled if running against a self hosted instance of Sentry. // Default is enabled. telemetry = true }