Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它试用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了XML(如Ant和Maven)的各种繁琐配置,熟练的使用gradle可以节省很多开发时间
工具/原料
androidstudio
jdk/sdk
1.Gradle Files简单介绍
1、对于一个gradle 项目,最基础的文件配置如图所示:一个setting.gradle、一个顶层的 build.gradle文件、以及每个Module 都有自己的一个build.gradle文件setting.gradle:这个 setting 文件内容定义了哪些module 应该被加入到编译过程,对于单个module 的项目可以不用它,但是对于有多个module 的项目就需要这个文件,否则gradle 不知道要加载哪些项目,这个文件的代码在初始化阶段就会被执行。build.gradle(project:xxxx):顶层的build.gradle文件的配置最终会被应用到所有项目中,典型的配置如下://buildscript定义了 Android 编译工具的类路径buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}//定义的属性会被应用到所有 module 中allprojects { repositories { jcenter() //jCenter是一个著名的 Maven 仓库,有时候你用第三方插件,或则是框架时,需要对build.gradle这个文件做相应的修改,一般来说不需要动里面的东西}}task clean(type: Delete) { delete rootProject.buildDir}每个module的 build.gradle:针对每个module 的配置,如果这里的定义的选项和顶层build.gradle定义的相同,后者会被覆盖。典型的配置内容如下:apply plugin: 'com.android.application//所有特殊配置都在这里android { compileSdkVersion 25 buildToolsVersion "27.0.3" defaultConfig { applicationId "com.beckett.funnelview" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } // buildTypes定义了编译类型buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}//module中用到的依赖都在这里添加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:25.3.1' testCompile 'junit:junit:4.12'}
最方便的module(app)的 build.gradle的配置内容和注释
1、group = 'com.example.test'apply plugin: 'com.android.application'apply plugin: 'com.neenbedankt.android-apt'android { //1.签名配置,这样打包可以直接在terminal里使用命令打包 signingConfigs { TestConfig { keyAlias 'test' keyPassword 'test' storeFile file('../jks/'test'.jks') storePassword 'test' } } compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion rootProject.ext.android.buildToolsVersion //2.为了让项目目录出现jniLibs文件夹sourceSets { main { jniLibs.srcDir 'libs' } } //3.基础配置,例如版本信息,适配最小和目标版本号等信息 defaultConfig { multiDexEnabled true minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode 1 versionName "1" } //4.定义了编译类型,默认release和debug类型buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.TestConfig; ndk { abiFilters "x86", "armeabi" } } debug { debuggable true minifyEnabled false signingConfig signingConfigs.TestConfig; ndk { abiFilters "x86", "armeabi" } } //5.多渠道打包,让你打包一次得到多个apk productFlavors { apk_release applicationId "com.example.test" // app名字,在 string.xml 不能有这个字段,会重名!!!改这个,名字就改了 resValue "string", "app_name", "测试项目" // 修改 AndroidManifest.xml 里友盟的渠道变量,百度地图 manifestPlaceholders = [UMENG_APPKEY: "5abc74f8f29d98278f00023e", UMENG_MESSAGE_SECRET: "05ce4d1d9b15991405f30310427af672", BAIDU_API_KEY: "miwLNN7vDAHxzANaFpqta6vGxbNcDG2u"] //网络请求的地址,根据实际需求,可以将一些服务常量全部配置在这里,修改时只需到这里修改就可以了 buildConfigField("String", "API_HOST", "\"http://baidu.com\"") } } // 批量打包 applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { //输出apk名称为:渠道名_版本名_时间.apk def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}.apk" output.outputFile = new File(outputFile.parent, fileName) } } } } //解决rxjava冲突的 packagingOptions { exclude 'META-INF/rxjava.properties' } } //6.依赖 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile rootProject.ext.supportAppcompatV7 compile rootProject.ext.sqlbrite compile rootProject.ext.rxJava compile rootProject.ext.rxAndroid compile rootProject.ext.rxPermissions compile rootProject.ext.rxBinding compile rootProject.ext.dagger2 compile rootProject.ext.retrofit compile rootProject.ext.eventBus compile rootProject.ext.retrofitConverterGson compile rootProject.ext.retrofitAdapterRxJava compile rootProject.ext.materialDialog apt dagger2Compiler compile project(':library' compile project(':push') }}
补充
1、若有需要,还可以自行建一个Config.gradle文件,对所有module进行管理,一般配置如下,具体需要用那些库,自行删减:def supportVersion = "25.3.1"def rxBindingVersion = "0.4.0"def rxLifecyleVersion = "0.3.1"def retrofitVersion = "2.1.0"def leakCanaryVersion = "1.3"def dagger2Version = "2.6"ext { android = [ compileSdkVersion: 25, buildToolsVersion: "25.0.3", minSdkVersion : 15, targetSdkVersion : 25 ] //官方库 supportV4 = "com.android.support:support-v4:${supportVersion}" supportAppcompatV7 = "com.android.support:appcompat-v7:${supportVersion}" supportDesign = "com.android.support:design:${supportVersion}" supportCardView = "com.android.support:cardview-v7:${supportVersion}" supportRecyclerView = "com.android.support:recyclerview-v7:${supportVersion} //Rx家族,响应式编程 rxJava = "io.reactivex:rxjava:1.1.9" rxAndroid = "io.reactivex:rxandroid:1.2.1" rxPermissions = "com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar" rxBinding = "com.jakewharton.rxbinding:rxbinding:${rxBindingVersion}" rxBindingSupportV4 = "com.jakewharton.rxbinding:rxbinding-support-v4:${rxBindingVersion}" rxBindingSupportAppcompatV7 = "com.jakewharton.rxbinding:rxbinding-appcompat-v7:${rxBindingVersion}" rxBindingSupportDesign = "com.jakewharton.rxbinding:rxbinding-design:${rxBindingVersion}" rxBindingSupportRecyclerView = "com.jakewharton.rxbinding:rxbinding-recyclerview-v7:${rxBindingVersion}" rxBindingLeanbackV17 = "com.jakewharton.rxbinding:rxbinding-leanback-v17:${rxBindingVersion}" rxLifecycle = "com.trello:rxlifecycle:${rxLifecyleVersion}" rxLifecycleComponents = "com.trello:rxlifecycle-components:${rxLifecyleVersion}" // retrofit retrofit = "com.squareup.retrofit2:retrofit:${retrofitVersion}" retrofitConverterGson = "com.squareup.retrofit2:converter-gson:${retrofitVersion}" retrofitAdapterRxJava = "com.squareup.retrofit2:adapter-rxjava:2.0.1 sqlbrite = "com.squareup.sqlbrite:sqlbrite:1.1.2" }"}