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
}
目录
相关文章
|
2月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
265 8
|
2月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
152 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
2月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
177 6
|
6月前
|
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项目。希望此经验能帮助快速解决同类问题!
894 36
|
3月前
|
机器学习/深度学习 Android开发 数据安全/隐私保护
手机脚本录制器, 脚本录制器安卓,识图识色屏幕点击器【autojs】
完整的UI界面,包含录制控制按钮和状态显示 屏幕点击动作录制功能,记录点击坐标和时间间隔
|
4月前
|
Android开发 数据安全/隐私保护 Python
微信抢红包脚本安卓插件,微信xposed抢红包模块, magisk微信抢红包模块
这个代码实现了一个完整的微信抢红包自动化工具,包含红包检测、自动点击、日志记录等功能
|
6月前
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
579 19
|
4月前
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
Java Android开发 数据安全/隐私保护
将Android应用程序打包
选中项目右击àExportàAndroidàExport Android ApplicationàNextàNextàCreate new keystore(创建新密钥)               {                      Location:表示要将打包的项目放置的位置                      Password:表示密码       
1152 0

热门文章

最新文章

推荐镜像

更多