Gradle For Android读书笔记

一、理解gradle

gradle是基于Groovy语言的项目构建框架实现,Groovy是一种基于JVM的动态语言。Android studio采用gradle来构建项目。

Android项目结构

MyApp
   ├── build.gradle //project
   ├── settings.gradle
   └── app 
       ├── build.gradle //module
       ├── build
       ├── libs
       └── src
           └── main
               ├── java
               │   └── com.package.myapp
               └── res
                   ├── drawable
                   ├── layout
                   └── etc. 

build.gradle的配置文件

根目录project的build.gradle

buildscript方法定义的是所有模块的公共属性

buildscript {
   repositories { //项目依赖的仓库,即依赖包的来源,常见的还有如maven仓库,或者自己定义的仓库
        jcenter() 
   }
   dependencies { //定义默认的依赖包,不能在此定义子模块的特有依赖包
       classpath 'com.android.tools.build:gradle:1.2.3'
 } 
}
allprojects { //可定义各模块的默认配置和各模块都可见的tasks
     repositories {
          jcenter() 
     }
}

Module内的build.gradle

apply plugin: 'com.android.application' // 声明是插件
   android {  // Android类型的插件可以使用Android标签
       compileSdkVersion 22 // 编译app时API版本
       buildToolsVersion "22.0.1" // 构建工具得版本号
       defaultConfig { // 定义了app的核心属性,并会在AndroidManifest中重写对应属性。
           applicationId "com.gradleforandroid.gettingstarted" // 复写了AndroidManifest中的packageName。applicationId可以用来作为设备和应用商店的唯一标志,基于此,一个手机可以安装两个“同样”的app。
           minSdkVersion 14
           targetSdkVersion 22
           versionCode 1 //版本号标志
           versionName "1.0"
       }
       buildTypes {
           release {
               minifyEnabled false
               proguardFiles getDefaultProguardFile
                ('proguard-android.txt'), 'proguard-rules.pro'
           }
        } 
    }
    dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
       compile 'com.android.support:appcompat-v7:22.2.0'
     }

第一行表示插件声明。apply plugin: 'com.android.application'表示声明的是googleAndroid开发团队编写的插件,能够提供所有关于Android应用和依赖库的构建打包和测试。

setting.gradle

settings.gradle会在初始化初期执行,其中定义了哪些模块会被project构建。

include ':app', ':playui'

会至少包含一个include ':app',这时候表示单模块工程。

关于各模块的插件声明:
app:

apply plugin: 'com.android.application'

其他module:

apply plugin: 'com.android.library'

如果插件声明的是Android类型,则可以使用Android标签

android {
       compileSdkVersion 22 //编译sdk版本
       buildToolsVersion "22.0.1" //构建版本工具,可以用高版本去构建低版本
}

声明在libs文件夹内的jar包

dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
}

全局设置

方法一、allprojects

这种必须是Android app module才有效,只有添加了Android插件才能访问Android的tasks

allprojects {
       apply plugin: 'com.android.application'
       android {
           compileSdkVersion 22
           buildToolsVersion "22.0.1"
       }
 }

方法二、ext

在project的build.gradle中声明ext并定义属性,在所有子module中可以访问。

 ext {
       compileSdkVersion = 22
       buildToolsVersion = "22.0.1"
}  

则子模块中可以如下使用:

android {
       compileSdkVersion rootProject.ext.compileSdkVersion
       buildToolsVersion rootProject.ext.buildToolsVersion
 }

Tasks

待补充: https://blog.csdn.net/singwhatiwanna/article/details/78898113

二、依赖管理

gradle中可以一行代码实现依赖,由gradle自动从远程仓库下载依赖jar,并保证被正确使用。gradle也可以在工程中添加多个相同依赖时,自动排除掉相同的依赖。

仓库

仓库即文件的集合。Gradle支持Maven、lvy以及文件夹三种不同的仓库下载,并且针对特定版本的依赖包只需要下载一次后会在本地保留一份缓存。
 

一个依赖需要定义三个元素:

  1. group:创建该library的组织名,通常是包名
  2. name:该library的唯一标示
  3. version:该library的版本号
    通常的依赖声明如下:
dependencies {
       compile 'com.google.code.gson:gson:2.3'
       compile 'com.squareup.retrofit:retrofit:1.9.0'
}

上述是基于groovy语法的,所以其完整的表述应该是

dependencies {
      compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
      compile group: 'com.squareup.retrofit', name: 'retrofit', version: '1.9.0'
     }

远程仓库

