Gradle的一些配置技巧

强大的Gadle

自�Android Studio发布以来,Gradle作为构建工具,��有着强大的�功能。我们可以通过简单的�配置来实现一些复杂的构建过程。���������������包括自动区分版本打包,多渠道打包等。引用一张官方的构建流程图:


典型 Android 应用模块的构建流程

主要文件

咱们最常用到的是build.gradle文件,通常的项目中会有�两个:

  • Project根目录下,Project级别的build.gradle文件
  • 各个Module目录下,Module级别的build.gradle文�件

Project级别的build.gradle

�这个是顶级的构建文件,位于项目根目录

/**
 * 定义项目中所有模块共用的 Gradle 存储区和依赖项
 */
buildscript {
    /**
     * 代码远程仓库,可以定义搜索并下载的远程仓库,也能定义自己的远程仓库。
     * 支持本地和远程仓库,如下是引用了JCenter�作为远程依赖仓库。
     */
    repositories {
        jcenter()
    }
    /**
     * 一些顶级的依赖,用于整个项目�,如下是使用的gradl插件2.3.3
     */
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    }
}
/**
 * 给所有的Module配置公用依赖,包括一些第三方的插件�和库。单独的需要进入Module级别的build.gradle文件进行�配置
 * Android新项目会默认使用JCenter,但不会添加任何依赖。
 */
allprojects {
   repositories {
       jcenter()
   }
}
/**
 * 经常会有些项目有这样的写法,位于顶层的配置�可以被其他的gradle文件调用,所以有些项目会把版本号,SDK的版本配置在这里,方便所有的gradle文件统一
 */
ext {
    //版本号版本名称等
    versionCode = 1
    versionName = '1.0.0'
}

Module级别的build.gradle

�通常我们�新建项目的时候�,这个目录是app/build.gradle。这个文件中就有很多可以给我们��进行自定义了。�包括 android{} repositories{} dependencies{} 等�;

  • android{}
    这边挑几个主要的介绍
�android {
  //...
  //默认配置
  defaultConfig{

  }
  //编译类型配置
  buildTypes {
    //可以根据实际情况来定义各种构建类型
    debug{
      �//对于debug版本的单独配置,包括debug开关,和一些参数的配置
    }
    release{}
    //...
  }
  //�渠道打包。可以针对不同渠道生成不同的包名。也可以用来区分免费版和付费版
  productFlavors {
    free {
      applicationId 'com.example.myapp.free'
    }

    paid {
      applicationId 'com.example.myapp.paid'
    }
  }
  //...
}
  • repositories{}
repositories {
  //主要是一些�仓库的设置,支持本地代码库
  mavenCentral()
  flatDir {
      dirs 'aars'
  }
}
  • dependencies{}
    比较常用的是这个�配置,用来依赖各种第三方代码
//代码依赖
�dependencies {
  //本地的依赖
  compile fileTree(include: ['*.jar'], dir: 'libs')
  //通常的依赖
  compile 'io.reactivex:rxjava:1.1.6'
  //�测试依赖
  testCompile 'junit:junit:4.12'
  //正式发布的时候依赖
  releaseCompile 'com.android.support:appcompat-v7:25.3.1'
  //只在调试的时候依赖
  debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
}

一些实用的配置和技巧

关于签名的一些配置

在实际�开发中,大部分情况下,我们会将代码通过Git上传至代码仓库,�这样的话,签名配置等一些敏感信息,例如密码等都不适合上传。�那么这个时候,我们可以使用本地的一个「local.properties」文件来进行本地的�签名信息配置(该�文件不被上传至代码库,��库将其添加至.ignore文件中)。Android Studio会�默认为我们生成这么一个文件的,它本来是用来配置SDK在本地的路径等信息的。现在我们也能利用这个文件进行签名文件的配置。

  1. 首先我们将我们的签名信息配置到local�.properties文件中
# 本地签名文件部署,主要修改storeFile的路径值
keyAlias=example
keyPassword=123456
# 签名文件的路径
storeFile=/Users/keys/example.jks
storePassword=123456
  1. 在build.gradle开头加载这个文件(在 android{} 代码之前添加)
