Android开发效率提升十倍的利器-Gradle

news/2024/5/20 1:15:51 标签: Android, Gradle

文章目录


Android开发效率提升十倍的利器-Gradle

Gradle_3">1 Gradle介绍

1 语言和作用

Gradle是一种自动化构建语言,是一种DSL(Domain Specific language),目前是Android的默认构建工具,还一个编程框架。
在这里插入图片描述

Gradle特性
语言:Groovy,先将其编译成java类字节码,然后通过JVM来执行这个java类。

支持环境Android Studio和命令行,命令行方便调试
构建粒度支持多个project、多个版本、多个构建类型
可扩展性有丰富的API和插件架构
其他构建工具Ant(销声匿迹)、Maven(日薄西山)等。

Gradle_18">2 Gradle的作用

在这里插入图片描述

https://fir.im/gradle
理解-解决-应用-分享

AndroidGradle_24">3 怎么理解Android工程的Gradle代码

Gradle的重要概念
在这里插入图片描述
gradlew :linux 、 mac
gradlew.bat :windows

Gradle_Wrapper_30">3.1 Gradle Wrapper

一个gradle的封装体。有了gradle wrapper,即便你的机器上没有安装gradle,也可以执行gradle的构建工作。
在这里插入图片描述

F:\Demo2\ZuJianHua\MyButterKnife\gradle\wrapper

gradle-wrapper.jar
gradle-wrapper.properties

将gradle-wrapper.jar转成gradle-wrapper.zip 并解压缩。
在这里插入图片描述
在这里插入图片描述

3.2 闭包(Closure)

Groovy中的闭包是一个开放、匿名的代码块,可以接收参数,返回值并赋值给变量。
在这里插入图片描述
在这里插入图片描述
Groovy表达式省略括号的规范

  1. 所有顶级表达式的括号可以省略。
  2. 当背包是一个顶级表达式的最后一个参数时,可以省略括号。
  3. 但是函数嵌套调用已经函数没有参数时不能省略。
    在这里插入图片描述
    在这里插入图片描述
    ./gradlew projects

在这里插入图片描述

AndroidGradle_Project_56">3.3 Android工程和Gradle Project

Gradle为每个build.gradle都会创建一个相应的Project领域对象,在编写Gradle脚本时,我们实际上都在操作诸如Project这样的Gradle领域对象。
在这里插入图片描述

在rootProject下

buildscript {//配置插件用的
    repositories {//仓库
        google()//到google中去下载
        jcenter()//到jcenter中去下载
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'//google提供的插件
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

buildscript:来配置这个工程构建打包过程中需要哪些插件以及去哪里下载这些插件。
dsl:语言规范

allprojects {//配置Module用的
    repositories {//仓库
        google()
        jcenter()
    }
}

仓库:就是放编译好的代码的地方,或者存储jar包的地方(还有aar)。因为代码要基于第三方或者其他团队的的代码 来开放我们的代码,把代码放在仓库中分享给别人用。

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

清除buildDir

在settings.gradle:在初始化时候用,在Gradle构建的阶段,第一步执行的代码。

include ':app', ':butterknife_annotations', ':butterknife_compiler'

app的build.gradle:

//插件引入进来,都在'com.android.tools.build:gradle:3.2.0'这个插件提供的
apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {//闭包,方法调用
        applicationId "com.hongx.mybutterknife"
        minSdkVersion 17
        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'
        }
    }
}

dependencies {//依赖
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

implementation
compile = api

gradle = class
api = public
implementation = private 依赖自己用,提高编译速度

Gradle_145">4 Gradle打包慢怎么办

解决方案:
1、gradle下载慢?

gradle-wrapper.properties中

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

all改成bin

还有

C:\Users\hongx\.gradle\wrapper\dists\gradle-4.6-all\bcst21l2brirad8k2ben1letg

下载相应gradle并放入文件夹下
在这里插入图片描述
2、依赖包下载慢?
设置代理

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    
    repositories {
    	//放在第一个,会先去找,找不到到下一个仓库找。
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
        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
    }
}

allprojects {
    repositories {
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
        google()
        jcenter()
    }
}

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

阿里云仓库地址:
https://maven.aliyun.com/mvn/view

在这里插入图片描述

3、每次编译都很慢?
不要使用带+号的依赖,编译慢了,可靠性降低,容易出bug。

4、终极解决方案是什么?
自己搭建nexus。

5、碰到问题怎么办?
使用命令行来进行编译,编译有问题,会有详细的日志出来。
./gradlew assembleDebug
./gradlew assembleDebug --info 很详细的日志出来
./gradlew assembleDebug --debug 日志还不够

