ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android Gradle相关

2022-07-24 01:33:52  阅读:580  来源: 互联网

标签:Plugin 版本号 gradle 相关 Android Gradle 加载


Gradle

它是一个通用的构建工具,运行在JVM上,其内部核心模型是由各个TASK组成的有向无环图

通俗一些:我就是一个框架,你们大家可以借助创建Plugin来告诉我具体的编译任务。Android Gradle Plugin就是其中一个典型的例子

1. Android Gradle Plugin

简称AGP,由Android Google团队开发和维护,借助实现一个Gradle-Plugin的方式,来完成将Android项目的源码编译成APK

2. Gradle的生命周期

可以分为三个阶段,初始化,配置,任务执行

也可以分为五个阶段,具体见源码Stage

private enum Stage {
    LoadSettings, Configure, TaskGraph, RunTasks, Finished;
}

关于各个阶段干了什么事情,

  • 可以在网上搜索一些文章,总结的比较详细;
  • 也可以借助org.gradle.api.invocation.Gradle#addBuildListener,在各个阶段增加日志输出,再结合--info,也比较容易推断出各阶段的工作内容;这个代码最好放在$user/.gradle/init.gradle中,因为初始化的起点是这里

3. Gradle Wrapper

这个是每个Gradle项目都包涵的,我理解它是一个包装器。

我们在运行Gradle的时候是需要下载对应的Gradle压缩包的,体积较大约100M+。

借助wrapper,我们只需要告知version和url等信息,就可以在第一次运行的时候自信下载对应版本的gradle包

4. 关于Gradle Properties

定义参数用的。

相关Properties文件:

  • $user/.gradle/gradle.properties   作用域全部项目,自动加载
  • project/gradle.propertie  作用域当前项目,自动加载
  • project/local.properties  需要额外开发代码加载,通常由Android Studio创建,不进入git管理
  • 命令中加参数 - P   作用域当前项目,自动加载

5. 依赖库的版本号

gradle项目中支持依赖第三方库,很容易出现不同的组件依赖了一个组件的不同版本号

它在编译过程中,获取调整依赖的版本号。选择的策略是版本号最大的优先,除非项目中添加了一些force的策略

默认情况下,it will select the highest one

一些小技巧

1. 如何禁用Transform

Transform,是AGP提供的一种可以修改编译数据(class文件、Jar包)的方式,它会被转化成对应的TASK。

而每个TASK都会有独立的输入目录和输出目录,即使你不做任何修改,也会导致编译数据拷贝一份。

在编译速度优化中这个是重要的优化点。

在无法避免apply的情况下,如何禁用呢? 具体策略是通过反射修改BaseExtension内部变量_transforms,

_transforms,它是一个集合,其内部保存了当前Project在初始化过程中加载的所有Transform。将目标从集合中移除即可

代码示例 实践可用

2. 动态修改Properties参数

这个值,已经在project/gradle.properties中存在了,但是你想要在某种变体中修改它。

关键的地方是在什么时机修改它和如何修改它

// 根目录下的build.gradle中添加
allprojects {
    ext["Resources222"] = true
}

这其中涉及到的具体原因的话,其实是需要梳理一下properties文件是在什么时候加载的?加载之后如何获取到?

我这边之前是在跟踪android.precompileDependenciesResources参数来逐步跟进的,踩了很多坑

 

标签:Plugin,版本号,gradle,相关,Android,Gradle,加载
来源: https://www.cnblogs.com/zhou-guobao/p/android-gradle-note.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有