Android优雅的避免gradle重复

321 阅读2分钟

本文 已参与「新人创作礼」活动,一起开启掘金创作之路。

说一个现象,在我们写Android的时候,我们经常会创建很多的build.gradle,那么让我们苦恼的是,这么的gradle,经常有很多重复的代码,今天我们来梳理下这部分的代码,用比较好的实现去改进它

1、现象

image.png 比如我们的项目中有很多的独立模块,每个模块都有这样的文件,这里面很多代码都是相似的,包括app模块中的build.gradle,如果我们依赖的模块比较多,就会被这么多的依赖弄的焦头烂额

2、解决方案

1、创建一个独立的gradle文件

image.png 我们需要做的是,将重复的东西都写在这里面

2、移植内容

将app文件夹下的build.gradle内容移动到这里 但是需要注意的是,并不是全部移植到这里,还有几个数据是不能移动的,属于每个模块的标志

apply plugin:'kotlin-android'
apply plugin:'kotlin-parcelize'
apply plugin:'kotlin-kapt'
apply plugin:'androidx.navigation.safeargs.kotlin'

android{
    compileSdk compile_sdk_version
    buildToolsVersion build_tools_version

    defaultConfig {
        minSdk min_sdk_version
        targetSdk target_sdk_version
        versionCode lib_version_code
        versionName lib_version_name

        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'
    }
    buildFeatures {
        viewBinding true
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'],dir: 'libs')
    //region平台相关的基础库
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation "androidx.core:core-ktx : 1.2.0"
    implementation 'androidx.fragment : fragment-ktx:1.2.4'
    implementation 'androidx.activity:activity-ktx:1.1.0'
    implementation "androidx.constraintlayout:constraintlayout:2.0.0-beta6//endregion"
    //region jetPack libs
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-livedata:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-runtime:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
    kapt "androidx.lifecycle:lifecycle-common-java8:2.2.0"
    implementation 'androidx.room:room-runtime:2.2.5'
    implementation 'androidx.room:room-common:2.2.5'
    implementation 'androidx.room:room-ktx:2.2.5'
    kapt "androidx.room:room-compiler:2.2.5"

    implementation 'androidx.paging:paging-runtime:2.1.2'
    implementation 'androidx.paging:paging-runtime-ktx;2.1.2'
    implementation 'androidx.paging:paging-common:2.1.2'
    implementation 'androidx.paging:paging-common-ktx:2.1.2'
    implementation 'androidx.work:work-runtime:2.3.4'
    implementation 'androidx.work:work-runtime-ktx:2.3.4'

     //注意配置navigation版本号的时候,project下的build.gradle的class path也需要同步navigation的版本号配置
    // implementation "androidx.navigation:navigation-ui:$navigation_version"
    implementation "androidx.navigation;navigation-ui-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-fragment:$navigation_version"
    implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-runtime :$navigation_version"

    //region test iibs
    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test:core:1.2.0'
    androidTestImplementation 'androidx.test:core-ktx:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    //
    //  endregion

}

不可移动的部分

plugins {
    id 'com.android.application'
}
apply from: "../dependencies.gradle"
android {
    defaultConfig {
        applicationId "vip.hblg.myapp"
    }
}
dependencies {

}

id 'com.android.application' 表示的是当前模块为一个应用 id 'com.android.library' 表示的是当前模块为一个库,并非一个应用 applicationId 表示的是应用的包名

3、更改库中的内容

app:

image.png

其他模块:

image.png

可以看到,很方便的实现了公用一个gradle的内容,并且在每个模块里只需要少量的代码就可以实现,在app和其他模块中,只有com.android.application不一样,其他的都是相同

总结

采用这种方式,可以极大的简化代码,帮助我们梳理整个项目依赖和配置的信息