【安卓笔记】gradle入门

随着Android Studio越来越完善,更多的开发者舍弃掉Eclipse。但是新的IDE与以往的Eclipse有很大区别,这导致部分开发者望而却步,其中一个大家觉得比较麻烦的是Android Studio采用的新的构建系统,gradle。那么这篇文章我将对gradle进行一个简单介绍(主要讲gradle配合Android Studio的使用),希望帮助大家熟悉gradle。

一. gradle是什么?

gradle跟ant/maven一样,是一种依赖管理/自动化构建工具。但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁、灵活,更加强大的是,gradle完全兼容maven和ivy。更多详细介绍可以看它的官网:http://www.gradle.org/

二.为什么使用gradle?

更容易重用资源和代码;
可以更容易创建不同的版本的程序,多个类型的apk包;
更容易配置,扩展;
更好的IDE集成;

三.gradle入门需知

 1.基本配置:

首先明确gradle跟maven一样,也有一个配置文件,maven里面是叫pom.xml,而在gradle中是叫build.gradle。Android Studio中的android项目通常至少包含两个build.gradle文件,一个是project范围的,另一个是module范围的,由于一个project可以有多个module,所以每个module下都会对应一个build.gradle。这么说有点抽象,看下面这个图:

这是一个android工程的project视图,上面那个是module下的build.gradle文件。下面那个是project下的build.gradle文件。这两个文件是有区别的,project下的build.gradle是基于整个project的配置,而module下的build.gradle是每个模块自己的配置。下面看下这两个build.gradle里面的内容:

project#build.gradle:

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

buildscript {
//构建过程依赖的仓库
    repositories {
        jcenter()
    }
//构建过程需要依赖的库
    dependencies {//下面声明的是gradle插件的版本
        classpath ‘com.android.tools.build:gradle:1.1.0‘
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
//这里面配置整个项目依赖的仓库,这样每个module就不用配置仓库了
allprojects {
    repositories {
        jcenter()
    }
}

注:大家可能很奇怪,为什么仓库repositories需要声明两次,这其实是由于它们作用不同,buildscript中的仓库是gradle脚本自身需要的资源,而allprojects下的仓库是项目所有模块需要的资源。所以大家千万不要配错了。

module#build.gradle:

//声明插件,这是一个android程序,如果是android库,应该是com.android.library
apply plugin: ‘com.android.application‘
android {//安卓构建过程需要配置的参数
    compileSdkVersion 21//编译版本
    buildToolsVersion "21.1.2"//buildtool版本
    defaultConfig {//默认配置,会同时应用到debug和release版本上
        applicationId "com.taobao.startupanim"//包名
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {//这里面可以配置debug和release版本的一些参数,比如混淆、签名配置等
        release {//release版本
            minifyEnabled false//是否开启混淆
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘//混淆文件位置
        }
    }
}
dependencies {//模块依赖
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])//依赖libs目录下所有jar包
    compile ‘com.android.support:appcompat-v7:21.0.3‘//依赖appcompat库
}

defaultConfig中是一些基本配置,它会同时应用到debug/release版本上,下面列举了所有可配项及对应的值:

buildTypes结点很重要,这里可以配置构建的版本的一些参数,默认有两个构建版本release/debug,当然你可以自定义一个构建版本,比如叫foo,然后通过gradlew assembleFoo就可以生成对应的apk了。

buildTypes里还有很多可配置项,下面列举了所有可配项以及debug/release版本的默认值:

现在大家对build.gradle已经初步了解了,我们再看下其他一些与gradle相关的文件:

1.gradle.properties:

从名字上就知道它是一个配置文件,没错,这里面可以定义一些常量供build.gradle使用,比如可以配置签名相关信息如keystore位置,密码,keyalias等。

2.settings.gradle:

这个文件是用来配置多模块的,比如你的项目有两个模块module-a,module-b,那么你就需要在这个文件中进行配置,格式如下:

include ‘:module-a‘,‘:module-b‘

3.gradle文件夹:

这里面有两个文件,gradle-wrapper.jar和gradle-wrapper.properties,它们就是gradle wrapper。gradle项目都会有,你可以通过命令gradle init来创建它们(前提是本地安装了gradle并且配置到了环境变量中)。

4.gradlew和gradlew.bat:

这分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。

gradlew的用法跟gradle一模一样,比如执行构建gradle build命令,你可以用gradlew build。gradlew即gradle wrapper的缩写。

2.gradle仓库:

gradle有三种仓库,maven仓库,ivy仓库以及flat本地仓库。声明方式如下:

maven{
   url  "..."
}
ivy{
  url  "..."
}
flatDir{
 dirs ‘xxx‘
}

有一些仓库提供了别名,可直接使用:

repositories{
  mavenCentral()
  jcenter()
  mavenLocal()
}

3.gradle任务:

gradle中有一个核心概念叫任务,跟maven中的插件目标类似。

gradle的android插件提供了四个顶级任务

assemble  构建项目输出
check  运行检测和测试任务
build 运行assemble和check
clean 清理输出任务

执行任务可以通过gradle/gradlew+任务名称的方式执,执行一个顶级任务会同时执行与其依赖的任务,比如你执行

gradlew assemble

它通常会执行:

gradlew assembleDebug
gradlew assembleRelease

这时会在你项目的build/outputs/apk或者build/outputs/aar目录生成输出文件

注:linux下执行构建任务需要首先更改gradlew脚本的权限,然后才能执行该脚本:

chmod +x gradlew
./gradlew assemble

可以通过:

gradlew tasks

列出所有可用的任务。在Android Studio中可以打开右侧gradle视图查看所有任务。

四.常见问题

1.导入本地jar包:

跟eclipse不太一样,android studio导入本地jar除了将jar包放到模块的libs目录中以外,还得在该模块的build.gradle中进行配置,配置方式是在dependencies结点下进行如下声明:

compile files(‘libs/xxx.jar‘)

如果libs下有多个jar文件,可以这样声明:

compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])

