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(安卓)位图(二) Bitmap
  2. Android入门教程(五)之------第一个Android工程HelloAndroid
  3. Android(安卓)自动编译、打包生成apk文件 2 - 使用原生Ant方式
  4. Android入门教程(三)之------导入现有Android工程
  5. 【译】Google官方推出的Android架构组件系列文章(二)将Architectur
  6. android SDK应用
  7. Android创建和使用数据库详…
  8. android之命令行创建AVD
  9. 【Android(安卓)内存优化】Bitmap 长图加载 ( BitmapRegionDecod

随机推荐

  1. android 缓存管理与常用算法
  2. Android(安卓)自定义View界面大合集
  3. 东拼西凑写的android 相机例子,包含一些遇
  4. 开发一个 Android(安卓)双人视频社(shuai)
  5. Android中利用ContentResolver获取本地音
  6. 牛B的Android(安卓)UI--第18章 与用户交
  7. [置顶] Android下通过pocketsphinx实现离
  8. Android(安卓)5.0 权限管理导致的apk安装
  9. 【Android(安卓)Training - 06】分享数据
  10. 改变Android状态栏字体为黑色