Android Studio 利用Gradle组织更清晰的打包脚本

简介: 前言我们最初写gradle脚本时候,通常的做法是把所有的打包脚本都写在了build.gradle文件中,这样做的容易引发的问题:项目中多个模块的build.gradle配置的依赖版本重复或compileSdkVersion等不统一;会导致一些依赖重复导致冲突;Android Support Library版本问题引发的一些列问题;影响 build.gradle 文件扩展性、可读性、以及难以维护等;针对以上问题,去寻找一个更清晰的打包系统,帮助开发者在组织打包脚本变得更简洁清晰。

前言

我们最初写gradle脚本时候,通常的做法是把所有的打包脚本都写在了build.gradle文件中,这样做的容易引发的问题:

  1. 项目中多个模块的build.gradle配置的依赖版本重复或compileSdkVersion等不统一;
  2. 会导致一些依赖重复导致冲突;
  3. Android Support Library版本问题引发的一些列问题;
  4. 影响 build.gradle 文件扩展性、可读性、以及难以维护等;

针对以上问题,去寻找一个更清晰的打包系统,帮助开发者在组织打包脚本变得更简洁清晰。


方式一

抽取统一的依赖
在根目录新建一个config.gradle文件,里面键入要统一的依赖:

ext {
    android = [
        compileSdkVersion: 23,
        buildToolsVersion: "23.0.3",
        minSdkVersion    : 15,
        targetSdkVersion : 22,
        versionCode      : 1,
        versionName      : "1.0"
    ]

    dependencies = [
        "gson"               : "com.google.code.gson:gson:2.6.2",
        "eventbus"           : 'org.greenrobot:eventbus:3.0.0',
        "butterknife"        : 'com.jakewharton:butterknife:7.0.1',
        "support-design"     : 'com.android.support:design:24.1.1',
        "support-appcompatV7": 'com.android.support:appcompat-v7:24.1.1',
        "support-percent"    : 'com.android.support:percent:24.1.1',
        "support-multidex"   : 'com.android.support:multidex:1.0.1',
        "glide"              : 'com.github.bumptech.glide:glide:3.7.0',
        "support-v4"         : 'com.android.support:support-v4:24.1.1',
        "okhttp3"            : 'com.squareup.okhttp3:okhttp:3.3.1',
        "nineoldandroids"    : 'com.nineoldandroids:library:2.4.0'
        
    ]
}

然后在根目录的build.gradle文件里面头部新增一句引用apply from: "config.gradle"

在module里面开始应用:

compileSdkVersion rootProject.ext.android.compileSdkVersion //android{}节点

compile rootProject.ext.dependencies["support-appcompatV7"] //dependencies{}节点

clean一下去External Libraries看看,是不是还有重复的,如果还有,说明前面config里面的依赖其他地方还有遗漏的,全局搜索一下在同样方式替换一下就好了。


方式二(更优方式)

此方式参照开源架构Android-CleanArchitecture中的打包组织架构。根据功能的不同,将打包系统分为多个脚本文件。
打包系统的组织结构如下:

img_26c66646d761c4a6ccbe89a1b8196da9.png
image.png

ci.gradle文件如下:

def ciServer = 'TRAVIS'
def executingOnCI = "true".equals(System.getenv(ciServer))

// Since for CI we always do full clean builds, we don't want to pre-dex
// See http://tools.android.com/tech-docs/new-build-system/tips
subprojects {
    project.plugins.whenPluginAdded { plugin ->
        if ('com.android.build.gradle.AppPlugin'.equals(plugin.class.name) || 'com.android.build.gradle.LibraryPlugin'.equals(plugin.class.name)) {
            project.android.dexOptions.preDexLibraries = !executingOnCI
        }
    }
}

dependencies.gradle,里面键入要统一的依赖

allprojects {
    repositories {
        jcenter()
    }
}

