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.gradleext.name="xxx"ext{    appVersionCode=1    appVersionName="1.0.0"}

build.gradle 中引用

build.gradleapply 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.gradleproductFlavors{    google{}    baidu{}}productFlavors.all{ flavor ->    mainfestPlaceholders.put("UMENG_CHANNEL",name)}

mainfest中

通过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"'    }}

更多相关文章

  1. Android(安卓)aar打包及引用
  2. Phone Gap开发一:整合jQuery Mobile开发Android(安卓)App
  3. Android(安卓)NDK开发入门篇 .
  4. Qt for Android(安卓)部署流程分析
  5. Android(安卓)Studio Gradle 多渠道打包
  6. Android安装NDK运行环境无需cygwin
  7. 最快Android模拟器Genymotion的安装
  8. Android(安卓)Studio 插件--postfix
  9. AndroidStudio查看对象引用,是否内存泄露

随机推荐

  1. 深入浅出 - Android系统移植与平台开发(十
  2. 防止刚进入activity的时候,edittext获取焦
  3. Android开发学习总结(三)——appcompat_v
  4. Android(安卓)adb root权限
  5. [Android Pro] 通过Android trace文件分
  6. android-学习笔记之按钮事件
  7. Android Studio 链接蓝牙库
  8. Android基于XMPP Smack Openfire开发IM【
  9. Android下用程序的方法为ListView设置分
  10. Android中获取应用程序(包)的大小-----Pa