Sunflower 카피 시작

disun.sj·2023년 5월 29일
0

Sunflower Copy

목록 보기
1/4

카피 프로젝트 링크

Sunflower 프로젝트 카피시작(Hilt, Compose 등등 기술 실전에서 연습하기 위함)

  • 똑같이 따라가는것 x, 이해를 하기 위해 직접 해보며 다른부분은 체크하며 넘어가자
  • Empty Activity(compose)를 기반으로 시작한다
  • 뭐부터 할지 고민하다 gradle이 모양이 다른걸 발견
  • 찾아보니 기존 사용방식은 Groovy 기반, Sunflower는 kotlin 기반이라 한다
  • Groovy 기반은 .gradle, kotlin 기반은 .gradle.kts
  • Gradle 5.0 부터 지원한다고 한다
  • 이녀석 부터 시작해보자(kotlin-dsl 추후 별도 정리!!!)

Gradle Groovy DSL 과 비교한 Gradle Kotlin DSL 의 장점(참고)

  • 코드의 자동완성
  • 빠른 문서보기가 가능
  • 리팩토링 기능
  • 오류코드 강조 표시

단점(참고)

  • 빌드 캐시가 Invalidation 되거나 클린 빌드시에 Groovy DSL보다 느리다
  • Java8이상에서 동작
  • 새로운 라이브러리 버전 Inspection 기능 미지원
  1. 좌측 프로젝트 패널을 Project Files로 변경
  2. 안드로이드 스튜디오에서 File > New > Directory로 프로젝트 root에 buildSrc 폴더를 생성
  3. 해당 폴더를 우클릭 후, New > File로 build.gradle.kts 파일을 생성
  4. 코드입력
import org.gradle.kotlin.dsl.`kotlin-dsl`

plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}
  1. 폴더 안에 새로운 directory를 생성하는데, 디렉토리명은 src/main/java 로 설정
  2. 하위에 Dependencies.kt를 생성 후 기존 gradle에 맞춰서 만들어주자
object Apps {
    const val applicationId = "com.practice.sunflower"
    const val compileSdk = 33
    const val minSdk = 24
    const val targetSdk = 33
    const val versionCode = 1
    const val versionName = "1.0.0"

    const val kotlinCompilerExtensionVersion = "1.3.2"

    const val jvmTarget = "1.8"
    const val gradle = "3.5.2"
}

object Versions {
    const val androidxCore = "1.8.0"
    const val kotlin_bom = "1.8.0"
    const val lifecycle = "2.3.1"
    const val androidx_compose_activity = "1.5.1"
    const val compose_bom = "2022.10.00"

    const val hilt = "2.44"
    const val hilt_navigation_compose = "1.0.0"

    const val junit = "4.13.2"

    const val test_junit = "1.1.5"
    const val espresso = "3.5.1"
    const val compose_junit = "1.0.0-alpha12"
}

object Libs {
    const val androidx_core = "androidx.core:core-ktx:${Versions.androidxCore}"
    const val kotlin_bom = "org.jetbrains.kotlin:kotlin-bom:${Versions.kotlin_bom}"
    const val lifecycle_runtime = "androidx.lifecycle:lifecycle-runtime-ktx:${Versions.lifecycle}"

    //hilt
    const val hilt_android = "com.google.dagger:hilt-android:${Versions.hilt}"
    const val hilt_compiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}"
    const val hilt_plugin = "com.google.dagger:hilt-android-gradle-plugin:${Versions.hilt}"

    //compose
    const val compose_bom = "androidx.compose:compose-bom:${Versions.compose_bom}"
    const val compose_activity = "androidx.activity:activity-compose:${Versions.androidx_compose_activity}"
    const val compose_ui = "androidx.compose.ui:ui"
    const val compose_ui_graphics = "androidx.compose.ui:ui-graphics"
    const val compose_ui_tooling_preview = "androidx.compose.ui:ui-tooling-preview"
    const val compose_material3 = "androidx.compose.material3:material3"

    const val hilt_navigation_compose = "androidx.hilt:hilt-navigation-compose:${Versions.hilt_navigation_compose}"
}

object TestLibs {
    const val junit = "junit:junit:${Versions.junit}"
}

object DebugLibs {
    const val compose_tooling = "androidx.compose.ui:ui-tooling"
    const val compose_test_manifest = "androidx.compose.ui:ui-test-manifest"
}

