博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gradle for Android(七)——一些使用技巧
阅读量:2084 次
发布时间:2019-04-29

本文共 4308 字,大约阅读时间需要 14 分钟。

前面章节已经详细分析了Gradle的配置和使用,现在来总结一点小技巧。

编译缓慢解决方法

(1) 确定根目录下的build.gradle中Android Gradle Plugin版本是否与本地插件版本一直,若不一直修改为本地插件版本

(2) 确定gradle/wrapper/gradle-wrapper.properties文件中gradle的版本在C:\Users\用户名.gradle\wrapper\dists是否已经离线存在

(3) 分别查看各个module中的build.gradle里面compileSdkVersion、buildToolsVersion、com.android.support等Android SDK的相应版本是否已经存在。

(4) 如果存在其他第三方库,若能提前下载完成最好。已经下载完成的库存放在C:\Users\用户名.gradle\caches\modules-2\files-2.1里面

以fresco为例,如果你之前在其他电脑上找到相应完整的目录,请拷贝到其中,以节省下载所需时间

(5) 明确依赖版本号。

基础配置

设置全局编译器的版本

在使用retrolambda的时候有过对java编译器的配置

如果仅需某一个module单独支持,只要在相应module的build.gradle下进行配置即可

compileOptions {    sourceCompatibility JavaVersion.VERSION_1_8    targetCompatibility JavaVersion.VERSION_1_8}

如果你希望全局配置,则需要配置根目录下的build.gradle,在其allprojects中进行配置即可

allprojects {    repositories {        jcenter()    }    tasks.withType(JavaCompile) {        sourceCompatibility = JavaVersion.VERSION_1_8        targetCompatibility = JavaVersion.VERSION_1_8    }}

注意设置java1.8版本需要开启jack编译,否则会抛出Error:Jack is required to support java 8 language features

defaultConfig {    ...    jackOptions {        enabled true    }}

对layout进行模块化分包

一般情况下我们app的布局文件会随着项目的开发而发生爆炸式的增长。时间久了就会忘记某个功能用的都是哪些布局文件了。今儿就来向大家介绍如何对layout进行模块化分包。

首先来看看效果:

这里写图片描述
main模块与main2模块他们的布局是相互独立保存的,没有堆叠在一起。那么这个是怎么做到的呢?之前大家从eclipse直接转项目到Android Studio上的时候,不知道有没有注意到在app模块下的build.gradle有一个DSL叫sourceSets,通过修改sourceSets中的属性,可以指定哪些源文件(或文件夹下的源文件)要被编译,哪些源文件要被排除。Gradle就是通过它实现项目的布局定义。Android Studio插件默认实现了两个sourceSet:main和test。每个sourceSet都提供了一系列的属性,通过修改这些属性,可以定义该sourceSet所包含的源文件,比如java.srcDirs,res.srcDirs

sourceSets {   main {      java      res   }   test {      java      res   }}

1、按照自己的项目需求建立layout目录,例如本文就是/alllayouts/main/layout与/alllayouts/main2/layout

2、在module对应的build.gradle下添加sourceSets配置

sourceSets {    main {        res.srcDirs = [                'src/main/res/alllayouts/main',                'src/main/res/alllayouts/main2',                'src/main/res'        ]    }}

注意:最后一行要添加

3、Sync Now

大量引用库处理

一旦引用库数量变多,这样或许就不够直观了。这种情况下,我们最好有一个单独的文件去统计这些配置。

我们新建一个config.gradle作为配置文件
这里写图片描述
具体配置如下

ext {    androidGradleVersion = '2.3.1'    AndroidSupportVersion = '25.3.1'    AndroidConstraintLayoutVerson = '1.0.2'    compileSdkVersion = 25    buildToolsVersion = '25.0.2'    defaultConfig = [            applicationId : "com.renyu.gradledemo",            minSdkVersion : 15,            targetSdkVersion : 25,            versionCode : 1,            versionName : "1.0"    ]}

其中defaultConfig是一个map键值对,有别于上方的公共配置,这样看起来更清晰简洁

这里我们需要使用apply from来引用config.gradle。同理当你的gradle脚本太大的时候,你可以按照具体任务类型将一个大gradle脚本拆分成几个子脚本,然后分别apply from引入到主脚本中。

// 这里的apply是为了让子模块使用apply from: "config.gradle"buildscript {    repositories {        jcenter()    }    dependencies {        // root下build.gradle使用        apply from: "config.gradle"        classpath "com.android.tools.build:gradle:$androidGradleVersion"        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}allprojects {    repositories {        jcenter()    }}task clean(type: Delete) {    delete rootProject.buildDir}

再看看app模块下的build.gradle的配置

apply plugin: 'com.android.application'android {    compileSdkVersion rootProject.ext.compileSdkVersion    buildToolsVersion rootProject.ext.buildToolsVersion    defaultConfig {        applicationId rootProject.ext.defaultConfig.applicationId        minSdkVersion rootProject.ext.defaultConfig.minSdkVersion        targetSdkVersion rootProject.ext.defaultConfig.targetSdkVersion        versionCode rootProject.ext.defaultConfig.versionCode        versionName rootProject.ext.defaultConfig.versionName        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'    })    compile "com.android.support:appcompat-v7:$rootProject.ext.AndroidSupportVersion"    compile "com.android.support.constraint:constraint-layout:$rootProject.ext.AndroidConstraintLayoutVerson"    testCompile 'junit:junit:4.12'}
你可能感兴趣的文章
网络通信框架——Netty示例
查看>>
网络通信框架——KyroNet示例
查看>>
JVM对synchronized的优化——锁膨胀
查看>>
MySQL中的索引 B+Tree
查看>>
字符编码与解码(附:Java字符流与字节流源码剖析)
查看>>
Spark优化总结(一)——数据倾斜
查看>>
Spark代码可读性与性能优化——示例九(数据传输与解析)
查看>>
Spark代码可读性与性能优化——示例十(项目结构)
查看>>
Spark优化总结(二)——代码编写
查看>>
Spark优化总结(三)——调参
查看>>
消息队列——RocketMQ示例
查看>>
Spark优化总结(四)——业务与架构设计
查看>>
volatile在JVM内存交互中的操作
查看>>
实现一个具有Stream的链式、惰性特点的容器
查看>>
Spark源码编译
查看>>
分布式一致性算法(Paxos、Raft、ZAB)
查看>>
MPC多方安全计算——比较算法示意
查看>>
Akka事件驱动——模拟Spark注册、心跳
查看>>
Flink示例——Source
查看>>
Flink示例——Sink
查看>>