当前位置: 首页 > 科技观察

你应该知道的7个Gradle实用技巧

时间:2023-03-17 15:53:46 科技观察

前言Gradle在Android开发中应用广泛,但相信很多同学对gradle并不是很了解。本文主要介绍一些使用gradle的实用技巧,帮助读者提高熟悉度陌生人的理解主要包括以下内容Gradle依赖树查询使用周期优化Gradle依赖管理支持代码提示Gradle依赖管理Gradle模块化库模块Gradle代码复用资源文件分包AAR依赖和源码依赖快速切换1.Gradle依赖树查询有时候我们在分析依赖冲突的时候,需要查看依赖树。我们常用的查看依赖树的命令是gradlewapp:dependencies。不过这种查看依赖树的命令行方式信息量太大,阅读起来有点吃力,所以官方发布了TheScan工具来帮助我们更方便的查看依赖树。只需在项目根目录下运行gradlebuild\--scan,即可生成HTML格式的分析文件。分析文件会直接上传到Scan官网,命令行最后会给出远程地址。第一次运行将允许您在Scan的官方网站上注册。确认邮件后,可以看到扫描工具是按照依赖变种分类的。debugCompileClassPath是dedug包中的依赖包。使用这种方式分析依赖树更加方便简洁2.使用循环优化Gradle依赖管理如下图,我们经常使用ext来管理依赖dependencies{implementationfileTree(include:['*.jar'],dir:'libs')implementationrootProject.ext.dependencies["appcompat-v7"]implementationrootProject.ext.dependencies["cardview-v7"]implementationrootProject.ext.dependencies["design"]implementationrootProject.ext.dependencies["constraint-layout"]annotationProcessorrootProject.ext.dependencies["glide_compiler"]...}这种方式虽然实现了依赖的统一管理,但是随着项目越来越大,依赖会越来越多,往往有几十行甚至上百行。build.gradle越来越长。有什么好的方法可以不在build.gradle中写那么多依赖配置?是的,就是要使用循环遍历依赖示例如下,首先添加config.gradleext{dependencies=[//base"appcompat-v7":"com.android.support:appcompat-v7:${version["supportLibraryVersion"]}",...]annotationProcessor=["glide_compiler":"com.github.bumptech.glide:compiler:${version["glideVersion"]}",...]apiFileDependencies=["launchstarter":"libs/launchstarter-release-1.0.0.aar"]debugImplementationDependencies=["MethodTraceMan":"com.github.zhengcx:MethodTraceMan:1.0.7"]...implementationExcludes=["com.android.support.test.espresso:espresso-idling-resource:3.0.2":['com.android.support':'support-annotations']]...}然后在build.gradle中配置如下:applyfromconfig.gradle...demplementationDependencies=project.ext.dependenciesdefprocessors=project.ext.annotationProcessodefimplementationExcludes=project.ext.implementationExcludesdependencies{//处理所有的xxximplementation依赖implementationDependencies.each{k,v->implementationv}//处理annotationProcessor依赖processors.each{k,v->annotationProcessorv}//处理所有依赖包括excludeimplementationExcludes.each{entry->implementation(entry.key){entry.value.each{childEntry->exclude(group:childEntry)}}}...}这样做的好处是1.后续添加依赖不需要更改build.gradle,直接在config.gradle中添加即可2.精简build.gradle的长度3、支持代码提示的Gradle依赖管理上面介绍了通过config.gradle管理依赖的方法。当我们添加Gradle依赖时,仍然存在一些痛点。1.不支持代码提示。2.不支持点击跳转。3、开发多个模块时,不同模块的相同依赖需要复制粘贴。使用buildSrc+kotlin可以解决这个问题。效果如下:由于buildSrc是全局所有模块的配置,所以可以直接在所有模块中使用。这里就不多介绍了。buildSrc的详细开发和介绍过程可以看:【译文】Kotlin+buildSrc:更好的管理Gadle依赖效果两种实现最终的效果几乎是一样的。详细实现可以看:【绝活淫技】除了buildSrc,能否统一配置依赖版本?使用includeBuild4.Gradle进行模块化我们在开发和引入一些插件的时候,有时候需要在build.gradle中引入一些配置,比如greendao,push,tinker等,其实都可以封装在对应的gradle文件中,然后通过applyfrom比如我们在使用greendao数据库的时候,需要在build.gradle中指定版本。在这种情况下,我们应该新建一个greendao-config.gradleapplyplugin:'org.greenrobot.greendao'//greenDao指定版本和道路强度等greendao{//databasesc盒马版本也可以理解为数据库版本号schemaVersion1//设置DaoMaster、DaoSession、Dao包名,即要放置包的完整路径daoPackage'com.example.ausu.big_progect.dao'//设置DaoMaster、DaoSession、Dao目录targetGenDir'src/main/java'}然后在build.gradle中引入applyfrom'greendao-config.gradle'。这样做主要有两个好处:1.单一职责原则将greendao的相关配置封装在一个文件中,不会和其他文件混淆2.简化了build.gradle的代码,build.gradle的代码做修改数据库时不需要修改。5.Library模块的Gradle代码复用随着我们的项目越来越大,正在构建的LibraryModule越来越多。每个Module都有自己的build.gradle,但其实每个build.gradle的内容都是差不多的。能不能把重复的部分封装起来复用?我们可以做一个基础的抽取,把常用的参数/信息也抽取到basic.gradle中,每个模块应用,这样可以减少很多代码。applyplugin:'com.android.library'applyplugin:'kotlin-android'applyplugin:'kotlin-android-extensions'applyplugin:'kotlin-kapt'android{//指定用于编译项目的API级别compileSdkVersionVersions.compileSDK//生成工程时指定要使用的SDK工具的版本,AndroidStudio3.0之后就不需要手动配置了。buildToolsVersionVersions.buildTools//指定适用于所有build版本的Android插件version属性的默认值defaultConfig{minSdkVersionVersions.minSDKtargetSdkVersionVersions.targetSDKversionCode1versionName"1.0"}//配置Java编译(编码格式、编译级别、生成的字节码版本)compileOptions{encoding='utf-8'sourceCompatibilityJavaVersion.VERSION_1_8targetCompatibilityJavaVersion.VERSION_1_8}kotlinOptions{jvmTarget=JavaVersion.VERSION_1_8.toString()}lintOptions{//lint异常后继续执行abortOnErrorfalse}}dependencies{de:lib,dircationinc'Tree(''*.jar'])...}然后在对应模块的build.gradle中导入applyfrom:"../basic.gradle"dependencies{apiDeps.constraintLayoutapiDeps.retrofit}这样是不是简单多了?读者可以根据项目实际情况判断是否适合提取basic.gradle。它可以达到数百甚至数千。能不能像代码一样把资源文件分包?答案是肯定的,主要是利用gradle的sourceSets属性,我们可以像代码一样按业务分包资源文件,具体操作如下1.新建res_xxx目录,新建res_core,res_feed(根据业务命名module)和主目录下的其他目录。在res_core中的res目录下创建相同的文件夹,如:layout、drawable-xxhdpi、values等。2.在gradleandroid中配置res_xx目录{//...sourceSets{main{res.srcDirs('src/main/res','src/main/res_core','src/main/res_feed',)}}}以上就完成了资源文件的分包。这样做有几个好处。1、按业务分包查询方便,结构清晰。2、多人修改strings.xml等key-value文件,减少冲突。3.在删除模块或者做组件改造的时候,可以方便的删除或者迁移资源文件。您不必像以前那样一个一个地寻找它们。AAR,然后在项目中直接依赖AAR,但是有时候我们需要修改AAR,需要依赖源码,所以我们需要一种方式来快速切换依赖AAR和依赖源码。让我们以改造为例。我们要修改改造的源代码。修改步骤如下:1、首先下载retrofit,可以放在与项目同级的目录下,修改目录名为retrofit-source,以便区分。2.在settings.gradle文件中添加需要修改的aar库project的源码include':retrofit-source'project(':retrofit-source').projectDir=newFile("../retrofit-source")3.将aar替换为源代码build.gradle(android)脚本并添加替换Strategyallprojects{repositories{...}configurations.all{resolutionStrategy{dependencySubstitution{substitutemodule("com.squareup.retrofit2:retrofit")withproject(':retofit-source')}}}}如上几步,可以更方便这样做的主要好处是:1.不需要修改原来的依赖配置,而是通过global把aar替换成本地源码配置,侵入性较小。2.如果有多个Module依赖同一个aar,不需要重复修改,根目录下的build.grad即可修改一个summaryinle本文主要介绍几个实用的Gradle技巧。如果觉得有帮助,可以帮忙点个赞。如果大家发现本文有什么不足之处,欢迎在评论区指出哦~