object AndroidTestLibs{
    const val test_junit = "androidx.test.ext:junit:${Versions.test_junit}"
    const val espresso = "androidx.test.espresso:espresso-core:${Versions.espresso}"
    const val compose_junit = "androidx.compose.ui:ui-test-junit4:${Versions.compose_junit}"
}
  1. 각 모듈들, 프로젝트의 build.gradle 파일의 이름을 build.gradle.kts로 변경 후 kotlin 문법에 맞게 수정해주자

Project build.gradle

plugins {
    id("com.android.application") version "8.0.2" apply false
    id("com.android.library") version "8.0.2" apply false
    id("org.jetbrains.kotlin.android") version "1.7.20" apply false
    id("com.google.dagger.hilt.android") version "2.44.2" apply false
}

App build.gradle

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("kotlin-kapt")
    id("com.google.dagger.hilt.android")
}

android {
    namespace = Apps.applicationId
    compileSdk = Apps.compileSdk

    defaultConfig {
        applicationId = Apps.applicationId
        minSdk = Apps.minSdk
        targetSdk = Apps.targetSdk
        versionCode = Apps.versionCode
        versionName = Apps.versionName

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }

    buildTypes {
        getByName("release"){
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        compose = true
        dataBinding = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = Apps.kotlinCompilerExtensionVersion
    }

    packagingOptions.resources.excludes.add("/META-INF/{AL2.0,LGPL2.1}")
//    packagingOptions {
//        resources {
//            excludes += "/META-INF/{AL2.0,LGPL2.1}"
//        }
//    }
}

dependencies {
    implementation(Libs.androidx_core)
    implementation(platform(Libs.kotlin_bom))
    implementation(Libs.lifecycle_runtime)
    implementation(Libs.compose_activity)
    implementation(platform(Libs.compose_bom))
    implementation(Libs.compose_ui)
    implementation(Libs.compose_ui_graphics)
    implementation(Libs.compose_ui_tooling_preview)
    implementation(Libs.compose_material3)

    testImplementation(TestLibs.junit)

    androidTestImplementation(AndroidTestLibs.test_junit)
    androidTestImplementation(AndroidTestLibs.espresso)
    androidTestImplementation(AndroidTestLibs.compose_junit)

    debugImplementation(DebugLibs.compose_tooling)
    debugImplementation(DebugLibs.compose_test_manifest)

    implementation(Libs.hilt_android)
    kapt(Libs.hilt_compiler)
    implementation(Libs.hilt_navigation_compose)
}

settings.gradle

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "SunFlower"
include(":app")
  1. 여기까지 되었다면 sync 해주자
  2. build 진행

여기까지는 문제 없이 진행

  • 여기까지 진행후 Sunflower 에서는 .toml을 사용중인걸 발견 참고
  • kotlin dsl 정리시 같이 추가정리 예정

이 방법으로 수정시작

  1. 좌측 프로젝트 패널을 Project Files로 변경
  2. gradle directory 우클릭 -> New -> File
  3. libs.versions.toml 생성(Version Catalog 라고 한다)
  4. 기존 Dependencies에 작성한 내용을 가지고와 수정하자
[versions]
#apps
gradle = "3.5.2"
#libs
androidxCore = "1.8.0"
kotlin_bom = "1.8.0"
lifecycle = "2.3.1"
androidx_compose_activity = "1.5.1"
compose_bom = "2022.10.00"
material = "1.9.0"
hilt = "2.44"
hilt_navigation_compose = "1.0.0"
junit = "4.13.2"
test_junit = "1.1.5"
espresso = "3.5.1"
compose_junit = "1.0.0-alpha12"
#plugin
application = "8.0.2"
library = "8.0.2"
jetbrain_android = "1.7.20"

[plugins]
application = {id = "com.android.application" , version.ref = "application"}
library = {id= "com.android.library", version.ref = "library"}
jetbrain_android = {id="org.jetbrains.kotlin.android", version.ref = "jetbrain_android" }
hilt = {id= "com.google.dagger.hilt.android", version.ref = "hilt"}


[libraries]
androidx_core = {module = "androidx.core:core-ktx", version.ref = "androidxCore"}
kotlin_bom = {group = "org.jetbrains.kotlin", name = "kotlin-bom", version.ref = "kotlin_bom" }
lifecycle_runtime = {module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle"}
material = {module = "com.google.android.material:material", version.ref = "material"}
#hilt
hilt_android = {module = "com.google.dagger:hilt-android", version.ref = "hilt"}
hilt_compiler = {module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt"}
hilt_plugin = {module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt"}
#compose
compose_bom = {group = "androidx.compose", name = "compose-bom", version.ref = "compose_bom"}
compose_activity = {module = "androidx.activity:activity-compose", version.ref = "androidx_compose_activity"}
compose_ui = {module = "androidx.compose.ui:ui"}
compose_ui_graphics = {module = "androidx.compose.ui:ui-graphics" }
compose_ui_tooling_preview = {module = "androidx.compose.ui:ui-tooling-preview" }
compose_material3 = {module = "androidx.compose.material3:material3" }
hilt_navigation_compose = {module = "androidx.hilt:hilt-navigation-compose", version.ref = "hilt_navigation_compose" }
#TestLibs
junit = {module = "junit:junit", version.ref = "junit"}
#DebugLibs
compose_tooling = {module = "androidx.compose.ui:ui-tooling" }
compose_test_manifest = {module = "androidx.compose.ui:ui-test-manifest" }
#AndroidTestLibs
test_junit = {module = "androidx.test.ext:junit", version.ref = "test_junit" }
espresso = {module = "androidx.test.espresso:espresso-core", version.ref = "espresso"}
compose_junit = {module = "androidx.compose.ui:ui-test-junit4", version.ref = "compose_junit"}
[bundles]
androidx-compose = ["compose_ui","compose_ui_graphics","compose_ui_tooling_preview","compose_material3"]
androidx-compose-debug-test = ["compose_tooling", "compose_test_manifest"]
  • library의 module 대신 group를 사용하는 경우도 존재하는데 아직 어떻게 사용하는지 정확한 이해는 없지만 Bom의 경우 group을 사용해야 한다 하여 일단 추가해놨다
  1. 각 모듈들, 프로젝트의 build.gradle 을 수정하자
  • 이때 libs.versions.toml 에서 _로 이름이 된 부분은 gradle에선 .으로 작성한다

Project build.gradle

@file:Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.application) apply false
    alias(libs.plugins.library) apply false
    alias(libs.plugins.jetbrain.android) apply false
    alias(libs.plugins.hilt) apply false
}

App build.gradle

@file:Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.application)
    alias(libs.plugins.jetbrain.android)
    id("kotlin-kapt")
    alias(libs.plugins.hilt)
}

