Gradle命令和配置

转至:http://blog.csdn.net/heqiangflytosky/article/details/50853268

Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言,建议可以先熟悉一下Groovy脚本。

在线文档

Gradle命令:

常用命令:

gradle明明一般是./gradlew +参数,gradlew代表gradle wrapper,意思是gradle的一层包装,大家可以理解为在这个项目本地就封装了gradle,即gradle wrapper, 在gradle/wrapper/gralde-wrapper.properties文件中声明了它指向的目录和版本。只要下载成功即可用grdlew wrapper的命令代替全局的gradle命令。

./gradlew -v版本号

./gradlew clean清除app目录下的build文件夹

./gradlew build检查依赖并编译打包

这里注意的是./gradlew build命令把debug、release环境的包都打出来,如果正式发布只需要打Release的包,该怎么办呢,下面介绍一个很有用的命令assemble, 如:

./gradlew assembleDebug编译并打Debug包

./gradlew assembleRelease编译并打Release的包

除此之外,assemble还可以和productFlavors结合使用:

./gradlew installReleaseRelease模式打包并安装

./gradlew uninstallRelease卸载Release模式包

加入自定义参数:

比如我们想根据不同的参数来进行不用的编译配置,可以在./gradlew中加入自定义参数。

./gradlew assembleDebug -Pcustom=true

就可以在build.gradle中使用下面代码来判断:

if(project.hasProperty('custom')){

}

1

2

3

1

2

3

assemble结合Build Variants来创建task

assemble还能和Product Flavor结合创建新的任务,其实assemble是和Build Variants一起结合使用的,而Build Variants = Build Type + Product Flavor,举个例子大家就明白了:

如果我们想打包 wandoujia 渠道的release版本,执行如下命令就好了:

./gradlew assembleWandoujiaRelease

如果我们只打wandoujia渠道版本,则:

./gradlew assembleWandoujia

此命令会生成wandoujia渠道的Release和Debug版本

同理我想打全部Release版本:

./gradlew assembleRelease

这条命令会把Product Flavor下的所有渠道的Release版本都打出来。

总之,assemble命令创建task有如下用法:

assemble: 允许直接构建一个Variant版本,例如assembleFlavor1Debug。

assemble: 允许构建指定Build Type的所有APK,例如assembleDebug将会构建Flavor1Debug和Flavor2Debug两个Variant版本。

assemble: 允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本。

Gradle配置:

Gradle构建脚本 build.gradle:

Gradle属性文件 gradle.properties

Gradle设置文件 settings.gradle

build.gradle

先看整个项目的gradle配置文件:

buildscript {    repositories {        jcenter()    }    dependencies {        classpath'com.android.tools.build:gradle:1.3.0'// NOTE: Donotplace your application dependencies here; they belong        //inthe individualmodulebuild.gradle files    }}allprojects {    repositories {        jcenter()    }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

内容主要包含了两个方面:一个是声明仓库的源,这里可以看到是指明的jcenter(), 之前版本则是mavenCentral(),jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。

另一个是声明了Androidgradle plugin的版本,android studio 1.0正式版必须要求支持gradle plugin 1.0的版本

某个Moudle的gradle配置文件:

buildscript

buildscript{    repositories {        maven { url'http://*********'}}    dependencies{        classpath'com.android.tools.build:gradle:1.3.1'}}

1

2

3

4

5

6

7

8

9

1

2

3

4

5

6

7

8

9

buildscript{}设置脚本的运行环境。

repositories{}支持java依赖库管理,用于项目依赖。

dependencies{}依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件。如果前面定义了repositories{}maven 库,则使用maven的依赖库,使用时只需要按照用类似于com.android.tools.build:gradle:0.4,gradle 就会自动的往远程库下载相应的依赖。

apply

//声明是Android程序apply plugin:'com.android.application'

1

2

1

2

apply plugin:声明构建的项目类型。如果是库的话就加

apply plugin:'com.android.library'

1

1

android

android {// 编译SDK的版本compileSdkVersion22// build tools的版本buildToolsVersion"23.0.1"//aapt配置aaptOptions {//不用压缩的文件noCompress'pak','dat','bin','notice'//打包时候要忽略的文件ignoreAssetsPattern"!.svn:!.git"//分包multiDexEnabledtrue//--extra-packages是为资源文件设置别名:意思是通过该应用包名+R,com.android.test1.R和com.android.test2.R都可以访问到资源additionalParameters'--extra-packages','com.android.test1','--extra-packages','com.android.test2'}//默认配置defaultConfig {//应用的包名applicationId"com.example.heqiang.androiddemo"minSdkVersion21targetSdkVersion22versionCode1versionName"1.0"}//编译配置compileOptions {// java版本sourceCompatibility JavaVersion.VERSION_1_7        targetCompatibility JavaVersion.VERSION_1_7    }//源文件目录设置sourceSets {        main {//jni lib的位置jniLibs.srcDirs = jniLibs.srcDirs <<'src/jniLibs'//定义多个资源文件夹,这种情况下,两个资源文件夹具有相同优先级,即如果一个资源在两个文件夹都声明了,合并会报错。res.srcDirs = ['src/main/res','src/main/res2']        }    }//签名配置signingConfigs {        debug {            keyAlias'androiddebugkey'keyPassword'android'storeFilefile('keystore/debug.keystore')            storePassword'android'}    }    buildTypes {//release版本配置release {            debuggablefalse// 是否进行混淆minifyEnabledtrue//去除没有用到的资源文件,要求minifyEnabled为true才生效shrinkResourcestrue// 混淆文件的位置proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.txt'signingConfig signingConfigs.debug//ndk的一些相关配置,也可以放到defaultConfig里面。//指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,arm-v8之类的so会被过滤掉)ndk {                abiFilter"armeabi"}        }//debug版本配置debug {            debuggabletrue// 是否进行混淆minifyEnabledfalse//去除没有用到的资源文件,要求minifyEnabled为true才生效shrinkResourcestrue// 混淆文件的位置proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.txt'signingConfig signingConfigs.debug//ndk的一些相关配置,也可以放到defaultConfig里面。//指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,arm-v8之类的so会被过滤掉)ndk {                abiFilter"armeabi"}        }    }// lint配置lintOptions {//移除lint检查的errorabortOnErrorfalse//禁止掉某些lint检查disable'NewApi'}}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

android{}设置编译android项目的参数,构建android项目的所有配置都写在这里。

除了上面写的,在android{}块中可以包含以下直接配置项:

productFlavors{ }产品风格配置,ProductFlavor类型

testOptions{ }测试配置,TestOptions类型

dexOptions{ }dex配置,DexOptions类型

packagingOptions{ }PackagingOptions类型

jacoco{ }JacocoExtension类型。 用于设定 jacoco版本

splits{ }Splits类型。

几点说明:

文件开头apply plugin是最新gradle版本的写法,以前的写法是apply plugin: 'android', 如果还是以前的写法,请改正过来。

minifyEnabled也是最新的语法,很早之前是runProguard,这个也需要更新下。

proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 sdk目录/tools/proguard/proguard-android.txt, 后一部分是我们项目里的自定义的混淆文件,目录就在app/proguard-rules.txt, 如果你用Studio 1.0创建的新项目默认生成的文件名是proguard-rules.pro, 这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则。最终混淆的结果是这两部分文件共同作用的。

aaptOptions更多介绍http://blog.csdn.net/heqiangflytosky/article/details/51009123

repositories

repositories {    flatDir {        //本地jar依赖包路径dirs'../../../../main/libs'}}

1

2

3

4

5

6

1

2

3

4

5

6

dependencies

dependencies {        compilefiles('libs/android-support-v4.jar')//在flatDir.dirs下面找依赖的aarcompile (name:'ui', ext:'aar')// 编译extras目录下的ShimmerAndroid模块compile project(':extras:ShimmerAndroid')// 编译CommonSDK模块,但是去掉此模块中对com.android.support的依赖,防止重复依赖报错compile (project(':CommonSDK')) { exclude group:"com.android.support"}        provided fileTree(dir:'src/android5/libs',include: ['*.jar'])        provided'com.android.support:support-v4:21.0.3'provided project(':main-host')}

1

2

3

4

5

6

7

8

9

10

11

12

1

2

3

4

5

6

7

8

9

10

11

12

compile和provided

compile表示编译时提供并打包进apk。

provided表示只在编译时提供,不打包进apk。

exclude防止重复依赖

include

CommonSDK模块的定义可以参考settings.gradle

其他的介绍可以参考 依赖库管理。

几点说明

看到上面的两个一模一样的repositories和dependencies了吗?他们的作用是不一样的,在buildscript里面的那个是插件初始化环境用的,用于设定插件的下载仓库,而外面的这个是设定工程依赖的一些模块和远程library的下载仓库的。

settings.gradle

这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module。

一般在setting.gradle中主要是调用include方法,导入工程下的各个子模块。

那我们在setting.gradle里面还能写什么呢?因为setting.gradle对应的是gradle中的Settings对象,那查下Settings的文档(https://docs.gradle.org/current/dsl/org.gradle.api.initialization.Settings.html),看下它都有哪些方法,哪些属性,就知道在setting.gradle能写什么了;

include':AndroidDemo'include':CommonSDK'project(':CommonSDK').projectDir =newFile(settingsDir,'../../CommonSDK/')

1

2

3

4

1

2

3

4

include调用后,生成了一个名为:CommonSDK的Project对象,project(':CommonSDK')取出这个对象,设置Project的projectDir属性。projectDir哪里来的?请看Project类的文档。

依赖库管理

本地依赖

dependencies {//单文件依赖compilefiles('libs/android-support-v4.jar')//某个文件夹下面全部依赖compile fileTree(dir:'src/android6/libs',include: ['*.jar'])        compile (name:'ui', ext:'aar')    compile (project(':CommonSDK')) { exclude group:"com.android.support"}        provided fileTree(dir:'src/android5/libs',include: ['*.jar'])        provided'com.android.support:support-v4:21.0.3'provided project(':main-host')}

1

2

3

4

5

6

7

8

9

10

11

1

2

3

4

5

6

7

8

9

10

11

远程依赖

gradle同时支持maven,ivy,以maven作为例子:

repositories {//从中央库里面获取依赖mavenCentral()//或者使用指定的本地maven 库maven{  url"file://F:/githubrepo/releases"}//或者使用指定的远程maven库maven{  url"https://github.com/youxiachai/youxiachai-mvn-repo/raw/master/releases"} } dependencies {//应用格式: packageName:artifactId:versioncompile'com.google.android:support-v4:r13'}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

项目依赖

对于项目依赖android library的话,在这里需要使用gradle mulit project机制。

Mulit project设置是gradle约定的一种格式,如果需要编译某个项目之前,要先编译另外一个项目的时候,就需要用到。结构如下(来自于官方文档):

MyProject/| settings.gradle+ app/| build.gradle+ libraries/  + lib1/| build.gradle+ lib2/| build.gradle

1

2

3

4

5

6

7

8

9

1

2

3

4

5

6

7

8

9

需要在workplace目录下面创建settings.gradle的文件,然后在里面写上:

include':app',':libraries:lib1',':libraries:lib2'

1

1

例如:

include':AndroidDemo'include':CommonSDK'project(':CommonSDK').projectDir =newFile(settingsDir,'../../CommonSDK/')

1

2

3

4

1

2

3

4

如此,gradle mutil project 就设置完毕。

对于app project如果需要应用libraries目录下的lib1,只需要在app project的build.gradle文件里的依赖中这么写:

compileproject(':libraries:lib1')

1

1

类似前面的

providedproject(':main-host')

1

1

即可完成,写完以后可以用gradle AndroidDependencies可以检查依赖状况

多渠道打包:

主要借助

android{

productFlavors{

……

}}

1

2

3

4

5

1

2

3

4

5

来实现。

网上多是类似友盟的配置,copy过来:

http://blog.csdn.net/maosidiaoxian/article/details/42000913

https://segmentfault.com/a/1190000004050697

在AndroidManifest.xml里面写上:

1

2

3

1

2

3

里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。

android {      productFlavors {        xiaomi {            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"xiaomi"]        }        _360 {            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"_360"]        }        baidu {            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"baidu"]        }        wandoujia {            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"wandoujia"]        }    }  }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

或者批量修改

android {      productFlavors {        xiaomi {}        _360 {}        baidu {}        wandoujia {}    }      productFlavors.all{        flavor -> flavor.manifestPlaceholders= [UMENG_CHANNEL_VALUE: name]    }}

1

2

3

4

5

6

7

8

9

10

11

12

1

2

3

4

5

6

7

8

9

10

11

12

然后用./gradlew assembleRelease这条命令会把Product Flavor下的所有渠道的Release版本都打出来。

assemble: 允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本。

在上面当中,我们也可以指定一个默认的渠道名,如果需要的话。指定默认的值是在defaultConfig节点当中添加如下内容:

manifestPlaceholders =[ CHANNEL_NAME:"Unspecified"]

1

1

这里的Unspecified换成你实际上的默认的渠道名。

使用manifestPlaceholders的这种配置,同样适用于manifest的其他配置。比如你需要在不同渠道发布的apk里面,指定不同的启动Activity。比如在豌豆荚里面发布的,启动的Activity显示的是豌豆荚首发的界面,应用宝里面启动的是应用宝首发的界面(哈哈,有点坏),你就可以对你的activity的值使用{activity_name}的方式,然后在productFlavors里面配置这个{activity_name}的值。

Gradle依赖的统一管理

我们可以在项目的根目录创建一个gradle配置文件config.gradle,内容如下:

ext{    android=[            compileSdkVersion:22,            buildToolsVersion:"23.0.1",            minSdkVersion:21,            targetSdkVersion:22,            versionCode:1,            versionName:"1.0"]    dependencies=[            compile:'com.android.support:support-v4:21.0.3',            compile: (project(':CommonSDK')) { excludegroup:"com.android.support"},            provided: fileTree(dir:'src/android5/libs', include: ['*.jar']),            provided: project(':main-host')    ]}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

targetSdkVersion的版本还有依赖库的版本升级都在这里进行统一管理,所有的module以及主项目都从这里同意读取就可以了。

在build.gradle文件中加入:

applyfrom:"config.gradle"

1

1

意思是所有的子项目或者所有的modules都可以从这个配置文件中读取内容。

android节点读取ext中android对应项,dependencies读取dependencies对应项,如果配置有变化就可以只在config.gradle中修改,是不是很方便进行配置的管理的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容