//加载本地签名配置
def keystorePropertiesFile = rootProject.file("local.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
  1. signingConfigs{} 中配置
signingConfigs {
    ExampleSign {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile file(keystoreProperties['storeFile'])
        storePassword keystoreProperties['storePassword']
    }
}

经过以上3步的配置,�就不用担心密码泄露的一些问题了。

动态配置AndroidManifest.xml中的一些值

�在�对接一些第三方的�API时,�往往需要在「AndroidManifest.xml」文件中进行「app_key」「app_secret」等参数的配置。
�一般按照�第三方API文档的做法,比如我接入一个阿里的推送服务,那我需要如下配置:

<meta-data
    android:name="com.alibaba.app.appkey"
    android:value="exampleappkey"/>

<meta-data
    android:name="com.alibaba.app.appsecret"
    android:value="exampleappsecret"/>

可是在实际生产中,我们往往会发布一个beta版用于��发release版之前的测试,但是beta版和release版用的不是同一套「app_key」「app_secret」。这个时候比较笨的�办法是,写两套,然后每次发布版本的时候,将其中一套注释掉。这样做当然是可行的,但是�根据版本的�不断迭代,�往往会忘记对这一部分进行修改或者修改混乱,导致发布的版本产生混乱。

这个时候可以利用gradle结合AndroidManifest.xml进行动态的配置:

<meta-data
    android:name="com.alibaba.app.appkey"
    android:value="${ali_push_appkey}"/>

<meta-data
    android:name="com.alibaba.app.appsecret"
    android:value="${ali_push_appsecret}"/>

这里的 ${value} 的写法相当于定义了�value这么一个变量,然后再在build.gradle文件中,找到不同的buildType

buildTypes {
  debug {
      //开启调试
      debuggable = true
      //编译时给包名
      applicationIdSuffix '.dev'
      //给AndroidManifest.xml中对应的变量设置�值
      manifestPlaceholders = [  ali_push_appkey   : "2******6"
                              , ali_push_appsecret: "c1********************31"]
  }
  //...
}

可以看到manifestPlaceholders可以有很�多对这样的值进行设定。经过这样的设置,每次�对不同版本打包时,都会自动找到相应的配置,这样就不需要每次打包都要进行修改了。

使用Android Studio切换运行不同的版本

通常�使用Android Studio�项目运行时,默认是使用的debug的配置。根据上面动态配置来看,我们是存在beta版或者release版的,有时候,我们会面对需要调试特定版本来判定服务器(服务器一般会有测试环境和生产环境的区分)或者�第三方API在该版本下的配置是否正常运行的情形。

可是,我们总不能每次需要测试生产环境时,就打一个包,然后push到设备上进行安装吧。Android Studio为我们提供了一个运行切换的�方法--�Build Variant。通常,这个选项会在�整个IDE的左下角,也可以通过「View」-->「Tool Windows」-->「Build Variant」找到。打开这个选项�视图,可以看到�各个�Module及当前的Build Variant。这个Build Variant,指的是���gradle中�buildTypes和productFlavors�排列组合所有的版本,比如,配置了2个�buildTypes和2个productFlavors,那么会有2*2=4种组合。切换的方法也很简单,只需要点击选择你想切换的版本就好:


Build Variant

在选择版本之后,你�运行的版本就是你选择的这个版本了。

打包自动生成包名

�在辛苦的完成编码之后,我们打出了一个APP的安装包。这个安装包的名称为「app-release」你习惯性的给它重新命名了一番。只发这么一次版本打一次包的话这么做还好。如果要打很多个包,你总不能一个个命名过去吧。使用�gradle进行配置的话会很方便,只需要在 android{} 中加入一段代码就可实现:

android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(output.outputFile.parent,
                    defaultConfig.applicationId
                            + (buildType.properties.containsKey("applicationIdSuffix") ? buildType.properties.get("applicationIdSuffix") : "")
                            + "_" + defaultConfig.versionName + ".apk");
        }
    }

在new File()的第二个参数中,你可以传入想要的生成文件名的规则。上面�这段代码生成的格式是「包名+build后缀_版本名.apk」其中 applicationIdSuffix 的值会根据不同bulidTypes生成后缀。

提供一份较完整的�app/build.gradle文件供参考build.gradle

参考
官方文档
ANDROID 开发你需要了解的 GRADLE 配置

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

推荐阅读更多精彩内容