Android Gradle知识点总结

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.gradle
ext {
    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总指定渠道名称

<meta-data android:value= "Channel ID" android:name= "UMENG_CHANNEL"/>

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支持:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值