2.导入maven库:

compile ‘com.android.support:appcompat-v7:21.0.3‘

可见,格式为

compile ‘groupId:artifactId:version‘

3.导入某个project:

你的app是多模块的,假设有两个模块app和module-A,并且app模块是依赖module-A的,这时候我们就需要在app模块的build.gradle中的dependencies结点下配置依赖:

compile project(‘:module-A‘)

并且你需要在settings.gradle中把module-A模块包含进来:

include ‘:module-A‘,‘:app‘

此外,这种情况下module-A模块是作为库存在的,因而它的build.gradle中的插件声明通常应该是这样的:

apply plugin: ‘com.android.library‘

而且,作为library的模块module-A的build.gradle文件的defaultConfig中是不允许声明applicationId的,这点需要注意。

4.声明三方maven仓库:

可能你项目需要的一些库文件是在你们公司的私服上,这时候repositories中仅有jcenter就不行了,你还需要把私服地址配到里面来,注意,应该配到project的build.gradle中的allprojects结点下或者直接配到某个模块中如果仅有这个模块用到。

配置方式:

repositories{
   maven{
     url="http://mvnrepo.xxx.com"
  }
}

5.依赖三方aar文件:

compile ‘com.aaa.xxx:core:[email protected]‘

6.将库项目导出为aar:
首先你的项目必须是一个库项目,build.gradle中进行配置:

apply plugin : ‘com.android.library‘

然后你可以在命令行中进到项目目录,执行如下gradle任务:

gradlew assembleRelease//确保该目录下有gradlew文件

生成的aar在/build/output/aar文件夹中
7.引用本地aar:
 首先将aar文件放到模块的libs目录下,然后在该模块的build.gradle中声明flat仓库:

repositories{
   flatDir{
      dirs ‘libs‘
   }
}

最后在dependencies结点下依赖该aar模块:

dependencies{
  compile (name:‘xxx‘,ext:‘aar‘)
}

8.排除依赖:

