Android知识要点整理(16)----Gradle 之项目结构

Posted znapast

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android知识要点整理(16)----Gradle 之项目结构相关的知识,希望对你有一定的参考价值。

android app 由Gradle负责构建。Gradle构建系统定义了许多概念。

1.Project和Tasks

这个Gradle中最重要的两个概念。每次构建(build)至少由一个project构成,一个project 由一到多个task构成。项目结构中的每个build.gradle文件代表一个project,在这编译脚本文件中可以定义一系列的task;task 本质上又是由一组被顺序执行的Action`对象构成,Action其实是一段代码块,类似于Java中的方法

2.构建生命周期

每次构建的执行本质上执行一系列的Task。某些Task可能依赖其他Task。哪些没有依赖的Task总会被最先执行,而且每个Task只会被执行一遍。每次构建的依赖关系是在构建的配置阶段确定的。每次构建分为3个阶段:

  • Initialization: 初始化阶段 ;这是创建Project阶段,构建工具根据每个build.gradle文件创建出一个Project实例。
  • Configuration:配置阶段;这个阶段,通过执行构建脚本来为每个project创建并配置Task。
  • Execution:执行阶段;这是Task真正被执行的阶段,Gradle会根据依赖关系决定哪些Task需要被执行,以及执行的先后顺序。

3.构建配置文件

为了能够在Android项目中使用Gradle构建项目,我们需要在顶层目录新建build.gradle配置文件,用来配置构建脚本相关属性。基本内容如下:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:1.2.3'
    

除此之外,顶层的配置文件中还可以用来配置android项目各个模块的通用属性。配置内容放置在allprojects代码块中。如下所示:

allprojects 
    repositories 
        jcenter()
    
    //其他配置

同时,每个模块有自己的单独的配置文件,内容结构大致如下:

//表示该模块为应用模块,类似的有library模块
apply plugin: 'com.android.application'

//针对android 属性的一些配置
android 
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig 
        applicationId "com.example.android.animationsdemo"
        minSdkVersion 14
        targetSdkVersion 23
    

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


//模块的依赖关系
dependencies 
    compile 'com.android.support:support-v4:24.0.0-alpha2'
    compile 'com.android.support:support-v13:24.0.0-alpha2'
    compile 'com.android.support:recyclerview-v7:24.0.0-alpha2'
    compile project(path: ':backend', configuration: 'android-endpoints')

4.Gradle项目结构

针对Android的单模块gradle目录结构如下:

MyApp
├── build.gradle
├── settings.gradle
└── app
    ├── build.gradle
    ├── build
    ├── libs
    └── src
        └── main
            ├── java
            │ └── com.package.myapp
            └── res
                ├── drawable
                ├── layout
                └── etc.

模块关键目录的解释如下:

目录内容
/src/main/javaapp模块的源代码
/src/main/res相关资源 (如drawables, layouts, strings等等)
/libs第三方代码库(.jar 或者 .aar)
/buildThe output of the build process

5.认知Gradle Wrapper

Android Studio中默认会使用 Gradle Wrapper 而不是直接使用Gradle。命令也是使用gradlew而不是gradle。这是因为gradle针对特定的开发环境的构建脚本,新的gradle可能不能兼容旧版的构建环境。为了解决这个问题,使用Gradle Wrapper 来间接使用 gradle。相当于在外边包裹了一个中间层。对开发者来说,直接使用Gradlew 即可,不需要关心 gradle的版本变化。Gradle Wrapper 会负责下载合适的的gradle版本来构建项目。
正如上面说的,使用Android studio创建Android项目时,系统会默认使用Gradle Wrapper。但是如果项目是从Eclipse移植而来,那么我们需要手动添加对Gradle Wrapper的支持。具体步骤如下:

  • 安装Gradle工具,并且把gradle命令添加到环境变量。
  • 在项目的顶层目录中的build.gradle文件中添加如下代码(新版gradle可以省略这一步,因为wrapper task 默认包含在项目中):
task wrapper(type: Wrapper) 
    gradleVersion = '2.4'
  • 然后执行如下命令:
gradle wrapper --gradle-version 2.4

这样之后,项目中会生成如下结构的文件目录:

myapp/
    ├── gradlew //命令脚本
    ├── gradlew.bat //命令脚本
    └── gradle/wrapper/ //jar文件
            ├── gradle-wrapper.jar
            └── gradle-wrapper.properties //属性文件

其中属性文件具体内容如下:

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\\://services.gradle.org/distributions/gradle-2.10-all.zip

6.移植Eclipse项目到Android Studio

Android 提供了自动导入Eclipse项目的方法。但是我们只讲如何手工将Eclipse项目变为Android Studio可以直接使用的项目。
一种方法是保留原有的目录结构。下面是具体步骤
1. 在项目根目录中创建build.gradle配置文件。最基本的内容如下:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:1.2.3'
    


apply plugin: 'com.android.application'

android 
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

2 为了保持原有目录结构,我们需要修改source set。在build.gradle 文件末尾的android 代码块中添加如下内容:

android 

    //...

    sourceSets 
        main 
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        
        androidTest.setRoot('tests')
    

3.同时,添加依赖关系,如下:

 dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])

一种是转换为Android Studio 默认的目录结构。具体步骤如下:
1.手动建立相应的目录。下面的表格是新旧目录的映射关系:

旧目录新目录
src/app/src/main/java
res/app/src/main/res
assets/app/src/main/assets
AndroidManifest.xmlapp/src/main/AndroidManifest.xml

2.在项目根目录中创建settings.gralde文件,这个文件只能写一行内容,用于告诉构建系统在构建时将app模块包含进去:

include ':app'  

3.在项目根目录中创建build.gradle,用于配置项目级的属性。内容如下:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:1.2.3'
    

4.在app模块目录创建build.gradle,用于配置模块级的属性。内容如下:

apply plugin: 'com.android.application'
android 
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])

这样,Eclipse项目就成功地转为Android Studio项目。仔细观察会发现,第一种方法只用到了一个build.gradle文件,它将第二种方法中的2个build.gradle文件合为一体。第一方法更为简单,但是第二种方法更加符合趋势,以后扩展起来也更加方便。

以上就是Gradle android 项目结构的相关知识要点。

以上是关于Android知识要点整理(16)----Gradle 之项目结构的主要内容,如果未能解决你的问题,请参考以下文章

Android 知识要点整理(12)----Animation(动画)

Android知识要点整理----控制相机

Android 知识要点整理(13)----网络连接

Android 知识要点整理(12)----Animation(动画)

Android知识要点整理----文件分享

Android知识要点整理(19)----Gradle 之构建变体