zoukankan      html  css  js  c++  java
  • Gradle简介

    Google 推荐使用的 Android Studio采用 Gradle 来构建项目。Gradle 是一个非常先进的项目构建工具。

    一、Gradle

    Gradle 是用了一种基于 Groovy 的领域特定语言(DSL,Domain Specific Language)来声明项目设置,摒弃了 XML(如 ANT 和 Maven)的各种繁琐配置。 

    我们通过Android Studio创建的项目中,一般会出现1个settings.gradle和2个或者多个build.gradle 文件,

    在Project视图模式下,一个在根目录下,一个在 app 目录下。

    如果切换到Android视图模式下则全部在Gradle Scripts。
             
    Project视图模式                                                       Android视图模式

     1、settings.gradle

    这个 settings.gradle文件定义了哪些module 应该被加入到编译过程,对于单个module 的项目可以不用需要这个文件,但是对于 multimodule 的项目我们就需要这个文件,否则gradle 不知道要加载哪些项目。这个文件的代码在初始化阶段就会被执行。

    rootProject.name='ActivityTest'
    include ':app'

    2、根目录下的 build.gradle

    (1)repositories 闭包,声明了 jcenter() 的配置。那么这个jcenter是什么意思呢?其实它是一个代码托管仓库,

    很多Android 开源项目都会选择将代码托管到jcenter上,声明了这行配置之后,我们就可以在项目中轻松引用任何jcenter上的开源项目了;

    (2)dependencies 闭包,使用classpath声明了一个 Gradle 插件。 为什么要声明这个插件呢?因为Gradle并不是专广门为构建Android项目而开发的,Java、 C++等很多种项目都可以使用Gradle来构建。

    因此如果我们要想使用它来构建Android项目,则需要声明com.android.tools.build:gradle:3.6.1这个插件。

    其中,最后面的部分是插件的版本号,也就是AndroidStudio的版本的版本号,目前使用的AndroidStudio的版本是3.6.1。

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    
    buildscript {
        
        repositories {
            google()
            jcenter()
            
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.6.1'
            
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
            
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }

    3、app 目录下的build.gradle

    这个文件中的内容就要相对复杂一些了,下面我们一行行地进行分析。

    (1)apply plugin,声明是 Android 应用程序还是库模块,有两种值可选:

    • com..android.application:表示这是一个应用程序模块;
    • com.android.library:表示这是一个库模块。

    应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。

    (2)android 闭包,配置构建项目的各种属性

    • compileSDKVersion:用于指定项目的编译 SDK 版本;
    • buildToolsVersion:用户指定项目构建工具的版本,如果有更新的版本时,Android Studio会进行提示;
    • defaultConfig闭包:默认配置:
      • applicationId 用于指定项目的包名,前面我们在创建项目的时候其实已经指定过包名了,如果你想在后面对其进行修改,那么就是在这里修改的;
      • minSdkVersion用于指定项目最低兼容的Android 系统版本,这里指定成15 表示最低兼容到Android 4.0系统;
      • targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说Android 6.0系统中引入了运行时权限这个功能,如果你将targetSdkVersion指定成23或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将targetSdkVersion指定成22,那么就说明你的程序最高只在Android5.1系统上做过充分的测试,Android 6.0系统中引人的新功能自然就不会启用了;
      • versionCode 用于指定项目的版本号;
      • versionName 用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要,我们在后面都会学到;
    • buildTypes闭包:指定生成安装文件的配置,通常只会有两个子闭包,一个是debug,一个是release。 debug闭包用于指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置。另外,debug闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。下面来看一下release闭包中的具体内容吧,minifyEnabled用于指定是否对项目的代码进行混淆,true 表示混淆,false表示不混淆。proguardFiles 用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard-android-optimize.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。需要注意的是,通过Android Studio直接运行项目生成的都是测试版安装文件,关于如何生成正式版安装文件我们将会在以后学习。

    (3)dependencies 闭包,这个闭包的功能非常强大,它可以指定当前项目所有的依赖关系。

    通常Android Studio项目一共有3种依赖方式:本地依赖、库依赖和远程依赖。

    本地依赖可以对本地的Jar包或目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖则可以对jcenter库上的开源项目添加依赖关系。

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.2"
    
        defaultConfig {
            applicationId "com.sdbi.activitytest"
            minSdkVersion 22
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    
        implementation 'androidx.appcompat:appcompat:1.1.0'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    }

     二、Gradle Wrapper

    wrapper的意思是“包装”,这是gradle包装。其实是这样的,因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。

    而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本就会变得麻烦,gradle的引入本来就是想让大家构建项目变得轻松,如果这样的话,

    岂不是又增加了新的麻烦?所以android想到了包装,引入gradle-wrapper,通过读取配置文件中gradle的版本,为每个项目自动的下载和配置gradle,就是这么简单。

    这样我们就不用关心如何去下载gradle,如何去配置进项目来。

    Gradle 会根据build 文件的配置生成不同的task,我们可以直接单独执行每一个task。通过./gradlew tasks列出所有task。

    如果通过同时还想列出每个task 对应依赖的其他task,可以使用./gradlew tasks -all。

    其实每当我们在Android Studio点击 build、rebuild、clean菜单的时候,执行的就是一些gradle task.

    Android tasks

     有四个基本的 task,Android 继承他们分别进行了自己的实现:

    (1)assemble:对所有的 buildType 生成 apk 包。

    (2)clean:移除所有的编译输出文件,比如apk

    (3)check:执行lint检测编译。

    (4)build:同时执行assemble和check命令

    这些都是基本的命令,在实际项目中会根据不同的配置,会对这些task 设置不同的依赖。比如,默认的 assmeble 会依赖 assembleDebug 和assembleRelease,

    如果直接执行assmeble,最后会编译debug,和release 的所有版本出来。如果我们只需要编译debug 版本,我们可以运行assembleDebug。

    除此之外还有一些常用的新增的其他命令,比如 install命令,会将编译后的apk 安装到连接的设备。

    (5)install:将编译后的apk 安装到连接的设备

    (6)uninstall:卸载apk

  • 相关阅读:
    uva 11078
    hdu1520(树状dp)
    从Markov Process到Markov Decision Process
    剑指Offer系列编程题详解全集
    L1正则和L2正则的区别详解
    协方差详解
    牛顿法和梯度下降法的比较
    C++ const各种用法总结
    Exploration and Exploitation
    RL Algorithm Components
  • 原文地址:https://www.cnblogs.com/lihuawei/p/12443819.html
Copyright © 2011-2022 走看看