توسعه دهنده نِیتیوْ(Native) موبایل ( اندروید/آی او اس(کنارگذاشته شده)) Moeindeveloper.ir
گریدل پروژتو تمیز کن
چند وقتیه که کثیف بودن گریدلم خیلی رو اعصاب بوده و گریدل اکثر پروژه هام در بهترین حالت ممکن این شکلی بود:
و حالا با استفاده از Kotlin DSL میشه یکم مرتب ترش کرد:
نکته: دو اسکریپت بالا واسه دو پروژه مختلف هستن و ربطی به هم ندارن! اما پروسه تغییر به کاتلین DSL رو این پایین مینویسم.
برای اطلاعات بیشتر ارائه سنا عبادی رو در لاگ کت ببینید:
مرحله اول، ساخت پوشه buildSrc:
در root پروژه خودتون، پوشه buildSource رو به صورت زیر و با این ترتیب بنویسید:
بعد ساخت پوشه ابتدا پوشه سورس رو به ترتیب:
src -> main -> java
ایجاد کنید و فایل Dependencies.kt رو داخلش بسازید. بعد از این مرحله، گریدل اسکریپت خودتون رو داخل پوشه buildSrc ایجاد کنید:
build.gradle.kts:
import org.gradle.kotlin.dsl.`kotlin-dsl`
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
حالا پروژه رو sync کنید و منتظر بمانید!
بعد از sync شدن پروژه، دو پوشه gradle و build به پوشه buildSrc اضافه میشه که اگه از ورژن کنترل(git) استفاده میکنید، بهتره که اونارو به gitignore اضافه کنید. به صورت دستی فایل گیت ایگنور رو اضافه کنید و به صورت زیر عمل کنید:
.gradle
/build
حالا نوبت اینه که پروژه اصلیمون رو به کاتلین DSL منتقل کنیم!
مرحله دوم، تغییر Settings به kts:
settings.gradle:
include ':app'
rootProject.name = "Stationery"
settings.gradle.kts:
include(":app")
rootProject.name = "Stationery"
پروژه رو Sync کنید.
مرحله سوم، تغییر فایل های build:
ابتدا فایل Dependencies رو به اینصورت بنویسید:
object Dependencies {
object Versions {
}
object DefaultConfig {
}
object Plugins {
}
object Libraries {
object Test {
}
}
object ClassPaths {
}
}
آبجکت Versions برای نگه داری نسخه ها، آبجکت DefaultConfig برای نگه داری کانفیگ گریدل app، آبجکت Plugins برای نگه داری پلاگین ها، آبجکت Libraries برای نگه داری کتابخونه ها و آبجکت Test برای نگه داری کتابخونه های تست، آبجکت ClassPaths برای نگه داری ClassPath های ما ?
اول ClassPath ها و ورژنای اونارو اضافه می کنیم:
object Versions {
const val gradle = "4.1.0"
const val kotlin = "1.4.10"
}
object ClassPaths {
const val gradle = "com.android.tools.build:gradle:${Versions.gradle}"
const val kotlin = "gradle-plugin"
}
بیلد گردیل ماژول پروژه رو ویرایش میکنیم:
build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.3.72"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle.kts:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
dependencies {
classpath(Dependencies.ClassPaths.gradle)
classpath(kotlin(Dependencies.ClassPaths.kotlin, version = Dependencies.Versions.kotlin))
classpath(Dependencies.ClassPaths.hilt)
classpath(Dependencies.ClassPaths.safeArgs)
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
tasks.register("clean",Delete::class){
delete(rootProject.buildDir)
}
حالا میرسیم به تغییر گریدل ماژول اپ، اول اطلاعاتی که لازم داریم رو داخل Dependencies که ساختیم اضافه میکنیم:
object Dependencies {
object Versions {
const val gradle = "4.1.0"
const val kotlin = "1.4.10"
const val coreKTX = "1.3.1"
const val appCompat = "1.2.0"
const val constraintLayout = "2.0.1"
const val legacySupport = "1.0.0"
const val espresso = "3.3.0"
const val jUnit = "4.13"
const val arch = "2.1.0"
const val concurrent = "1.1.0"
const val lifeCycle = "2.2.0"
const val hilt = "2.28-alpha"
const val hiltAndroid = "1.0.0-alpha02"
const val leakCanary = "2.4"
}
const val compileSdkVersion = 30
const val buildToolsVersion = "30.0.2"
object DefaultConfig {
const val applicationID = "ir.moeindeveloper.stationery"
const val minSdKVersion = 19
const val targetSdkVersion = 30
const val versionCode = 1
const val versionName = "1.0"
const val testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
object Plugins {
const val application = "com.android.application"
const val android = "android"
const val kotlinExtensions = "android.extensions"
const val kapt = "kapt"
const val hilt = "dagger.hilt.android.plugin"
const val safeArgs = "androidx.navigation.safeargs.kotlin"
}
object Libraries {
const val kotlin = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"
const val coreKTX = "androidx.core:core-ktx:${Versions.coreKTX}"
const val appCompat = "androidx.appcompat:appcompat:${Versions.appCompat}"
const val constraintLayout = "androidx.constraintlayout:constraintlayout:${Versions.constraintLayout}"
const val legacySupport = "androidx.legacy:legacy-support-v4:${Versions.legacySupport}"
const val concurrent = "androidx.concurrent:concurrent-futures-ktx:${Versions.concurrent}"
const val viewModel = "androidx.lifecycle:lifecycle-viewmodel-ktx:${Versions.lifeCycle}"
const val liveData = "androidx.lifecycle:lifecycle-livedata-ktx:${Versions.lifeCycle}"
const val lifeCycleCommon = "androidx.lifecycle:lifecycle-common-java8:${Versions.lifeCycle}"
const val activity = "androidx.activity:activity-ktx:${Versions.activity}"
const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}"
const val hiltCompiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}"
const val hiltAndroid = "androidx.hilt:hilt-lifecycle-viewmodel:${Versions.hiltAndroid}"
const val leakCanary = "com.squareup.leakcanary:leakcanary-android:${Versions.leakCanary}"
object Test {
const val espressoContrib = "androidx.test.espresso:espresso-contrib:${Versions.espresso}"
const val espressoIntents = "androidx.test.espresso:espresso-intents:${Versions.espresso}"
const val espressoAccessibility = "androidx.test.espresso:espresso-accessibility:${Versions.espresso}"
const val espressoWeb = "androidx.test.espresso:espresso-web:${Versions.espresso}"
const val espressoIdlingConcurrent = "androidx.test.espresso.idling:idling-concurrent:${Versions.espresso}"
const val jUnit = "junit:junit:${Versions.jUnit}"
}
}
object ClassPaths {
const val gradle = "com.android.tools.build:gradle:${Versions.gradle}"
const val kotlin = "gradle-plugin"
const val hilt = "com.google.dagger:hilt-android-gradle-plugin:${Versions.hilt}"
const val safeArgs = "androidx.navigation:navigation-safe-args-gradle-plugin:${Versions.navigation}"
}
}
خب حالا فایل گریدل ماژول اپ رو به کاتلین DSL تغییر میدیم:
build.gradle:
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "ir.moeindeveloper.stationery"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled 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'
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
قسمت پلاگین:
plugins {
id(Dependencies.Plugins.application)
kotlin(Dependencies.Plugins.android)
kotlin(Dependencies.Plugins.kotlinExtensions)
kotlin(Dependencies.Plugins.kapt)
id(Dependencies.Plugins.hilt)
id(Dependencies.Plugins.safeArgs)
}
برای پلاگین هایی که برا کاتلین هستن از kotlin استفاده می کنیم مثل kotlin-android و دیگه نیازی نیست که کاتلین رو اول عبارت بنویسیم و اینطوری کافیه:
const val android = "android"
قسمت اندروید:
android {
compileSdkVersion(Dependencies.compileSdkVersion)
buildToolsVersion(Dependencies.buildToolsVersion)
defaultConfig {
applicationId = Dependencies.DefaultConfig.applicationID
minSdkVersion(Dependencies.DefaultConfig.minSdKVersion)
targetSdkVersion(Dependencies.DefaultConfig.targetSdkVersion)
versionCode = Dependencies.DefaultConfig.versionCode
versionName = Dependencies.DefaultConfig.versionName
multiDexEnabled = true
testInstrumentationRunner = Dependencies.DefaultConfig.testInstrumentationRunner
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
buildFeatures {
viewBinding = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
قسمت وابستگی ها:
dependencies {
implementation(Dependencies.Libraries.kotlin)
implementation(Dependencies.Libraries.coreKTX)
implementation(Dependencies.Libraries.appCompat)
implementation(Dependencies.Libraries.constraintLayout)
implementation(Dependencies.Libraries.legacySupport)
/*
arch components
*/
implementation(Dependencies.Libraries.concurrent)
implementation(Dependencies.Libraries.viewModel)
implementation(Dependencies.Libraries.liveData)
implementation(Dependencies.Libraries.lifeCycleCommon)
implementation(Dependencies.Libraries.activity)
/*
arch components
*/
/*
Hilt
*/
implementation(Dependencies.Libraries.hilt)
kapt(Dependencies.Libraries.hiltCompiler)
implementation(Dependencies.Libraries.hiltAndroid)
/*
Hilt
*/
debugImplementation(Dependencies.Libraries.leakCanary)
/*
Test libs
*/
androidTestImplementation(Dependencies.Libraries.Test.espressoCore)
androidTestImplementation(Dependencies.Libraries.Test.espressoContrib)
androidTestImplementation(Dependencies.Libraries.Test.espressoIntents)
androidTestImplementation(Dependencies.Libraries.Test.espressoAccessibility)
androidTestImplementation(Dependencies.Libraries.Test.espressoWeb)
androidTestImplementation(Dependencies.Libraries.Test.espressoIdlingConcurrent)
testImplementation(Dependencies.Libraries.Test.jUnit)
/*
Test libs
*/
}
build.gradle.kts:
plugins {
id(Dependencies.Plugins.application)
kotlin(Dependencies.Plugins.android)
kotlin(Dependencies.Plugins.kotlinExtensions)
kotlin(Dependencies.Plugins.kapt)
id(Dependencies.Plugins.hilt)
id(Dependencies.Plugins.safeArgs)
}
android {
compileSdkVersion(Dependencies.compileSdkVersion)
buildToolsVersion(Dependencies.buildToolsVersion)
defaultConfig {
applicationId = Dependencies.DefaultConfig.applicationID
minSdkVersion(Dependencies.DefaultConfig.minSdKVersion)
targetSdkVersion(Dependencies.DefaultConfig.targetSdkVersion)
versionCode = Dependencies.DefaultConfig.versionCode
versionName = Dependencies.DefaultConfig.versionName
multiDexEnabled = true
testInstrumentationRunner = Dependencies.DefaultConfig.testInstrumentationRunner
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
buildFeatures {
viewBinding = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
dependencies {
implementation(Dependencies.Libraries.kotlin)
implementation(Dependencies.Libraries.coreKTX)
implementation(Dependencies.Libraries.appCompat)
implementation(Dependencies.Libraries.constraintLayout)
implementation(Dependencies.Libraries.legacySupport)
/*
arch components
*/
implementation(Dependencies.Libraries.concurrent)
implementation(Dependencies.Libraries.viewModel)
implementation(Dependencies.Libraries.liveData)
implementation(Dependencies.Libraries.lifeCycleCommon)
implementation(Dependencies.Libraries.activity)
/*
arch components
*/
/*
Hilt
*/
implementation(Dependencies.Libraries.hilt)
kapt(Dependencies.Libraries.hiltCompiler)
implementation(Dependencies.Libraries.hiltAndroid)
/*
Hilt
*/
debugImplementation(Dependencies.Libraries.leakCanary)
/*
Test libs
*/
androidTestImplementation(Dependencies.Libraries.Test.espressoCore)
androidTestImplementation(Dependencies.Libraries.Test.espressoContrib)
androidTestImplementation(Dependencies.Libraries.Test.espressoIntents)
androidTestImplementation(Dependencies.Libraries.Test.espressoAccessibility)
androidTestImplementation(Dependencies.Libraries.Test.espressoWeb)
androidTestImplementation(Dependencies.Libraries.Test.espressoIdlingConcurrent)
testImplementation(Dependencies.Libraries.Test.jUnit)
/*
Test libs
*/
}
گریدل رو سینک کنید! کار شما تموم شد و گردیل شما مرتبه و هندل کردن اطلاعات آسون تر شده و به راحتی میتونید نسخه هارو تغییر بدید!
نکته مهم: چینش کانفیگ شما به این صورت کاری زمان بر و وقت گیره! برای راحتی کار از این پلاگین استفاده کنید:
اگه پیشنهادی، انتقادی یا سوالی داشتید در کامنت ها واسم بنویسید!
مطلبی دیگر از این انتشارات
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوازدهم
مطلبی دیگر از این انتشارات
۳۱ ترفند پیشرفته جهت بهبود مهارتهای برنامه نویسی اندروید
مطلبی دیگر از این انتشارات
لایسنس اوپن سورس ها و اضافه کردن آنها به پروژه Github