当出现依赖冲突的时候可以通过排除依赖解决,具体方式如下:

compile (group:‘xxx‘,name:‘xxx‘,version:‘xxx‘){
   exclude group:‘xxx‘,module:‘xxx‘//module对应的就是artifactId
}

9.多dex支持(打包65k方法数限制)

首先在build.gradle的buildConfig中增加如下配置:

multiDexEnabled true

接着,在dependencies结点下增加如下依赖:

dependencies{
   compile ‘com.android.support:multidex:1.0.0‘
}

最后,让你的Application继承MultiDexApplication,如果你的应用没有声明Application,可以在manifest文件的application结点下增加name属性,值为android.support.multidex.MultiDexApplication。

详细内容参见官方文档。

10.自动移除不用资源

可以在buildTypes结点中增加如下配置:

buildTypes{
    release{
      minifyEnabled true
      shrinkResources true
  }
}

11.忽略lint错误:

可以在build.gradle文件中的android结点下增加如下配置:

android{
   lintOptions{
     abortOnError false
   }
}

12.声明编译的java版本

可以在build.gradle文件中的android结点下增加如下配置:

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

13.应用签名配置

首先在module的build.gradle中增加这些字段:

storeFiles:keystore文件存储位置,通常是.jks文件
storePassword 密码
keyAlias keystore别名
keyPassword 密码

具体配置方式为:

首先在build.gradle的android结点下增加如下配置:

 signingConfigs {
        //debug版本的签名配置,通常不用配,因为有默认的debug签名
        debug {

        }

        release {
            storeFile file("key.jks")
            storePassword "123456"
            keyAlias "mykey"
            keyPassword "123456"
        }
    }

注:debug的默认签名为:

signingConfig android.signingCongfigs.debug

位置为

${home}\.android\debug.keystore

然后在buildTypes结点下的对应版本中添加上面的配置:

buildTypes{
    release{
       signingConfig signingConfigs.release
  }
}

当然,release不是固定的名称,你可以随便取,比如这样:

