Android Gradle (一)

一:简介

Gradle是一款基于Apache Ant和Apache Maven概念的项目开源构建工具,基于Groovy语言来实现,很方便的通过代码达到构建目的,执行Gradle任务的过程,主要是在运行Java/Groovy代码。Gradle构建的大部分功能都是通过插件的方式来实现。

二:Android Gradle

Android Gradle 插件属于第三方插件,它托管在Jcenter上,所以在使用之前需要配置依赖classpath,使用时根据classpath去Jcenter库中去查找对应的版本。

Android Studio中默认会使用 Gradle Wrapper 而不是直接使用Gradle。命令也是使用gradlew而不是gradle。这是因为gradle针对特定的开发环境的构建脚本,新的gradle可能不能兼容旧版的构建环境。为了解决这个问题,使用Gradle Wrapper 来间接使用 gradle。相当于在外边包裹了一个中间层。对开发者来说,直接使用Gradlew 即可,不需要关心 gradle的版本变化。Gradle Wrapper 会负责下载合适的的gradle版本来构建项目。

Gradle基础文件配置

每个gradle都包含以下的基础文件

  • setting.gradle

   定义哪些moudle被加入到编译过程

  • moudle build.gradle

    定义每个moudle的配置信息

  • project build.gradle

    项目的build.gradle文件中的配置应用于所有moudle,全局属性

   
 buildscript:定义了Android编译工具的类路径,repositories中是引用的仓库;dependencies中配置gradle的编译工具

 allprojects:定义的属性应用到所有的moudle中

Gradle中的属性及含义

1:apply plugin:位于第一行代码,应用了Android程序的gradle插件,提供Android的编译、打包等task

2:android  android的所有配置,由声明的plugin提供

  •  defaultConfig   程序的默认配置,如果与清单文件定义的属性相同,会以这里的为主

1》testApplicationId

用于配置测试App的包名,默认情况下是applicationId+".test"

2》applicationId  当前程序的ID,修改后生成资源文件的包名不变;清单文件中的会同时修改资源类的包名

3》minSdkVersion / targetSdkVersion  sdk最低版本/sdk最高版本

  • buildTypes  定义编译apk的类型,根据不同的配置

构建应用类型debug 、release,两种模式区别在于能否在设备上调试以及签名不一样,其他代码和文件资源都是一样的

属性:

1》applicationIdSuffix 

是它的一个属性,用于配置基于默认applicationId的后缀,比如applicationId = com.example.test  此属性的值指定为.debug后,最后生成的debug apk包名为
com.example.test.debug

2》debuggable

用于配置是否生成一个可供调试的apk,值为true/false

3》jniDebuggable

用于配置是否生成一个可供调试c代码的apk,值为true/false

4》minifyEnabled

是否启用混淆

5》multiDexEnabled

是否启用自动拆分多个Dex的功能,超过65535个方法后

6》proguardFiles  

配置混淆使用的配置文件

7》shrinkResources

用于配置是否自动清理未使用的资源,true/false

如果有反射引用的情况会识别不到,需要使用Keep方法来配置不被清理的资源,文件目录需在res/raw/keep.xml,例如:

<?xml version="1.0" encoding="utf-8"?>

<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/img*_a">

keep.xml中还有一个属性:tools:shrinkMode配置自动清理模式,默认是safe是安全的,如果改为strict则无法识别以下代码:

getResources().getIdentifier("unused","drawable",getPackageName());

8》signingConfig 签名配置

引用signingConfigs.release/signingConfigs.debug

9》manifestPlaceholders  清单文件占位符

10》versionNameSuffix  版本名称后缀

11》zipAlignEnabled  优化apk文件,提高系统和应用的运行效率,快速读写apk中的资源,降低内存使用

  • signingConfigs

配置默认的签名信息,对生成的App签名,分为debug、release版本,在buildTypes中进行引用  signingConfig signingConfigs.debug/signingConfigs.release

默认情况下Android Sdk 自动生成debug证书,名为debug.keystore key/pwd=android  ,证书目录在.android/debug.keystore下

release版本需要自己配置如下信息:

storeFile =签名证书文件 格式: storeFile file("xxx/xx.jks")

storePassword = 签名证书文件的密码

keyAlias = 签名证书密钥别名

storeType = 签名证书的类型

  • productFlavors  定义渠道

productFlavors{

kuan{

   //定义特性

resValue "string","app_label","kuan_app"

buildConfigField "String", "SERVER_URL", "\"http://www.kuan.com\""

}

baidu{

 //定义特性

resValue "string","app_label","baidu_app"

buildConfigField "String", "SERVER_URL", "\"http://www.baidu.com\""

}

}

1》 resValue 

动态添加自定义资源,与在xml文件中定义是一样的,参数1 = 资源类型,参数2 = 资源id , 参数3 = value值,定义完成

会生成如下文件,引用方法 android:text = "@string/app_label" 或 getResources().getString(R.string.app_label):

定义完成后在打包时可以进行选择渠道:


2》 buildConfigField

动态添加BuildConfig中的属性

3》 manifestPlaceholders  清单文件占位符

