2018-08-17 Android Gradle(1)

Android Gradle 插件分类

在android中有三类工程,一类是app应用工程,它可以生成一个可运行的apk应用;一类是Library库工程,他可以生成AAR包给其他的App工程公用,就和我们的Jar一样,但是它包含了Android的资源等信息,是一个特殊的Jar包;最后一类是Test测试工程,用于对APP工程或者Library库工程进行单元测试

  1. APP插件id:com.android.application
  2. Library插件id:com.android.library
  3. Test插件id:com.android.test

通过上面3种不同的插件,就可以配置我们的工程是一个Android App工程,还是一个Android Library工程,或者是一个Android Test测试工程

要应用一个插件就必须要知道它的插件id,如果是第三方插件,还需要配置它们的依赖classpath,Android Gradle插件就是属于第三方插件,他托管在jcenter上,所以应用之前,需要先配置依赖classpath

buildscript {
    repositories{
        jcenter()
    }
    dependencies{
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}

buildscript{}闭包可以写在根工程的build.gradle脚本文件中,这样所有的子工程就不用重复配置了

配置好后,就可以在App工程中用了

apply plugin:'com.android.application'

android{
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
}

android{}是Android插件提供的一个扩展类型

Android Gradle工程的配置,都是在android{}中,这是唯一的一个入口,通过它,可以让我们自定义一个Android Gradle工程.

compileSdkVersion是编译所依赖的Android Sdk的版本

buildToolsVersion是构建该Android工程所用构建工具的版本

具体实现如下

extension=project.extensions.create('android',getExtensionClass(),(ProjectInternal)project,instantiator,
            androidBuilder,sdkHandler,buildTypeContainer,productFlavorContainer,signingConfigContainer,
            extraModelInfo,isLivraty())

defaultConfig

defaultConfig是默认的配置,它是一个ProductFlavor,ProductFlavor允许我们根据不同的情况同时生成多个不同的APK包,默认配置中

applicationId 是配置我们的包名

minSdkVersion是最低支持的Android系统的API Level

targetSdkVersion 表明我们是基于那个Androi版本开发的

versionCode表明我们的APP应用内部版本号,一般用于控制App升级

versionName 表明我们的APP应用的版本名称

buildTypes

buildTypes 是一个域对象,和SourceSet一样,里面有main,test,release,debug等,我们可以在buildTypes{}里新增任意多的我们需要构建的类型

minifyEanbled 是否为该构建类型启用混淆,false表示不启用

proguardFiles 当我们启用混淆时,所使用的proguard的配置文件,可以根据接收的参数同时配置一个或者多个配置文件如

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

getDefaultProguardFile是Android扩展的一个方法,用来获取AndroidSDK 目录下默认的proguard配置文件 文件名就是传入的参数名proguard-android.txt

signingConfig

配置默认的签名信息,对生成的App签名,是ProductFlavor的一个属性,可以直接对其进行配置,方法原型如下

public ProductFlavor setSigningConfig(SigningConfig signingConfig){

    msigningConfig=signingConfig
    
    ruturn this;
}

public SigningConfig getsigningConfig(){
    return mSigningConfig;
    }

默认配置如下

signingConfigs {
    release {
      //签名证书文件,打正式包时,自己生成
      storeFile file('G:/xxx/xxx/xxx.jks')
      //签名证书密码
      storePassword 'xxx'
      //签名证书中的秘钥别名
      keyAlias 'xxx'
      //签名证书中的该秘钥的密码
      keyPassword 'xxx'
    }

    debug {
      storeFile file('G:/xxx/xxx/xxx.jks')
      storePassword 'xxx'
      keyAlias 'xxx'
      keyPassword 'xxx'
    }
  }

multiDexEnabled

是buildType的一个属性,用于配置该BuildType是否启用自动拆分多个Dex的功能,一般用于程序中代码太多,超过65536个方法的时候,拆分为多个Dex的处理,接收boolean值

shrinkResources

是buildType的一个属性,用于配置是否自动清理未使用的资源,默认为false

zipalign

zipalign是Andoroid提供的一个整理优化apk文件的工具,它能提高系统和应用的运行效率,更快的读写apk中的资源,降低内存的使用,所以对于要发布的app,再发布之前一定要使用zipalign进行优化

如果想在release模式开启zipalign优化,需要进行如下配置

android{
    buildTypes{
        release{
            aipAlignEnabled true
        }
        debug{
        }
    }
}

批量修改生成的apk文件名

既然要修改生成的apk文件名,那么就要修改Android Gradle打包的输出,为此,Android对象为我们提供了下列3个属性

application Variants 仅仅适用于Android 应用的Gradle插件

library Variants 仅仅适用于 Android库 Gradle插件

testVariants 以上两种Gradle插件都适用

以上三个属性都返回DomainObjectSet对象集合,如下例

buildTypes {

release {

  xxx...

  android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
      def outputFile = output.outputFile
      if (outputFile != null && outputFile.name.endsWith('.apk')) {

        def fileName = "dayuyoupin-${defaultConfig.versionCode}-${defaultConfig.versionName}-${releaseTime()}-${variant.productFlavors[0].name}.apk"
        //output.outputFile = new File(outputFile.parent, fileName)
        outputFileName = fileName
      }
    }
  }
}

