Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Gradle for Android系列之二 build.gradle文件

$
0
0

  上一篇结合Android 项目大致的介绍了一下Gradle在Android中的应用。其中也多次提到了build.gradle。但是没有详细的介绍其的基本结构和其作用。那么本文就将围绕这些展开。在这之前先看看Android中的Gradle脚本也哪些

  Android项目中的Gradle脚本
  一般情况下,使用Android Studio创建的Android项目会默认产生3个Gradle脚本:
  1.root目录下build.gradle
  2.root目录下setting.gradle
  3.app目录下build.gradle
  如下图

 BaseProject
   ├── build.gradle
   ├── settings.gradle
   └── app
       └── build.gradle

  root目录下的build.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
}

  这就是Android项目实际构建就是从这里开始的,我们使用了JCenter作为我们的仓库,JCenter类似maven库,不需要任何额外的配置,grade还支持其他几个仓库,不论是远程还是本地仓库。仓库包含了一系列的依赖,配置了某个仓库,那么我们就可以使用这个仓库包含的依赖了。allprojects方法给我们提供了一种可以用来定义各个模块的默认属性的途径,这样我们可以自己在allprojects中定义一些tasks,在所有的模块中都能使用。最后一个task clean(也可以定义为别的名字),任务类型是Delete(也可以是Copy),就是每当修改settings.gradle文件后点击同步,就会删除rootProject.buildDir下的文件。
  setting.gradle文件在项目只有一个模块的时候是这个样子:
  

include ':app'

  如果是多模块的话,会相应的include对应的模块,改文件定义了哪一个模块将会被构建(setting.gradle是针对多模块操作的,所以单独的模块工程完全可以删除掉该文件)。在这之后,Gradle会为我们创建一个Setting对象,并为其包含必要的方法,我们不必知道Settings类的详细细节,但是最好能够知道这个概念。
  app目录下的build.gradle文件,只对app模块起作用,而且其可以重写任何在root文件目录build.gradle文件中定义的参数。该文件类似于:
  

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.chuck.moblie.baseproject"
        minSdkVersion 10
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'

}

  可以看到该文件的结构很清晰:
  1.apply plugin: ‘com.android.application’该语句中的apply是一个方法,给它传递了一个参数plugin,plugin 的值是’com.android.application’。如果有多个参数,则以逗号隔开。
  2.android:主要配置Android相关的参数属性
  3.dependencies:可以添加需要的依赖包。

  下面来详细的分析一下android这个方法中的内容:
  compileSdkVersion
buildToolsVersion
defaultConfig
buildTypes
compileSdkVersion和buildToolsVersion 是必须的,前者指定编译项目的sdk后者指定构建工具(build tools)的版本。这里的build tools(在sdk/build-tools/目录下)包含了我们在构建项目时的很多实用工具,像aapt,dx等。
25.0.2版本的build-tools
  
  defaultConfig指定的是Android应用的核心属性,在defaultConfig指定之后,会覆盖在AndroidManifest.xml指定的相对应的属性。
  

defaultConfig {
        applicationId "com.chuck.moblie.baseproject"
        minSdkVersion 10
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

  
  applicationId: 指定项目的包名,该属性会覆盖AndroidManifest.xml指定的package name属性,但是它又package name不完全一样,applicationId可以被用作app在各应用商店或者设备上的唯一标示,package name可以用作资源代码和R文件的包名。
  minSdkVersion:应用最低支持的Android版本。这里我指定是API10应用的Android系统版本就是Gingerbread(Android2.3)了。
  targetSdkVersion:指定最高能支持的Android系统版本。API23对应的是Android M(Android6.0)
  versionCode :改app的版本一般在升级系统时需要用到
  versionName :改app版本名称。
  
  有了这些属性,并且会覆盖AndroidManifest.xml的相应属性,所以可以不用在AndroidManifest.xml文件中定义。
  
  dependencies是Gradle的默认属性,所以不用定义在android方法中,它主要指定对应的模块所需要的依赖。只需要通过compile一句话就可以搞定:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'

}

  下面介绍一下常用的依赖引用方式:
  1.compile fileTree(dir, ‘libs’ ,include : ‘*.jar’) 依赖本地libs目录下的所有jar文件
  2.compile file(‘libs/xxx’) 依赖当个libs目录(可以自己指定路径,不一定要是libs)下的单个jar文件。
  3. compile project(:xx:xx) 依赖某个工程。
  4. compile ‘group:name:version’ 依赖仓库中的库,当然这里的仓库根据前文介绍是在root目录下的build.gradle中指定的,可以是JCenter也可以是本地的仓库。
  build.gradle的配置基本内容,基本介绍完了,接下来就是根据自己的项目定义一些task来处理。下一篇文章将继续介绍task。

作者:chenkai19920410 发表于2017/1/7 12:48:50 原文链接
阅读:63 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>