import java.util.Properties plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } // تنظیماتِ حساس (keystore و کلیدِ RSAِ بازار) در ریپو نیستند. از فایلی بیرون از ریپو خوانده می‌شوند: // $TADRISINO_ANDROID_CONFIG یا ~/.tadrisino/android.properties // کلیدها: storeFile, storePassword, keyAlias, keyPassword, bazaarRsaKey. شرحِ کامل: README.md. val configFile = File(System.getenv("TADRISINO_ANDROID_CONFIG") ?: "${System.getProperty("user.home")}/.tadrisino/android.properties") val secrets = Properties().apply { if (configFile.exists()) configFile.inputStream().use { load(it) } } // فقط وقتی build از نوعِ release است الزامی است؛ debug بدونِ آن هم ساخته می‌شود. val wantsRelease = gradle.startParameter.taskNames.any { it.contains("release", ignoreCase = true) } fun secret(name: String): String { val v = secrets.getProperty(name)?.trim().orEmpty() if (wantsRelease && v.isEmpty()) { throw GradleException("build نوعِ release «$name» را لازم دارد. در ${configFile.path} نیست یا خالی است (README.md ← «تنظیماتِ بیرون از ریپو»).") } return v } android { // ⚠️ اسمِ پکیج باید همانی باشد که در پیشخانِ بازار ثبت است. com.tadrisino.app را بازار // برای حسابِ شرکت «Product is not found» جواب داد (یعنی هست)، ولی سنیور تأیید نکرده // که همان اپِ ریاضی است (CLAUDE.mdِ بک‌اند، ۲۰۲۶-۰۹-۳۰). namespace = "com.tadrisino.app" compileSdk = 34 defaultConfig { applicationId = "com.tadrisino.app" minSdk = 23 targetSdk = 34 versionCode = 1 versionName = "1.0.0" // آدرسِ همان فرانتِ وب. دامنه عوض شود، فقط همین خط. buildConfigField("String", "WEB_URL", "\"https://math.tadrisino2.ir/\"") // کلیدِ RSAِ عمومیِ اپ از پیشخانِ بازار (بخشِ «پرداخت درون‌برنامه‌ای»). کلیدِ عمومی // است و در اپ می‌نشیند؛ رمز نیست. تا پر نشود، اپ خرید را شروع نمی‌کند. // از فایلِ بیرون از ریپو؛ برای build نوعِ release خالی بودنش خطا می‌دهد (نه اپِ بی‌خرید). buildConfigField("String", "BAZAAR_RSA_KEY", "\"${secret("bazaarRsaKey")}\"") } signingConfigs { create("release") { // release بدونِ keystore ساخته نمی‌شود؛ هرگز بی‌صدا با کلیدِ debug امضا نمی‌شود. if (wantsRelease) { storeFile = file(secret("storeFile")) storePassword = secret("storePassword") keyAlias = secret("keyAlias") keyPassword = secret("keyPassword") } } } buildFeatures { buildConfig = true } buildTypes { release { isMinifyEnabled = false signingConfig = signingConfigs.getByName("release") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } } dependencies { implementation("androidx.appcompat:appcompat:1.7.0") implementation("androidx.activity:activity-ktx:1.9.2") implementation("com.github.cafebazaar.Poolakey:poolakey:2.2.0") }