Gradle是Android的第三方插件,是由Google的Android团队开发的。从Android的角度看,Android插件是基于Gradle构建的,和Android Studio完美无缝搭配的新一代构建系统。

Android官方对于Gradle的介绍:

  • 可以容易地重用代码和资源;
  • 可以容易地创建应用的衍生版本,所以不管是创建多个apk,还是不同功能的应用都很方便;
  • 可以容易地配置/扩展以及自定义构建过程;
  • 和IDE无缝整合。

1.Android Gradle插件简介:

Android Gradle的插件分类其实是根据Android工程属性分类的。在Android中有3种工程:一类是app应用工程,可以生成一个可运行的apk应用;一类是Library库工程,可以生成ARR包给其他app公用,就和jar一样但它包含了Android的资源等信息,是特殊的jar包;最后一类Test测试工程,用于对app工程和Library工程进行单元测试。

  • APP插件 id:com.android.application
  • Library插件 id:com.android.library
  • Test插件 id:com.android.test

 

2.Android Gradle插件的应用:

要使用一个插件时必须知道它的插件id,除此之外,如是第三方插件还要配置classpath。Android Gradle插件属于第三方插件,托管于Jcenter上,使用前必须配置依赖classpath。

buildscript {    repositories {        google()        jcenter()       //构建脚本引入jcenter            }    dependencies {        classpath 'com.android.tools.build:gradle:3.5.2'                // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}

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

android{}是Android插件提供的一个扩展类型,这Android Gradle工程的唯一的入口,可以自定义Android Gradle工程。

apply plugin: 'com.android.application'android {    compileSdkVersion 28    defaultConfig {        applicationId "com.example.demo1"        minSdkVersion 15        targetSdkVersion 28        versionCode 1        versionName "1.0"        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'        }    }}dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    implementation 'androidx.appcompat:appcompat:1.0.2'    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'androidx.test.ext:junit:1.1.0'    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'    implementation 'com.android.support:recyclerview-v7:27.1.1'}

 

3.Android Gradle工程属性解析:

  • compileSdkVersion:是配置编译Android工程的SDK;
  • buildToolsVersion:是配置Android构建工具的版本;
  • defaultConfig:是默认配置,它是一个ProductFlavtor,ProductFlavtor允许根据不同情况同时生成多个不同的apk包;

minSdkVersion: 是最低支持Android系统的API LEVEL;

targetSdkVersion: 表明基于哪个Android版本开发的;

versionCode: 表示app应用内部版本号,一般用于控制app升级;

versionName:表示app应用版本名称,用户可以看到发布的版本号;

  • buildType:是一个NameDomainObjectContainter类型,是一个域对象。可以在buildType{}里新增任意多个需要构建的类型,如debug/release等。

minifEnable:是否为构建类型启用混淆;

proguardFiles:当启用混淆时,所使用的proguard的配置文件。

 

4.Android Gradle任务:

Android插件时基于Java插件,所以Android插件基本上包含了所有Java插件的功能,包括继承任务如assemble/check/build等。除此之外Android在大类上还添加了connectedCheck/deviceCheck/lint/install/uninstall等任务。

这些是属于Android特有的功能:

  • connectedCheck:在所有的连接设备或模拟器上运行check检查;
  • deviceCheck:通过API连接远程设备上运行checks,被用于CI(持续集成)服务器上;
  • lint:在所有ProductFlavtor上运行lint检查;
  • install/uninstall:可以直接连接设备上的安装或者卸载app;

 

5.自定义Android Gradle工程:

  • defaultConfig默认配置:defaultConfig是Android对象中的一个配置块,负责定义所有的默认配置。它是一个ProductFlavtor,如一个ProductFlavtor没有被特殊定义配置的话,默认就会使用defaultConfig{}块指定配置,比如包名/版本号/版本名称等;
  • 配置签名信息:一个app只有在签名之后才能被发布/安装/使用,签名是保护app的方式,标记该app的唯一性。
  • 构建的应用类型:在buildTypes{}代码块中添加元素即可。

applicationIdSuffix:用于配置基于默认applicationId的后缀,如在defaultConfig设置applicationId为"com.example.demo",在debug中buildTypes设置applicationId为debug,最终生成debug apk的包名为com.example.demo.debug;

debuggable:也是buildTypes的属性,用于配置是否生成一个可供调试的apk;

jniDebuggable:是buildTypes的属性,用于配置是否生成一个可供调试jni(C/C++)代码的apk;

minifEnabled:用于配置该buildTypes是否启动Proguard混淆;

multiDexEnable:用于配置该buildTypes是否启动自动拆分多个Dex的功能;

proguardFile:用于配置Proguard混淆使用的配置文件;

proguardFiles:用于配置Proguard混淆使用的配置文件,该方法可以同时配置多个Proguard配置文件;

shrinkResoures:用于配置是否自动清理未使用的资源;

singingConfig:用于配置该buildTypes使用签名配置;

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

 

6.Android Gradle高级自定义:

  • 使用共享库:

Android的包(如android.app/android.content/android.view/android.widget等)都是默认就包含在Android SDK库里的,所有应用都可以直接使用它们,系统会自动连接它们,不会出现找不到相关类的情况;

还有些独立的库(如com.google.android.maps/com.test.runner等)并不会被系统自动连接,所以在使用需单独进行生成使用,这类称为共享库;

在Android中,除了标准的SDK还存在两种库:一种是add-ons库,它们位于add-ons目录下这些库大部分是第三方厂商或公司开发的,一般是为了开发者使用,又不想暴露其具体实现;另一种optional可选库,platforms/android-xx/optional目录下,一般为了兼容就版本的API。

  • 批量修改生成的apk文件名:既要修改生成的apk文件名,那么就要修改Android Gradle打包输出。为了解决这问题Android提供了3个属性:applicationVariants(仅仅适用于Android应用Gradle的插件)/ libraryVariants(仅仅适用Android库Gradle的插件)/testVariants(以上两种都适用);

下面是批量修改apk名字的例子:

android {    compileSdkVersion 28    defaultConfig {        applicationId "com.example.demo1"        minSdkVersion 15        targetSdkVersion 28        versionCode 1        versionName "1.0"        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'        }    }    productFlavors {        google{        }    }    applicationVariants.all { Variant ->        Variant.outputs.each{ output ->            if (output.outputFile != null                    && output.outputFile.name.endWith('.apk')                    && 'release'.equals(variant.buildType.name)            ){                def flavorName = variant.buildType.startWith("_") ? variant.flavorName.subString(1) : variant.flavorName                def apkFile = new File(output.outputFile.getParent()                        ,"demo_${flavorName}_v${variant.versionName}_${buildTime()}.apk")       //${}是占位符                output.outputFile = apkFile            }        }    }}def buildTime() {    def date = new Date()    def formattedDate = date.format("yyyyMMdd")    return formattedDate}
  • 动态生成版本信息:

1、一般版本有3部分构成:major.minor.patch,第一个是主版本号,第二个是副版本号,第三个是补丁号。

分模块的方式:可以版本号的配置单独抽取出来,放在单独的文件里,供build引用。引入模块化“apply from”,新建一个version.gradle文件专用于存放版本,在项目的build.gradle中apply from:‘version.gradle’。之后使用version.gradle中的如appVersionCode等属性值;

version.gradleext {    appVerionCode = 1    appVersionName = '1.0.1'}

2、从git的tag中获取:

在Git中获取当前tag的名称命令如下

git describe --abbrev=0 --tags

project的exec方法有commandLine方法可使用

def getAppVersionName() {    def stdout = new ByteArrayOutputStream()    exec {        commandLine 'git','describ','--abbrev=0','--tags'        standarOutput = stdout    }    return stdout.toString()}def getAppVersionCode() {    def stdout = new ByteArrayOutputStream()    exec {        commandLine 'git','tag','--list'        standarOutput = stdout    }    return stdout.toString().split("\n").size()}

3、从属性文件中获取和递增:

在项目目录下新建一个version.properties的属性文件;

把版本名称分成3部分major.minor.patch,版本号分成一部分number,然后在version.properties中新增4个KV键值对;

在build.gradle里新建两个方法,用于读取属性文件,获取对应key值,然后把major.minor.patch这3个key拼接成版本名称number为版本号;

获取之后要更新存放在version.properties文件中以便下次使用。

  • 隐藏签名文件信息:

为了保密措施,签名信息不能放在项目中,也不能放在每个开发者的计算机上。解决的方法就是把签名信息放在服务器上,所以要有一台专门用于打包发版的服务器,把签名文件和秘钥信息放到服务器上,在打包时去读取即可。

下面是使用环境变量的方式:

signingConfigs {    def appStoreFile = System.getenv("STORE_FILE")    def appStorePassword = System.getenv("STORE_PASSWORD")    def appKeyAlias = System.getenv("KEY_ALIAS")    def appKeyPassword = System.getenv("KEY-PASSWORD")    release {        storeFile file(appStoreFile)        storePassword appStorePassword         keyAlias appKeyAlias         keyPassword appKeyPassword     }}
  • 动态配置AndroidManifest文件:

在构建过程中动态修改AndroidManifest文件中的内容,如使用友盟分析统计时,会要求我们在AndroidManifest总指定渠道名称

Android Gradle提供了让我们替换AndroidManifest文件中的内容,就是占位符manifestPlaceholder/Manifest等

productFlavors {    google {        manifestPlaceholders.put("UMENG_CHANNEL","google")    }    baidu {        manifestPlaceholders.put("UMENG_CHANNEL","baidu")    }}
  • 自定义BuildConfig::

Android Gradle提供了buildConfigField(String type,String name,Stirng value)方法可添加常量到BuildConfig中去。

  • 动态添加自定义资源:

Android开发中,资源都在res文件夹里定义,然后在工程里引用。这里的自定义资源是专门针对res/values类型资源的,不光可以在res/values文件夹里使用xml的方式定义,也还可以在Android Gradle中定义。

实现这一功能正是resValue方法,它在BuildType和ProductFlavor这两个对象中都存在。这样可以分别针对不同渠道,活不同构建类型来自定义其特有的资源。

  • Java编译选项:

需对Java源文件的编码、源文件使用的JDK版本等进行调优修改,Android对象中提供一个compileOptions方法,接受CompileOptions类型闭包作为参数。CompileOptions提供3个属性分别为:encoding、sourceCompatibility/targetCompatibility,来配置Java编译选项;

  • adb操作选项配置:

Android Gradle预留了对adb的一些选项的控制配置,即时adbOptions{};

  • DEX选项配置:

Android Gradle预留dexOptions{}进行dex选项配置。

  • 突破65535方法闲置:

启用Multidex,提供MultidexApplication等方式;

  • 自动清理未使用的资源:

使用Android Lint,会检测出哪些资源没有被使用,然后按照检测出来的列表清理即可。

 

7、Android Gradle多项目构建:

Android的项目一般分为库项目、应用项目、测试项目,Android Gradle根据这些项目分别对应有3种插件:com.android.library/com.android.application/com.android.test。

可根据业务,把工程分成一个个库项目,然后一个主的应用项目引用组合起来就成为了一个最终的产品。

 

8、Android Gradle多渠道构建:

Android Gradle提供了ProductFlavors方法来添加不同的渠道。

Flurry多渠道和友盟多渠道构建,

 

9、Android Gradle测试:

 

10、Android Gradle NDK支持:

 

 

 

更多相关文章

  1. Android入门教程(五)之------第一个Android工程HelloAndroid
  2. 【译】Google官方推出的Android架构组件系列文章(二)将Architectur
  3. Android 通过OKhttp3进行下载实现版本更新
  4. windows上 android 21.1版本ADT环境搭建
  5. Android系统信息(内存、cpu、sd卡、电量、版本)获取
  6. ANDROID PAD版本 PHONE版本 源码有什么 区别?
  7. Android各个版本API的区别

随机推荐

  1. 通过 javascript和php 实现打印问题
  2. 如何在PDO中使用RLIKE来转义星号和问号?
  3. php 读取文本文件
  4. 如何打开名称中包含特殊字符的文件
  5. 国内外常用wiki程序汇总
  6. 用Hack编写的代码比在HHVM上用PHP编写的
  7. NFS共享上的“stat failed”问题
  8. 在数组中找到键是找不到文本[重复]
  9. php实现邮件自动发送之PHPMailer
  10. [请大家关注]有关PHP大型程序开发的方法!