ext {
    //Android
    androidBuildToolsVersion = "24.0.1"
    androidMinSdkVersion = 15
    androidTargetSdkVersion = 21
    androidCompileSdkVersion = 21

    //Libraries
    daggerVersion = '2.8'
    butterKnifeVersion = '7.0.1'
    recyclerViewVersion = '21.0.3'
    rxJavaVersion = '2.0.2'
    rxAndroidVersion = '2.0.1'
    javaxAnnotationVersion = '1.0'
    javaxInjectVersion = '1'
    gsonVersion = '2.3'
    okHttpVersion = '2.5.0'
    androidAnnotationsVersion = '21.0.3'
    arrowVersion = '1.0.0'

    //Testing
    robolectricVersion = '3.1.1'
    jUnitVersion = '4.12'
    assertJVersion = '1.7.1'
    mockitoVersion = '1.9.5'
    dexmakerVersion = '1.0'
    espressoVersion = '2.0'
    testingSupportLibVersion = '0.1'

    //Development
    leakCanaryVersion = '1.3.1'

    presentationDependencies = [
        daggerCompiler:     "com.google.dagger:dagger-compiler:${daggerVersion}",
        dagger:             "com.google.dagger:dagger:${daggerVersion}",
        butterKnife:        "com.jakewharton:butterknife:${butterKnifeVersion}",
        recyclerView:       "com.android.support:recyclerview-v7:${recyclerViewVersion}",
        rxJava:             "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
        rxAndroid:          "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
        javaxAnnotation:    "javax.annotation:jsr250-api:${javaxAnnotationVersion}"
    ]

    presentationTestDependencies = [
        mockito:            "org.mockito:mockito-core:${mockitoVersion}",
        dexmaker:           "com.google.dexmaker:dexmaker:${dexmakerVersion}",
        dexmakerMockito:    "com.google.dexmaker:dexmaker-mockito:${dexmakerVersion}",
        espresso:           "com.android.support.test.espresso:espresso-core:${espressoVersion}",
        testingSupportLib:  "com.android.support.test:testing-support-lib:${testingSupportLibVersion}",
    ]

    domainDependencies = [
        javaxAnnotation:    "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
        javaxInject:        "javax.inject:javax.inject:${javaxInjectVersion}",
        rxJava:             "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
        arrow:              "com.fernandocejas:arrow:${arrowVersion}"
    ]

    domainTestDependencies = [
        junit:              "junit:junit:${jUnitVersion}",
        mockito:            "org.mockito:mockito-core:${mockitoVersion}",
        assertj:            "org.assertj:assertj-core:${assertJVersion}"
    ]

    dataDependencies = [
        daggerCompiler:     "com.google.dagger:dagger-compiler:${daggerVersion}",
        dagger:             "com.google.dagger:dagger:${daggerVersion}",
        okHttp:             "com.squareup.okhttp:okhttp:${okHttpVersion}",
        gson:               "com.google.code.gson:gson:${gsonVersion}",
        rxJava:             "io.reactivex.rxjava2:rxjava:${rxJavaVersion}",
        rxAndroid:          "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}",
        javaxAnnotation:    "javax.annotation:jsr250-api:${javaxAnnotationVersion}",
        javaxInject:        "javax.inject:javax.inject:${javaxInjectVersion}",
        androidAnnotations: "com.android.support:support-annotations:${androidAnnotationsVersion}"
    ]

    dataTestDependencies = [
        junit:              "junit:junit:${jUnitVersion}",
        assertj:            "org.assertj:assertj-core:${assertJVersion}",
        mockito:            "org.mockito:mockito-core:${mockitoVersion}",
        robolectric:        "org.robolectric:robolectric:${robolectricVersion}",
    ]

    developmentDependencies = [
        leakCanary: "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}",
    ]
}

项目 project 目录下 build.gradle 中开头加入

apply from: 'buildsystem/ci.gradle'
apply from: 'buildsystem/dependencies.gradle'
...

模块 module 目录下的 build.gradle

apply plugin: 'com.android.library'
android {
    def globalConfiguration = rootProject.extensions.getByName("ext")
    compileSdkVersion globalConfiguration.getAt("androidCompileSdkVersion")
    buildToolsVersion globalConfiguration.getAt("androidBuildToolsVersion")

    defaultConfig {
        minSdkVersion globalConfiguration.getAt("androidMinSdkVersion")
        targetSdkVersion globalConfiguration.getAt("androidTargetSdkVersion")
        versionCode globalConfiguration.getAt("androidVersionCode")
    }
    ...
}

dependencies {
    def domainDependencies = rootProject.ext.domainDependencies
    def domainTestDependencies = rootProject.ext.domainTestDependencies

    provided domainDependencies.daggerCompiler
    provided domainDependencies.javaxAnnotation

    compile domainDependencies.dagger
    compile domainDependencies.rxJava

    testCompile domainTestDependencies.junit
    testCompile domainTestDependencies.mockito
}
目录
相关文章
|
5月前
|
开发工具 Android开发 iOS开发
如何在Android Studio中配置Flutter环境?
如何在Android Studio中配置Flutter环境?
1360 61
|
10天前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
52 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
4月前
|
Android开发 Windows
Android studio 报错Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Connection refused: connect(已解决)
这是一篇关于解决Android Studio报错“Connect to 127.0.0.1:8888 failed: Connection refused”的文章。问题通常因系统代理设置被Android Studio自动保存导致。解决方法是找到系统中Android Studio使用的gradle.properties文件(位于Windows的C:\Users\你的电脑用户名\.gradle或Mac的/Users/.{你的用户目录}/.gradle),删除或注释掉多余的代理配置后保存并重新Sync项目。希望此经验能帮助快速解决同类问题!
668 36
|
4月前
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
439 19
|
7月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
205 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
7月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
175 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Java Android开发 数据安全/隐私保护
将Android应用程序打包
选中项目右击àExportàAndroidàExport Android ApplicationàNextàNextàCreate new keystore(创建新密钥)               {                      Location:表示要将打包的项目放置的位置                      Password:表示密码       
1136 0
|
7天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
104 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
17天前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
71 6

热门文章

最新文章

推荐镜像

更多