对于不在MavenCentral或者jcenter中而在一些组织自己的的Maven库的依赖,,需要添加Maven库的url地址,如果仓库需要权限,还要添加相应的userName和password

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
       }
}
repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
           credentials {
               username 'user'
               password 'secretpassword'
           }
        } 
   }

本地依赖

手动下载jar包添加依赖或者创建自己的library,而不必将该library发布到公有或者私有库。

文件依赖

添加一个具体的jar文件依赖:

dependencies {
    compile files('libs/domoarigato.jar')
}

添加一个文件夹下所有的jar依赖

dependencies {
       compile fileTree('libs')
 }

默认情况下,新建的Android项目会有一个lib文件夹,并且会在依赖中这么定义(即添加所有在libs文件夹中的jar):

dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar'])
}

这样在任何一个Android项目中,你都可以把一个jar文件放在到libs文件夹下,其会自动的将其添加到编译路径以及最后的APK文件。

Native包(so包)

用c或者c++写的library会被叫做so包,Android插件默认情况下支持native包,你需要把.so文件放在对应的文件夹中:

app
   ├── AndroidManifest.xml
   └── jniLibs
       ├── armeabi
       │   └── nativelib.so
       ├── armeabi-v7a
       │   └── nativelib.so
       ├── mips
       │   └── nativelib.so
       └── x86
           └── nativelib.so

aar文件

可以使用Android API和包含Android资源文件,清单文件等的library(即依赖工程)。与应用工程生成apk不同,依赖工程生成.aar,该文件可以被Android应用工程当做依赖来使用。

创建依赖工程模块

与应用工程module不同,该build.gradle第一行应声明成:

apply plugin: 'com.android.library'
使用依赖工程模块
  1. 直接使用library作为依赖,在project的build.gradle里添加声明
include ':app', ':library' 

在使用的模块里添加依赖

dependencies {
       compile project(':library')
  }
  1. 当构建library的时候,在 build/output/aar/下会生成对应的aar包,当项目需要复用library的时候可以以aar包形式引入。
    创建一个aars文件夹,将aar拷贝,添加该文件夹作为依赖库,则该文件夹下所有aar文件都将作为依赖。
repositories {
    flatDir {
        dirs 'aars' 
    }
}

dependencies {
       compile(name:'libraryname', ext:'aar')
}

依赖的概念

配置

compile是默认的那个,其含义是包含所有的依赖包,即在APK里,compile的依赖会存在。

apk的意思是apk中存在,但是不会加入编译中,这个貌似用的比较少。

provided的意思是提供编译支持,但是不会写入apk。

testCompile和androidTestCompile会添加额外的library支持针对测试。

动态版本

在需要使用最新版本的依赖包的情况下,采用此方式引入动态版本,gradle会在每次构建的时候去仓库寻找是否有最新版本。但是这面临的一个问题是,最新版本可能不是稳定版。动态版本一个显著的特点是版本号后面带“+”。

dependencies {
       compile 'com.android.support:support-v4:22.2.+'
       compile 'com.android.support:appcompat-v7:22.2+'
       compile 'com.android.support:recyclerview-v7:+'
}

三、版本构建

在Gradle的Android插件中,一个构建版本意味着定义一个app或者依赖库如何被构建。每个构建版本都要特殊的一面,比如是否需要debug,application id是什么,是否不需要的资源被删除等等。你可以定义一个构建版本通过buildTypes方法。Android studio将debug作为默认构建版本。

android {
       buildTypes {
           release {
               minifyEnabled false
               proguardFiles getDefaultProguardFile
                 ('proguard-android.txt'), 'proguard-rules.pro'
           }
           
           debug {
            signingConfig signingConfigs.debugConfig
            buildConfigField "boolean", MAIL_LOGIN, getMailLoginValue()
        }
        }
 }

创建自己的构建版本

同样是在buildTypes里写入自己的版本,为自己的构建版本定一些特殊的属性。构建版本可以继承并重写已有构建版本的属性。

android {
    buildTypes {
        staging {
            applicationIdSuffix ".staging"
            versionNameSuffix "-staging"
            buildConfigField "String", "API_URL",
            "\"http://staging.example.com/api\""
         }
    }
}

构建版本通过initWith方法继承并重写以后构建版本

android {
       buildTypes {
           staging.initWith(buildTypes.debug)
           staging {
               applicationIdSuffix ".staging"
               versionNameSuffix "-staging"
               debuggable = false
           } 
        }
}

四、构建变体

ing...

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

推荐阅读更多精彩内容