debug {
  signingConfig signingConfigs.debug
}
}

application Variants 是一个DomainObjectCollection集合,我们可以通过all方法进行遍历,遍历的每一个variant都是一个生成的产物

ext{}

程序中ext{}快表明要为当前project创建扩展属性,以供其他脚本引用,就像java里的变量一样,创建好以后,可以在build.gradle中引用它,如下先创建一个version.gradle,然后引用

version.gradle

ext.name="xxx"

ext{
    appVersionCode=1
    appVersionName="1.0.0"
}

build.gradle 中引用

build.gradle
apply plugin:'java'
apply from: 'version.gradle'

引用java插件时,java就是插件的plugin id

插件可以分为脚本插件和二进制插件,from区分与脚本插件和二进制插件,引用第三方发布的jar包的一些二进制插件时,就必须在项目根目录的build.gradle中的buildscript{}中配置其classpath

隐藏签名信息

前面我们把项目的签名信息放在项目中,托管在git上,这样做虽然非常方便,但存在着一定的安全隐患,如果要安全隐藏,最好的办法就是将其放在服务器上,要实现这个,还得有自己的专门用于打包发版的服务器,下面以使用环境变量的方式为例

singingConfigs{
    def appStoreFile=System.getenv("STORE_FILE")
    def appStorePassword=System.getenv("STORE_PASSWORD)
    def appKeyAlias=System.getenv("KEY_PASSWORD"))
    release{
        storeFile file(appStoreFile)
        storePassword appStorePassword
        keyAlias appKeyAlias
        keyPassword appkeyPassword
    }
}

release{
signingConfig signigConfigs.release
}

动态配置AndroidManifest文件

应用于多渠道打包,如下

build.gradle
productFlavors{
    google{}
    baidu{}
}

productFlavors.all{ flavor ->
    mainfestPlaceholders.put("UMENG_CHANNEL",name)
}

mainfest中

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

通过all函数遍历每一个ProductFlavor.然后把它们的name作为友盟中渠道的名字,再利用Android Gradle中提供的mainfestPlaceholders占位符的应用方式,可以动态替换掉AndroiMainfest文件中任何${var}格式的占位符

BuildConfig

public final class BuildConfig {
 public static final boolean DEBUG = Boolean.parseBoolean("true");
 public static final String APPLICATION_ID = "com.deepbaytech.tao";
 public static final String BUILD_TYPE = "debug";
 public static final String FLAVOR = "baidu";
 public static final int VERSION_CODE = 0;
 public static final String VERSION_NAME = "1.3.7.debug";
}

DEBUG 用于标记是debug还是release模式,其余的还有包名,当前构建的类型,是debug还是release,当前构建的渠道,当前的版本号以及版本名称,这些差不多就是我们当前构建渠道的基本应用信息,都是常量,相比于我们获取这些信息的其他方式,无疑要方便许多

一般在开发过程中都会输出日志进行调试,一般只有我们自己开发中才会打印日志,发布版本后就 不打印了,也就是我们需要一个标记是debug还是release模式的开关,这就是buildConfig.DEBUG,在debug模式下时true.在release模式下它的值会自动变为false,不用我们自己改动,Android会自动帮我们修改,非常方便.

当然我们也可以自己定义,在BuildConfig中新增一些常量.一般利用android Gradle提供的buildConfigField(String type,String name,String value) 来动态配置.例子如下

假如我们有baidu和google两个渠道,发布的时候会有这两个渠道包,当我们安装baidu渠道包的时候打开的是baidu首页,当我们安装google渠道包的时候,打开的是google首页,从这个思路分析,我们只要添加一个字段WEB_URL,在百度渠道包下时http://www.baidu.com,在google渠道包下值为http://www.google.com即可:

productFlavors{
    google{
        buildConfigField 'String','WEB_URL','"http://www.google.com"'
    }
    baidu{
        buildConfigField 'String','WEB_URL','"http://www.baidu.com"'
    }
}

release和debug也可以配置,如下

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,397评论 25 707
  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,552评论 3 25
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,115评论 8 72
  • 《重新回到谈话中》中说,把自己的全部注意力放在各种电子设备上的年轻人,无法发展出完全独立的自我。 随时在线的状态,...
    拙变阅读 362评论 0 0
  • 也算不来是多少次的梦中惊醒了。梦里的你变得自信快乐甚至有些许放荡,和我知道的你不一样,大概这才是真正的你也...
    木星牧星人阅读 223评论 0 0