详解Android使用Gradle统一配置依赖管理

在介绍使用 Gradle 统一配置依赖管理前我们先来简单介绍一下 Gradle, Gradle 是一个基于 JVM 的构建工具,也是一款非常灵活强大的构建工具,支持  jcenter、maven、Ivy 仓库,支持传递性依赖管理(即 A 依赖 B,B 依赖 C,那么 A 也就可以依赖 C,不用再单独去依赖),而不需要远程仓库或者是 pom.xml 和 ivy.xml 配置文件,抛弃了各种繁琐,基于 Groovy,build 脚本使用 Groovy 编写

而在我们的 Android studio 中默认就是使用 Gradle 来构建管理我们的工程的,在我们的工程构建过程中通常会创建很多个 Module 来对我们的工程进行功能以及业务上的解耦(也就是模块化开发),这时候可能就会存在一个问题,就是每个 Module 以及 Module 中一些公用库的依赖可能会出现版本不统一的问题,包括使用的编译版本,SDK 的版本等,导致不能打包,这里可以使用 Gradle 统一配置文件来解决我们的问题

首先我们来看一下,正常情况下我们的项目目录的 build.gradle 情况:

先看 app 下的 build.gradle:

//说明module的类型,com.android.application为程序,com.android.library为库
apply plugin: 'com.android.application'
android { 

  //编译的 SDK 版本
  compileSdkVersion 25 

  //编译的 Tools 版本
  buildToolsVersion "25.0.2" 

  //默认配置
  defaultConfig { 

    //应用程序的包名
    applicationId "com.example.qiudengjiao.activitytest" 

    //支持 SDK 的最低版本
    minSdkVersion 15 

    //支持 SDK 的目标版本
    targetSdkVersion 25 

    //版本号
    versionCode 1 

    //版本名
    versionName "1.0"
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  } 

  //build 类型
  buildTypes {
    release {
      //混淆是否开启,返回true则开启
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
} 

//在这里进行库的依赖
dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  }) 

  testCompile 'junit:junit:4.12' 

  //support v7 支持库
  compile 'com.android.support:appcompat-v7:25.1.0'
}

接下来我们再来看一下项目根目录下的 build.gradle:

//构建脚本
buildscript {
   repositories {
     //依赖的仓库
    jcenter()
  }
  dependencies { 

    //项目依赖的Gradle版本
    classpath 'com.android.tools.build:gradle:2.2.3' 

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
  }
} 

allprojects {
  repositories {
    jcenter()
  }
} 

task clean(type: Delete) {
  delete rootProject.buildDir
}

现在我们添加一个 Module 库,来看一下我们 Module 库下的 build.gradle:

apply plugin: 'com.android.library'
android {
  compileSdkVersion 23
  buildToolsVersion "23.0.2" 

  defaultConfig {
    minSdkVersion 13
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
} 

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  })
  compile 'com.android.support:appcompat-v7:25.0.0'
  testCompile 'junit:junit:4.12'
}

这里我们来看一下和 app 目录下的 build.gradle 有什么区别:

app 目录下的 build.gradle 是:apply plugin:com.android.application

Module 库下的 build.gradle 是:apply plugin:com.android.library

其它的就是版本的不一样了,要素是一样的,这里就是我们今天着重要来介绍的,这里我们看到编译的 SDK 版本和编译的 Tools 版本以及支持 SDK 的最低版本等的版本号都是不一样的,这里我们就需要来统一,而我们总不能每次都来手动配置,当 Module 增多时则容易出错

解决办法:

方法一

在项目的根目录的 build.gradle 里进行统一配置如下:

/*在根目录中配置公用供子模块调用*/
ext {
  //Android
  compileSdkVersion = 25
  buildToolsVersion = "25.0.2"
  minSdkVersion = 15
  targetSdkVersion = 25 

  //Version
  supportLibrary = "25.1.0" 

  //supportLibraries dependencies
  supportDependencies = [
      supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
  ]
}

配置完后工程根目录的 build.gradle 情况:

//构建脚本
buildscript { 

  repositories { 

    //依赖的仓库
    jcenter()
  }
  dependencies { 

    //项目依赖的Gradle版本
    classpath 'com.android.tools.build:gradle:2.2.3' 

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
  }
} 

allprojects {
  repositories {
    jcenter()
  }
} 

task clean(type: Delete) {
  delete rootProject.buildDir
} 