android {
    signingConfigs {
        debug {
            storeFile file("debug.keystore")
        }

        myConfig {
            storeFile file("other.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }

    buildTypes {
        foo {
            debuggable true
            jniDebuggable true
            signingConfig signingConfigs.myConfig
        }
    }
}

真实开发中,把密码配置到build.gradle中不是很好的做法,最好的做法是放在gradle.properties中:

RELEASE_STOREFILE=xxx.jks
RELEASE_STORE_PASSWORD=123456
RELEASE_KEY_ALIAS=mykey
RELEASE_KEY_PASSWORD=123456

然后直接引用即可:

 storeFile file(RELEASE_STOREFILE)
 storePassword RELEASE_STORE_PASSWORD
 keyAlias RELEASE_KEY_ALIAS
 keyPassword RELEASE_KEY_PASSWORD

14.定制buildConfig:

在build.gradle中配置:

buildTypes{
  release{
    buildConfigField "string","type","\"release\""
    }
  debug{
   buildConfigField "string","type","\"debug\""
  }
}

这样就会在BuildConfig类中生成type字段:

//build/generate/source/buildConfig/release/包名/   路径下的BuildConfig.java
public static final String type = "release"
//build/generate/source/buildConfig/debug/包名/    路径下的BuildConfig.java
public static final String type = "debug"
时间: 2024-11-05 15:50:57

【安卓笔记】gradle入门的相关文章

安卓笔记1——入门介绍及拨打电话和发送短信案例

现在开始接触安卓开发.以后后同步发出对应笔记.老规矩,用一张图来介绍今天的内容. 图片看不清的话可以右键新窗口打开. 一.开发工具 · Eclipse + ADT(Android Developer Tools) · Android Studio · SDK (软件开发环境, Android调试工具, 模拟等) 二.SDK目录介绍 · add-ons :(额外开发资料, google地图资源) · build-tools : 编译工具目录 · docs : 离线版开发文档 · extras : 

项目自动化建构工具gradle 入门5——在intellij中做一个gradle的web工程

之前的几个小节,都是纯手工建文件夹,纯手工拷贝war包,或者纯手工解压个zip看看结果,,,,这还是我写了玩的helloWorld.若是玩大工程.几十个人的团队协同开发时,这么玩,,,,暴躁的程序员估计血压爆表了. 对于大点的java web项目,我们需要用到Tomcat 9.0 M10,gradle 3.2.1,IntelliJ 来搞定这一档子事. 1.软件下载安装,见<项目自动化建构工具gradle 入门0--环境 & 废话>. 2.打开IntelliJ,File -> Ne

项目自动化建构工具gradle 入门4——javaWeb在浏览器中显示helloWorld

在java应用中,其实做的最多的还是java web应用.所以现在我们做的就是用gradle构建一个简单的web项目,简单点,直接上代码吧. 1.进入目录D:\work\gradle\web,新建文件build.gradle,键入内容: 1 apply plugin: 'war' // 引入war插件, 2 3 repositories { // 从哪里找jar包 4 flatDir { 5 // 先看下build.gradle文件所在目录下的 libs目录中有没有 6 dirs 'libs'

【安卓笔记】抽屉式布局----DrawerLayout

效果如下: DrawerLayout来自support.v4包,所以不用考虑兼容性问题.其次,这种布局类似风靡一时的侧滑菜单,但是比侧滑菜单轻巧许多. 下面介绍这种布局的使用方式. 1.在你的项目中导入support.v4包. 2.编辑一个布局,根节点为android.support.v4.widget.DrawerLayout,此节点下只允许有两个子节点,第一个为将来主页面的内容,第二个节点即为"抽屉"内容,通常是一个ListView.比如: <android.support.

【安卓笔记】通过发送特定的短信远程控制手机

实现效果: 1.发送指令#*location*#,可以远程获取到手机的地理位置(经纬度),并以短信的形式返回. 2.发送指令#*locknow*#,可以远程锁屏并设置锁屏密码. 实现原理: 1.注册广播接受者,监听手机收到的短信,并对符合要求的特定短信进行拦截和处理. 2.通过LocationManager获取地理位置. 3.使用DevicePolicyManager实现锁屏.设置锁屏密码等操作. 步骤: 1.创建一个可以获取地理位置的工具类: package cn.edu.chd.mobile

现代C++学习笔记之一入门篇:智能指针(C++ 11)

原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保程序不存在内存和资源泄漏且是异常安全的. 在现代 C++ 中,原始指针仅用于范围有限的小代码块.循环或者性能至关重要且不会混淆所有权的 Helper 函数中. 1 void UseRawPointer() 2 { 3 // Using a raw pointer -- not recommended

flask web开发笔记 -- 快速入门

flask web开发笔记 -- 快速入门 初始化 Flask应用需要创建应用实例. Web服务器通过Web Server Gateway Interface (WSGI)协议把从客户端接收到的请求传递给该对象.应用程序实例是Flask类对象,通常创建如下: from flask import Flask app = Flask(__name__) Flask类的构造函数唯一的参数是应用的主模块名或包名,用于确定应用的根目录.对于大多数应用程序,使用Python的__name__变量即可. 路由

【安卓笔记】仿猎豹清理大师波浪效果

先来看效果: 实现方式----->自定义控件 核心代码: package com.example.wavedemo1; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.os.Handler; import

Gradle入门:创建二进制发布版本

在创建了一个实用的应用程序之后,我们可能想将其与他人分享.其中一种方式就是创建一个可以从网站上下载的二进制文件. 这篇教程描述了如何创建一个二进制发布版本,满足以下需求: 二进制发布一定不能使用所谓的“fat jar”方式.换句话说,我们应用程序中的所有依赖一定不能被打包到该程序相同的jar包中. 二进制发布必须包含针对*nix和Windows操作系统的启动副本. 二进制发布的根目录必须包含许可证. 我们开始吧. 创建二进制发布文件 Application插件是一种Gradle插件,让我们可以运