从头学习Gradle

初识gradle

gradle是什么

我刚开始接触Android的时候,一直以为gradle就是个像maven一样管理依赖的东西。写代码接触的多了才慢慢了解gradle是一个构建Android项目的工具,依赖管理只是他的一个小小的功能。

gradle咋用

在Android Studio里,我们一说要配置什么版本的gradle基本上就是打开File->Project Structure配置Project选项里的Gradle Version 和 Android Plugin Version这两个东西。配好了等着Android Studio自动把东西下载好,就可以编写自己的Android程序了。

或者在gradle-wrapper.properties里配置

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

project build.gradle里配置

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    }
}

怎么要配两个,两个版本还要对应上,版本对应关系还贼乱…真麻烦

gradle不是专门为Android设计的,他能构建任意的java、C++、Python项目。有通用部分,必然需要对应的针对Android的插件。

gradle文件

build.gradle (project)

创建一个Android项目的时候里面就已经写好了3个代码节点(专业点叫闭包)

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

buildscript 用于gradle构建,repositories 使用的一些依赖的maven仓库,一般就写这两个google()和jcenter(),dependencies 使用到的依赖,主要就是gradle的android插件了。


allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

allprojects 是指作用于整个项目的,repositories 我们编码时需要使用到的依赖的maven仓库。想要引入某些github上的第三方项目,它都会让你加一个 maven { url ‘https://jitpack.io’ }。这里加的不需要加到buildscript 的repositories 中,以前我加依赖仓库两个一起加。

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

最后还有一个task,这个task是gradle执行的基础单位,它定义的一个任务我们点build都是在加载、执行一个个的task。
Android Studio 的build窗口
这里定义了一个名字叫clean的task,我们可以在gradle窗口中找到这个task
在这里插入图片描述
在other中找到clean,双击他就能执行这个task
我们在代码中插入一句打印的语句

task clean(type: Delete) {
    delete rootProject.buildDir
    println 'this is cleanTask'
}

双击执行,看到我们打印的一句话
在这里插入图片描述

附:
build的时候有时候会报一堆错,还没有具体提示。这时候我们可以看一下是哪个task出现了问题,比如出了这么个东西,还没有其他提示了。
在这里插入图片描述
他告诉我们task compileAnotherReleaseJavaWithJavac执行失败了。
我们在terminal中输入gradlew compileAnotherReleaseJavaWithJavac -stacktrace
或者加-info就能输出更详细的错误信息

build.gradle (module)

一上来就是一句

apply plugin: 'com.android.application'

看起来是应用了什么插件,有些module应用的插件是

apply plugin: 'com.android.library'

这两个其实就是gradle project中全局配置的那个gradle android插件的一部分

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    }
}

应用插件会在gradle 的config阶段执行,application插件中包含一些build可执行app的逻辑,而library插件中会执行一些build module的逻辑。

接下来就是一个叫android的节点了,它主要作用是配置这个android项目的版本、结构等。

android {
    compileSdkVersion 28
	buildToolsVersion '28.0.0'

    defaultConfig {
        applicationId "com.test.useless"
        minSdkVersion 22
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

compileSdkVersion 常见但是不怎么修改,它主要配置android项目编译sdk版本,这个版本一般是用最高版本。我们平时使用的sdk中的方法大部分都是兼容的,假如使用的方法只有高版本有,android studio会提示你这个方法需要

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.XXX) {
...           
}else{
...
}

如果你想要app兼容更多的设备,就需要对低版本做不同的处理,用不同的逻辑实现高版本sdk的方法。如果不需要低版本设备这部分用户,可以设置minSdkVersion,这个配置不允许app安装在比minSdkVersion更低版本设备上。

targetSdkVersion 这个配置也是比较重要的,以前我都是设置成和compileSdkVersion 版本一样,这样做可能存在问题。这个配置是说app设计时是为哪些版本的android设备提供服务的。比如我设计时是为了从android19 到android 28的用户服务的,于是我设置minSdkVersion为19,targetSdkVersion 为28。经过严格的android版本兼容测试,我保证从19~28 用户的所有逻辑、显示效果等都一致,此时android发布了新版本29,市面上出现了android 29的设备。我们希望以后能给android 29的用户使用新特性,我们升级了compileSdkVersion 到29,使用了一些29中新方法(28以前没有的)。但是我们发现有些方法在28以前和29中表现效果不一样,我们希望这些方法效果和以前一样,设置targetSdkVersion 还是28,app在安装到android 29的设备上时使用的还是28的方法,这样保证29用户与28用户表现是一致的,还能单独为29用户提供新特性带来的用户体验。

versionCode versionName 这两个是控制app版本的,app启动时一般通过这两个属性来判断是否需要更新。

applicationId 配置的是app的安装包名,这个必须要唯一,手机不能安装包名一样的两个app。

buildTypes中配置构建app的设置,一般分为release、debug,这里面可以设置包名后缀、缩减代码(有的叫开启混淆)、签名文件等。

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

applicationIdSuffix 包名后缀可以为app安装后的包名添加一个后缀,配置不同的后缀可以让设备安装多个app。

minifyEnabled 缩减代码 就是把代码的类名、变量等替换为a、b、c、d,这样有效的减少代码文件的大小,并且加大了反编译后代码阅读的难度以防破解。
proguardFiles 配置哪些类名等不替换为a、b、c、d

signingConfig 签名文件,使用这个要在开始配置签名文件的信息。

android {
    signingConfigs {
        release {
            keyAlias 'test'
            keyPassword '123456'
            storeFile file('H:/keystore/test.jks')
            storePassword '123456'
        }
    }
}

配置好后执行gradlew assembleRelease时会生成签名后的apk

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值