/*在根目录中配置公用供子模块调用*/
ext {
  //Android
  compileSdkVersion = 25
  buildToolsVersion = "25.0.2"
  minSdkVersion = 15
  targetSdkVersion = 25 

  //Version
  supportLibrary = "25.1.0" 

  //supportLibraries dependencies
  supportDependencies = [
      supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
  ]
}

接下来我们在 app 的 build.gradle 中进行调用如下:

apply plugin: 'com.android.application'
android {
  compileSdkVersion rootProject.ext.compileSdkVersion
  buildToolsVersion rootProject.ext.buildToolsVersion
  defaultConfig { 

    applicationId "com.example.qiudengjiao.activitytest"
    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  } 

  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
} 

dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  })
  compile 'junit:junit:4.12'
  compile rootProject.ext.supportDependencies.supportAppcompat
}

在 Module 的 build.gradle 中进行调用如下:

apply plugin: 'com.android.library'
android { 

  compileSdkVersion rootProject.ext.compileSdkVersion
  buildToolsVersion rootProject.ext.buildToolsVersion 

  defaultConfig { 

    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode 1
    versionName "1.0" 

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

  } 

  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
} 

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  })
  testCompile 'junit:junit:4.12'
  compile rootProject.ext.supportDependencies.supportAppcompat
}

这样我们就完成了使用 Gradle 对项目中 app 下的 build.gradle 和 Module 中的 build.gradle 依赖进行统一配置的解决,以此类推,更多的 Module 也是如此配置,以后需要版本的更改我们只需要去根目录 build.gradle 修改即可

方法二

因为每个人都有自己的配置习惯,这里我们再提供一种配置以供大家参考,这里我们在主项目的根目录下创建 config.gradle 来配置需要的相关配置信息如下:

config.gradle 里面的配置信息:

/**
 * 在主项目的根目录下创建config.gradle文件
 * 在这里单独处理统一依赖问题
 * 注意需要在根目录的build.gradle中进行引入
 */
ext {
  android = [
      compileSdkVersion: 25,
      buildToolsVersion: "25.0.2",
      minSdkVersion  : 15,
      targetSdkVersion : 25
  ] 

  //Version
  supportLibrary = "25.1.0" 

  //supportLibraries dependencies
  supportDependencies = [
      supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
      supportV4    : "com.android.support:support-v4:${supportLibrary}",
      suppoutDesign  : "com.android.support:design:${supportLibrary}"
  ]
}

然后我们需要在根目录的 build.gradle 中把 config.gradle 引入进来,这里特别注意是在根目录的 build.gradle 中引入
引入的代码为:

apply from: "config.gradle"

引入后的根目录 build.gradle 如下:

//在这里引入config.gradle
apply from: "config.gradle" 

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:2.2.3' 

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
  }
} 

allprojects {
  repositories {
    jcenter()
  }
} 

task clean(type: Delete) {
  delete rootProject.buildDir
}

接下来我们就可以在 Module 中引入使用了,如下:

apply plugin: 'com.android.library' 

//android配置
def config = rootProject.ext.android 

//相关库依赖
def librarys = rootProject.ext.supportDependencies 

android {
  compileSdkVersion config.compileSdkVersion
  buildToolsVersion config.buildToolsVersion 

  defaultConfig {
    minSdkVersion config.minSdkVersion
    targetSdkVersion config.targetSdkVersion
    versionCode 1
    versionName "1.0" 

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
} 

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  })
  testCompile 'junit:junit:4.12' 

  //在这里使用库的依赖
  compile librarys.supportAppcompat
  compile librarys.supportV4
  compile librarys.suppoutDesign
}

到这里我们就成功的引入到了 Module 的 build.gradle 中,以后每个 Module 中的引入都是这样,实现了和方法一 同样的功能,个人感觉第二种更好一点,大家自己选择吧,毕竟各有所好,好了,到这里就给大家分享完了在项目中使用 Gradle 统一配置依赖,希望对大家有用,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • AndroidStudio 使用过程中出现的异常(Gradle sync failed)处理办法
  • 为Android Studio编写自定义Gradle插件的教程
  • Android Studio使用教程(五):Gradle命令详解和导入第三方包
  • Android Studio使用教程(四):Gradle基础
  • Gradle编译打包Android apk详细介绍
  • AndroidStudio更新出现Refreshing ''xxx'' Gradle Project状态解决办法
  • Android客户端程序Gradle如何打包
  • 详解Androidstudio3.0 关于Gradle报错的问题(小结)
  • android studio 3.0 gradle 打包脚本配置详解
(0)

