import java.text.SimpleDateFormat import java.util.Date plugins { id ("com.android.application") id ("kotlin-android") id ("io.realm.kotlin") id ("kotlin-kapt") } android { namespace = "bums.lunatic.launcher" compileSdk = 35 defaultConfig { applicationId = "bums.lunatic.launcher" minSdk = 26 versionCode = 38 versionName = "2.8.2" multiDexEnabled = true ndk { abiFilters += listOf("arm64-v8a") // 필요한 ABI만 빌드하도록 필터링 } externalNativeBuild { cmake { cppFlags += "-std=c++17" arguments += "-DANDROID_STL=c++_shared" } } // 이 부분을 추가하여 prefab 기능을 활성화합니다. buildFeatures { prefab = true } } buildTypes { getByName("debug") { isMinifyEnabled = false isShrinkResources = false isDebuggable = true // applicationIdSuffix = ".debug" // versionNameSuffix = "-debug" buildConfigField("Long","BuildDateTime", "${getDateTime()}L") resValue ("string", "app_name", "Bums Launcher Debug") } getByName("release") { isMinifyEnabled = true isShrinkResources = true buildConfigField("Long","BuildDateTime", "${getDateTime()}L") proguardFiles (getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") resValue ("string", "app_name", "Bums Launcher") } } externalNativeBuild { cmake { path = file("src/main/cpp/CMakeLists.txt") version = "3.22.1" } } signingConfigs { getByName("debug") { storeFile = file("./bs_debug.keystore") storePassword = "android" keyAlias = "androiddebugkey" keyPassword = "android" } } android { sourceSets["main"].jniLibs.srcDirs("src/main/jniLibs") } applicationVariants.all { if (buildType.name == "release") { outputs.all { val output = this as? com.android.build.gradle.internal.api.BaseVariantOutputImpl if (output?.outputFileName?.endsWith(".apk") == true) { output.outputFileName = "${defaultConfig.applicationId}_v${defaultConfig.versionName}.apk" } } } } buildFeatures { viewBinding = true dataBinding = true buildConfig = true resValues = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } packagingOptions.resources.excludes.add("META-INF/*") packagingOptions.resources.excludes.add("mozilla/*") packagingOptions.resources.excludes.add("META-INF/*/*") packagingOptions { jniLibs { useLegacyPackaging = true } } kotlinOptions { jvmTarget = "1.8" } ndkVersion = "29.0.13846066 rc3" // buildToolsVersion = "35.0.1" packaging { doNotStrip("**/libaria2c.zip.so") doNotStrip("**/libffmpeg.zip.so") doNotStrip("**/libpython.zip.so") jniLibs { pickFirsts.add("lib/**/libc++_shared.so") pickFirsts.add("lib/**/libavcodec.so") pickFirsts.add("lib/**/libavfilter.so") pickFirsts.add("lib/**/libavformat.so") pickFirsts.add("lib/**/libavutil.so") pickFirsts.add("lib/**/libswresample.so") pickFirsts.add("lib/**/libswscale.so") } } } dependencies { implementation(fileTree(mapOf( "dir" to "libs", "include" to listOf("*.aar", "*.jar"), ))) implementation(project(":gdrive")) implementation("com.google.android.gms:play-services-wearable:19.0.0") val kotlinVersion: String? by extra val realmVersion = "2.0.0" implementation ("androidx.appcompat:appcompat:1.7.1") implementation ("androidx.biometric:biometric-ktx:1.2.0-alpha05") implementation ("androidx.browser:browser:1.8.0") implementation ("androidx.core:core-ktx:1.15.0") implementation ("androidx.core:core-splashscreen:1.0.1") implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7") implementation ("com.google.android.material:material:1.12.0") implementation ("com.ibm.icu:icu4j:77.1") implementation (kotlin("stdlib", version = "2.0.10")) implementation ("com.github.cachapa:ExpandableLayout:2.9.2") implementation ("androidx.work:work-runtime:2.10.0") implementation ("com.google.code.gson:gson:2.13.1") implementation ("io.realm.kotlin:library-base:${realmVersion}") implementation ("org.jsoup:jsoup:1.21.2") implementation ("org.apache.commons:commons-text:1.14.0") implementation("com.squareup.okhttp:okhttp:2.7.5") implementation("com.google.android.gms:play-services-location:21.3.0") implementation("com.google.android.gms:play-services-tasks:18.3.2") implementation("com.squareup.retrofit2:retrofit:3.0.0") implementation("com.squareup.retrofit2:converter-gson:3.0.0") implementation("com.squareup.retrofit2:converter-scalars:3.0.0") implementation("androidx.viewpager2:viewpager2:1.1.0") implementation("com.squareup.picasso:picasso:2.71828") implementation("com.github.delight-im:Android-AdvancedWebView:v3.2.1") // implementation(project(":library")) // implementation(project(":utils")) implementation( "com.github.bumptech.glide:glide:4.11.0") implementation ("com.github.bumptech.glide:okhttp3-integration:4.11.0") // implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407") // https://mvnrepository.com/artifact/org.mozilla.geckoview/geckoview implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407") implementation("com.vladsch.flexmark:flexmark-all:0.64.8") // implementation 'com.vladsch.flexmark:flexmark-all:0.64.8' // implementation("org.opencv:opencv-android:4.11.0") // build.gradle에 추가 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") // implementation ("com.github.aeonSolutions:FloatingActionButtonMenuDrag:1.1") implementation("io.github.junkfood02.youtubedl-android:library:0.17.4") implementation("io.github.junkfood02.youtubedl-android:ffmpeg:0.17.4") implementation("io.github.junkfood02.youtubedl-android:aria2c:0.17.4") implementation("io.coil-kt:coil:2.5.0") implementation("io.coil-kt:coil-gif:2.5.0") implementation ("com.squareup.okhttp3:logging-interceptor:4.11.0") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.3") // Fragment KTX: Fragment에서 by viewModels() 델리게이트를 사용하기 위해 필수 implementation("androidx.fragment:fragment-ktx:1.8.1") // Lifecycle KTX: viewLifecycleOwner.lifecycleScope 등을 사용하기 위해 필요 implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.3") // implementation ("com.arthenica:ffmpeg-kit-full:4.5.LTS") // implementation ("com.arthenica:ffmpeg-kit-full:6.0-2") // implementation(files("libs/ffmpeg-kit-full-6.0-2.LTS.aar")) // implementation("com.arthenica:ffmpeg-kit-full-gpl:5.1") implementation ("androidx.media:media:1.7.0") // implementation(project(":sdk")) // implementation ("me.everything:providers-android:1.0.1") // implementation ("me.everything:providers-core:1.0.1") // implementation ("androidx.window:window:1.0.0") // implementation("io.github.vaneproject:hanguleditor:1.0.0") // implementation ("androidx.concurrent:concurrent-listenablefuture-ktx:1.1.0") implementation ("com.google.guava:guava:33.2.1-jre") val camerax_version = "1.3.0" // 안정적인 최신 버전 사용 // CameraX 코어 라이브러리 implementation("androidx.camera:camera-core:$camerax_version") implementation("androidx.camera:camera-camera2:$camerax_version") // CameraX Lifecycle 라이브러리 (Fragment/Activity 생명주기 연결) implementation("androidx.camera:camera-lifecycle:$camerax_version") // CameraX View 라이브러리 (PreviewView 등 UI 구성 요소) implementation("androidx.camera:camera-view:$camerax_version") // (선택) CameraX 비디오 라이브러리 implementation("androidx.camera:camera-video:$camerax_version") // (선택) CameraX 확장 라이브러리 (보케, HDR 등) implementation("androidx.camera:camera-extensions:$camerax_version") implementation("com.google.mlkit:translate:17.0.3") // 버전 살짝 업그레이드 권장 implementation("com.google.mlkit:language-id:17.0.5") implementation("com.google.android.gms:play-services-base:18.5.0") implementation("com.google.mlkit:common:18.11.0") constraints { // ⚠️ 이 버전을 프로젝트 루트의 build.gradle.kts에 정의된 kotlinVersion 값과 정확히 일치시키세요. val targetKotlinVersion = "2.0.20" implementation("org.jetbrains.kotlin:kotlin-stdlib") { version { strictly(targetKotlinVersion) } // reason = "Align all Kotlin stdlib versions with the compiler plugin version" } implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") { version { strictly(targetKotlinVersion) } // reason = "Align all Kotlin stdlib versions with the compiler plugin version" } implementation("org.jetbrains.kotlin:kotlin-stdlib-common") { version { strictly(targetKotlinVersion) } // reason = "Align all Kotlin stdlib versions with the compiler plugin version" } } } fun getDateTime() = SimpleDateFormat("yyyyMMddHHmm").format(Date()).toLong()