android {
    namespace = "com.practice.sunflower"
    compileSdk = 33

    defaultConfig {
        applicationId = "com.practice.sunflower"
        minSdk = 24
        targetSdk = 33
        versionCode = 1
        versionName = "1.0.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }

    buildTypes {
        getByName("release"){
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        compose = true
        dataBinding = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.3.2"
    }

    packagingOptions.resources.excludes.add("/META-INF/{AL2.0,LGPL2.1}")
//    packagingOptions {
//        resources {
//            excludes += "/META-INF/{AL2.0,LGPL2.1}"
//        }
//    }
}

dependencies {
    implementation(libs.androidx.core)
    implementation(platform(libs.kotlin.bom))
    implementation(libs.lifecycle.runtime)
    implementation(libs.compose.activity)
    implementation(platform(libs.compose.bom))
    implementation(libs.bundles.androidx.compose)
//    implementation(libs.compose.ui)
//    implementation(libs.compose.ui.graphics)
//    implementation(libs.compose.ui.tooling.preview)
//    implementation(libs.compose.material3)
    implementation(libs.material)

    testImplementation(libs.junit)

    androidTestImplementation(libs.test.junit)
    androidTestImplementation(libs.espresso)
    androidTestImplementation(libs.compose.junit)

    debugImplementation(libs.bundles.androidx.compose.debug.test)
//    debugImplementation(libs.compose.tooling)
//    debugImplementation(libs.compose.test.manifest)

    implementation(libs.hilt.android)
    kapt(libs.hilt.compiler)
    implementation(libs.hilt.navigation.compose)
}
  • libs.versions.toml에서 bundle로 묶어놓은 부분은 implementation(libs.bundles.androidx.compose)와 같이 사용할 수 있다

이 프로젝트에는 "androidx.compose:compose-bom" 와 "org.jetbrains.kotlin:kotlin-bom" 이 존재하는데, 이녀석들은 아직 정확한 이해가 안되어 있어서 추후 정리할 예정이다
사전 참고 자료

이후 추가 코드 작성에 따라서 변화 예정

0개의 댓글