相关推荐

  • 为Android Studio编写自定义Gradle插件的教程

    Google已经建议Android开发全部转向Android Studio开发,Android Studio 是使用gradle编译.打包的,那么问题来了,gradle可是有一堆东西...,为了彻底了解gradle,今天就来学习下如何写自己的gradle插件(当然插件源码是使用groovy写的),先看如下代码目录: 如上图所示,plugin目录是插件源码目录,sample是用来测试插件的. 1.在目录plugin/src/main/groovy/com/micky/gradle/下新建插件类My

  • android studio 3.0 gradle 打包脚本配置详解

    本文介绍了android studio 3.0 gradle 打包脚本配置,分享给大家,具体如下: 修改输出的名字 保存输出的文件路径 def fileArray = [] //遍历输出文件 android.applicationVariants.all { variant -> variant.outputs.all { output -> def outputFile = output.outputFile if (outputFile != null && outputF

  • AndroidStudio更新出现Refreshing 'xxx' Gradle Project状态解决办法

    前言 开发项目之前,我用的是AndroidStuio2.1.0版本,项目开发完后,按耐不住就更新编译环境了.编译环境更新至AndroidStuio2.2.2. 更新完后,激动的打开AndroidStudio,原来的项目就处于如下状态: 本来以为这是更新后的正常情况,结果一直处于这种状态.然后搜索了一下网上,总结到一个简单方便的解决方法: 第一步: 关闭项目,进入AndroidStudio安装目录下的gradle文件夹中,查看新版本AndroidStudio的gradle版本,如下图: 复制上面的

  • Android Studio使用教程(五):Gradle命令详解和导入第三方包

    Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看.编译并导入第三方开源项目的方法. Sublime + Terminal编译并查看源码 首先来给大家介绍一种简便并且个人最喜欢的一种办法.很多时候我们在GitHub上看到一个不错的开源项目,一般有两种需求,阅读源码和查看运行效果,如果是单纯的查看源码我更喜欢用一些轻量级编辑器,如vim,sublime等,vim不是很熟练,所以个人一种都习惯用sublime来查看

  • 详解Androidstudio3.0 关于Gradle报错的问题(小结)

    前言 升级Android Studio to 3.0 canary 1版本后,之前一个正常的Project,一直报错,报错内容如下 Error:Failed to complete Gradle execution. Cause: The version of Gradle you are using (3.3) does not support the forTasks() method on BuildActionExecuter. Support for this is available

  • Android客户端程序Gradle如何打包

    一.前言 android客户端开发进入尾声,负责SEO同事突然发给我一个涉及45个发布渠道的噩耗,之前只发布自有渠道的工作方式(手动修改参数打包)已经不满足需求,所以引入最近比较流行的gradle打包技术. gradle基于groovy语言,引入的原因也方便了以后从现在使用的eclipse开发环境迁移到Android Studio,所以blablabla--,不多说了,先上干货. 二.准备工作 1.首先,如果使用eclipse作为开发环境,需右键点击项目,在菜单中选择"Export-"

  • AndroidStudio 使用过程中出现的异常(Gradle sync failed)处理办法

    AndroidStudio使用过程中出现的异常 异常信息: Gradle sync failed: Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the user guide chapter on th

  • Android Studio使用教程(四):Gradle基础

    其实很早之前也写了一篇Gradle的基础博客,但是时间很久了,现在Gradle已经更新了很多,所以暂且结合Stduio 1.0正式版与最新的Gradle语法来详细讲解下,小伙伴们直接跟我一步步来学习吧. 什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装Gradle 在Android Studio系列教程一–下载与安装中新建项目成功后会下载Grad

  • Gradle编译打包Android apk详细介绍

    Gradle编译打包Android apk详细介绍 理解Gradle构建过程,解读Android Gradle插件的配置 阅读本文一定是要使用过Gradle生成apk,文中不会讲如何安装运行Gradle,如有需要可先看文末的参考文章. APK包是一个ZIP压缩包,从Java源代码.资源文件到生成这个APK,经过了编译打包一系列特定的过程,SDK文档(/docs/tools/building/index.html)中找到.而这一系列特定的过程,重复繁琐,构建工具(build tool)就是来流程化

  • 详解Android使用Gradle统一配置依赖管理

    在介绍使用 Gradle 统一配置依赖管理前我们先来简单介绍一下 Gradle, Gradle 是一个基于 JVM 的构建工具,也是一款非常灵活强大的构建工具,支持  jcenter.maven.Ivy 仓库,支持传递性依赖管理(即 A 依赖 B,B 依赖 C,那么 A 也就可以依赖 C,不用再单独去依赖),而不需要远程仓库或者是 pom.xml 和 ivy.xml 配置文件,抛弃了各种繁琐,基于 Groovy,build 脚本使用 Groovy 编写 而在我们的 Android studio

  • 详解Android Studio中Git的配置及协同开发

    一. Android Stutio配置git setting–>Version Control–>Git–>Path to Git executable中选择git.exe的位置,这个Stutio一般会默认配置好: 配置完路径后点击后面的Test按钮,出现下面提示框则表示配置成功: 二. 将项目分享到github 1. 设置github账号密码 打开Setting–>Version Control–>GitHub,填写完账号密码后,点击Test测试,如果连接成功会弹出如下提示

  • Android+OpenCV4.2.0环境配置详解(Android studio)

    仅是个人记录,希望能对有需要的给予一些小小的帮助 首先我们肯定是要去到OpenCV的官网下载对应的SDK,并解压得到文件夹(opencv-4.2.0-android-sdk) 其次是NDK环境搭建(双击shift,输入sdk,找到sdk manager,将下面红色框框勾选安装) 创建项目,我选用的是(并不是只有这一选择) 导入Module File->New->Import Module 路径选择**\opencv-4.2.0-android-sdk\OpenCV-android-sdk\sd

  • Android开发gradle拉取依赖的加速配置

    目录 前言 情况1 : 情况2: 前言 镜像配置都是常规操作,必要时也可以上代理. 自己搭的nexus本质也是一种镜像,可以代理maven中央仓库. 各个仓库的测速,可以使用这个脚本: 通过测速,调整仓库的顺序 apply from: 'https://raw.githubusercontent.com/hss01248/flipperUtil/master/deps/depsLastestChecker.gradle' 情况1 : 每次点击sync project with gradle fi

  • 详解Android中Intent对象与Intent Filter过滤匹配过程

    如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

  • 详解Android性能优化之启动优化

    1.为什么要进行启动优化 网上流行一种说法,就是8秒定律,意思是说,如果用户在打开一个页面,在8秒的时间内还没有打开,那么用户大概的会放弃掉,意味着一个用户的流失.从这里就可以看出,启动优化的重要性了. 2.启动的分类 2.1 冷启动 先来看看冷启动的流程图 从图中可以看出,APP启动的过程是:ActivityManagerProxy 通过IPC来调用AMS(ActivityManagerService),AMS通过IPC启动一个APP进程,ApplicationThread通过反射来创建App

  • 详解android在mob平台实现qq登陆和分享

    个人感觉mob平台功能还是比较强大的,很多功能都可以通过他们平台来实现. 建议仔细观看每一个步骤,如果一个步骤没处理好,可能就会让你的这个功能无法实现.相信我一定可以成功的. 废话少说,先看一下效果: 1.在mob平台配置ShareSDK环境 1.如何在mob平台创建应用 下面为我创建的应用,如图所示,我们选择接入的接口为ShareSDK 2.获取你的App Key和App Secret(建议用自己的) 获取你先创建应用的App Key和App Secret,这里主要告诉你在哪里找App Key

  • 详解Android Studio正式签名进行调试的实现步骤

    详解Android Studio正式签名进行调试的实现步骤 在Android Studio中,可以使用Gradle进行打包时自动签名.其实Android Studio默认会给调试应用加上Debug签名,但有时候调一些第三方SDK时,需要正式签名才能调起来,所以接下来分享一下使用Gradle自动签名的方法. 一.创建签名文件 打开AS,选择Build->Generate Signed APK,选择要打包的项目,点击Next,再点击Create new...创建签名文件 填写签名文件响应信息,如下所

  • 详解Android studio如何导入jar包方法

    下面我就总结一下Android studio大家在导入jar包时遇到的一些问题和解决方法: 1,首先先说一下怎么在AS 中找到sdk,jdk,ndk的安装路径,可能一部分人一开始找不到,下面贴出方法: Android studio 中更改sdk的路径,如下图,在右边红色方框中更改sdk的路径 还有一种更好的方式可以把sdk,jdk,ndk的路径全部找到,首先File---Other Settings---Default Project Structure...,打开如下图界面,从红方框处即可直接

  • 详解Android项目多服务端接口适配(超简单)

    现状 Android项目如果是多服务端接口时,一般怎么弄呢? 方法1:服务器地址放在Header中 把服务器地址放在接口Header中,然后通过拦截器来动态修改请求地址而实现的.除了默认服务器的接口,其它都要加一个Header,有点麻烦.看起来也不爽,不简洁. interface ApiHeaderCase { /************************** server A ****************************/ @Headers("host:$SERVER_HOS

随机推荐