GradleAPKFIR_227">5 Gradle自动上传APK到FIR并发消息到钉钉插件

Gradle_228">5.1 Gradle的工作流程

之前都是静态的概念project、warpper、Closure,编程需要动态过程。
动态过程:
1、初始化
2、配置
3、执行
每个阶段都可以插入钩子Hook,就是自己的代码
在这里插入图片描述

  1. 初始化阶段,对multi-project build而言就是执行settings.gradle
  2. initilization phase的下个阶段是Configuration阶段。
  3. Configuration阶段的目标是解析每个project中的build.gradle。比如multi-project build例子中,解析每个子目录中的build.gradle。在这两个阶段之间,我们可以加一些定制化的Hook。这当然是通过API来添加的。
  4. Configuration阶段完后,整个build的project以及内部的Task关系就确定了。Configuration会建立一个有向图来描述task之间的依赖关系。所以,可以添加一个Hook,即当task关系图建立好之后,执行一些操作。
  5. 最后一个阶段就是执行任务了,当然,任务执行完后,我们还可以加Hook。

Gradle_tasks_243">5.2 Gradle tasks

一个Project由一个或者多个task组成,它是构建过程中的原子任务,可以使编译class、上传jar包等。
configuration阶段-任务执行前的操作-执行阶段-任务执行后的操作

参数含义默认值
name
type

查看task:
在这里插入图片描述
或者命令行使用gradlew tasks
输出如下:
在这里插入图片描述

Gradle__256">5.3 Gradle 插件

深入理解Gradle的作用

  1. 解决自己的问题;
  2. 帮助其他同事,树立自己在团队中的良好形象;
  3. 优化开发流程;
  4. 分享自己的插件到互联网,提升自己的专业说服力;

Gradle_Plugin_Protal_265">5.4 分享到Gradle Plugin Protal

安装java和gradle
安装ideaintellj community


http://www.niftyadmin.cn/n/1838865.html

相关文章

三年来最开心的一天!

今天又和她见面了,大家心情都很平静,相处得很开心,她很信任我,什么都告诉我,跟她一起,真的很舒服,虽然有点紧张,在她身边的时候,真的觉得她很温柔,也很柔弱&a…

dvbbs7.1sp1最新漏洞的研究和利用

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份…

Android 自定义注解处理器详解

文章目录AbstractProcessor方法详细信息ProcessingEnvironment方法详细信息1 新建 Java Library1.1 新建1.2 确定依赖关系2 创建自定义注解2.1 添加注解:Route2.2 添加注解 :Extra2.3 使用注解3 注解处理器3.1 新建RouteProcessor3.2 注册注解处理器3.3 …

激光雷达的应用难点与技术突破,思岚是这样做的

得益于激光雷达技术的进步,激光雷达的测量半径、测距频率、距离分辨率及角度分辨率都有了很大的提升,可以帮助各类应用获取更大场景、更丰富的轮廓信息。在机器人自主定位导航、空间环境测绘以及安保安防等诸多领域,发挥着不可或缺的重要作用…

ACT的郁闷错误

遇到一个郁闷的错误。刚完成Upload组件的第二个版本,正准备测试一下,于是开启ACT进行了几分钟的小测试。还好没出什么错误。于是继续增加测试的文件,结果中途准备取消测试,于是点了“取消”。没想到录制页面的对话框死掉了。也没管…

Android反射1-基本反射技术

文章目录1 根据一个字符串得到一个类1.1 getClass1.2 Class.forName1.3 class属性1.4 TYPE属性2 获取类的成员2.1 类的构造函数2.1.1 获取类的所有构造函数。2.1.2 获取类的公共构造函数。2.1.3 获取类的某个构造函数2.1.4 调用构造函数2.2 获取类的私有实例方法并调用它2.3 获…

Java论坛系统 JForum

JForum 是采用Java开发的功能强大且稳定的论坛系统。它提供了抽象的接口、高效的论坛引擎以及易于使用的管理界面,同时具有完全的权限控制、多语言支持(包括中文)、高性能、可自定义的用户接口、安全、支持多数据库等等特性。 JForum 采用 Fr…

昨天完成了从平文件转换为XML文件的通用程序

方法参考了XSLT技术,与我以前完成了XML文件转其它文件的程序写法,通过一个中间文件(XML)来定义平文件的各种字段及长度,并且这个中间文件的结构与目标XML文件类似.期间遇到了一个"截取指定长度的中文字符串"的问题,后来虽然不知就里,但总算解决了."截取指定长度…