build.gradle文件中字符映射到AndroidManifest.xml清单文件的指定位置,这里用应用程序名称来举例,把渠道类型做为应用程

序的名称

  • lintOptions   lint检测,检测未通过会终止构建

lintOptions{

abortOnError false  发现错误时是否终止构建

check "NewApi" 检测指定的id,多个id间用 “,”隔开

htmlOutput file("lint_check.html")  写入报告的路径,默认为构建目录下的lint_results.html

.............

}

  • applicationVariants 打包命名

结合productFlavors 中的配置进行编译

3.0版本前 编译报错:

Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated 
applicationVariants.all{
       variant -> variant.outputs.each{
            output ->
                def apkName = "appName_${variant.flavorName}_${buildType.name}_v${variant.versionName}_${buildTime()}.apk"
                output.outputFile = new File(output.outputFile.parent,apkName)
        }
}

修改后:

defaultConfig{
 ... 
flavorDimensions "2" 
}

applicationVariants.all{

    variant -> variant.outputs.all{
        output ->
            def apkName = "appName_${variant.flavorName}_${buildType.name}_v${variant.versionName}_${buildTime()}.apk"
            outputFileName = apkName
    }
}

编译成功后会在build/../output/下根据渠道名称生成相应apk文件:

如果defaultConfig中不加flavorDimensions,编译会报错( All flavors must now belong to a named flavor dimension. )

3:dependencies 

gradle依赖配置,定义当前项目需要依赖的其他库

 

自定义task任务

闭包是Groovy的特性,指的就是一段代码块,更加灵活、轻量、可复用,“<<” 等同于doLast

  • 输出内容

第一种写法:

task helloWorld{

        doLast{         

              println "hello world"

        }

      或者

           println "hello world"

}

第二种写法:

tasks.create("helloWorld"){

            println "hello world"

}

第三种写法:

def Task ex41 = task(ex41)
ex41.doLast {
    println "创建方法原型为:Task task(String name) throws InvalidUserDataException"
}

将构建的任务归类到Build tasks分类中:

def Task mTask = task exGroup

mTask.group = BasePlugin.BUILD_GROUP

mTask.description = "构建的任务归类到Build tasks中"

mTask.doLast{

     println "group:${group},description:${description}"

}

通过gradlew tasks查看任务信息,可以看到该任务已归类到Build tasks分类中:

自定义成功后build文件,将会在右侧gradle的任务列表中生成一个新的任务,可以用命令或直接双击执行,两种写法都可以正常输出

运行的时候如果不加doFirst 、doLast会按顺序执行任务,如果加上会按先后顺序执行任务,起到控制输出的作用

任务的属性

1:enabled   任务的启用 / 禁用

2:onlyIf   任务的断言,是一个条件表达式

3:doFirst  任务执行前

4:doSelf   任务自身执行 

5:doLast   任务执行之后

6:shouldRunAfter()

taskA.shouldRunAfter(taskB) -- taskA应该在taskB执行之后执行,这里是应该不是必须,所以可能顺序会与预设的不一样

7:mustRunAfter()

taskA.mustRunAfter(taskB) -- taskA必须在taskB执行之后执行

Gradle命令

在Android Studio中使用Terminal直接输入gradlew命令执行构建任务

1:gradlew tasks 查看所有的task

Android tasks

Build tasks

Build Setup tasks

Help tasks

Install tasks

Verification tasks

2:gradlew -q 自定义任务名称(gradlew -q hello)

3:gradlew -v 查看Gradle版本、jvm等相关信息

4:gradlew wrapper 生成wrapper所需的目录文件,根据gradle-wrapper.properties中的配置

Wrapper在win下是一个批处理脚本,使用Wrapper启动Gradle时会检查有没有下载关联Gradle,没有则会从配置的地址去下载构建

5:gradlew --refresh-dependencies assemble  强制刷新Maven依赖

6:gradlew clean hello 多任务调用,中间用空格隔开(先clean 再执行自定义的任务hello)

7:gradlew hW   通过任务名字的缩写执行  ,遵循驼峰命名法

8:gradlew assemble  编译release和debug版的apk,也可以单独指定编译版本assembleDebug/assembleRelease,生成的

release为未签名的apk,导致安装不成功;要生成带签名的release.apk,需要配置signingConfigs并在buildTypes - release中引用signingConfig signingConfigs.release

如下:

signingConfigs{
    release{
        storeFile file("xx/xx/xx.jks")   //签名文件
        storePassword "111"    //签名文件密码
        keyAlias "ttest"   //别名
        keyPassword "111"  //密码
    }
}
buildTypes {
    release {
        minifyEnabled false
        debuggable true   //release版本时输出日志
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release  引用签名
    }
}

这样可以生成带签名的release.apk,可正常安装

 9:gradlew installDebug/uninstallDebug/uninstallAll 安装debug.apk / 卸载debug.apk /卸载所有apk

10:adb install -r apk路径   替换安装release.apk

11:gradlew build  构建项目

12:gradlew  check 执行lint检测

13:gradlew androidDependencies 打印Android的依赖

14:gradlew connectedCheck  安装单元测试包

15:gradlew compileDebugSources --stacktrace -info  查看栈信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值