整理build.gradle
发布日期:2021-05-07 10:20:49 浏览次数:18 分类:原创文章

本文共 11144 字,大约阅读时间需要 37 分钟。

零、一些概念:


1.Gradle是什么?


 解释一:Gradle其实就是一个构建项目的工具,即把一堆堆的目录、文件按照一定的规则关联起来,形成一个项目的自动化构建工具。


解释二:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。


gradle版本,如gradle-5.4.1-all.zip


位置:项目主目录: gradle 文件夹->wrapper->gradle-wrapper.properties


#Mon Feb 17 09:51:13 GMT+08:00 2020distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

2、Gradle插件又是什么?


解释:其实应该是AndroidStudio Gradle Plugin,也就是AndroidStudio用于开发Android项目的gradle插件


Gradle插件是针对Gradle发行版和Android SDK Build Tools封装的一个工具,主要有两大功能:



  1. 调用Gradle本身的代码和批处理工具来构建项目

  2. 调用Android SDK的编译、打包功能


位置:项目下的 build.gradle 中


buildscript {    ext.kotlin_version = '1.3.50'        dependencies {        classpath 'com.android.tools.build:gradle:3.5.3'        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}

3.Android SDK Build Tools Version:Android SDK 构建工具版本


位置:在模块下的build.gradle->android{...}中


android {    compileSdkVersion 29    buildToolsVersion "29.0.3"}

4.依赖关系


明确概念:



  • Gradle Plugin Version: Gradle 插件版本


  • Gradle Version: Gradle发行版本


  • Android SDK Build Tools Version:Android SDK 构建工具版本



三者依赖关系



  1. Gradle Plugin 有不同的版本号。 即我们常见的:classpath 'com.android.tools.build:gradle:3.0.1'】,
    每个插件版本号又对应一个或一些 Gradle 发行版本【即我们常见的:gradle-4.1-all.zip】如果这两个版本对应不上了,那么构建项目的时候就会报错。

  2. Gradle Plugin 还和 Android SDK BuildTool 有关联,因为它还负责和编译相关的功能,这也是为何我们要在 build.gradle 里注明 buildToolsVersion 的原因。这也是我们要在项目的 local.properties 文件里写明Android SDK路径、在build.gradle 里注明 buildToolsVersion 的原因。Android Gradle Plugin 本质上就是 一个AS的插件,它一边调用 Gradle本身的代码和批处理工具来构建项目,一边调用Android SDK的编译、打包功能,从而让我们能够顺畅地在AS上进行开发。


更多详情以及Android Gradle 插件版本所需的 Gradle 版本对应关系看官方文档:



下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本。为了获得最佳性能,应使用 Gradle 和插件这两者的最新版本。





































































插件版本 所需的 Gradle 版本
1.0.0 - 1.1.3 2.2.1 - 2.3
1.2.0 - 1.3.1 2.2.1 - 2.9
1.5.0 2.2.1 - 2.13
2.0.0 - 2.1.2 2.10 - 2.13
2.1.3 - 2.2.3 2.14.1+
2.3.0+ 3.3+
3.0.0+ 4.1+
3.1.0+ 4.4+
3.2.0 - 3.2.1 4.6+
3.3.0 - 3.3.3 4.10.1+
3.4.0 - 3.4.3 5.1.1+
3.5.0 - 3.5.4 5.4.1+
3.6.0 - 3.6.4 5.6.4+
4.0.0+ 6.1.1+
4.1.0+ 6.5+

 


一、已经约定好的一些关键字配置:


1.


apply plugin: 'com.android.application'apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'

  apply plugin:用来指定应用的是哪个插件/脚本。.




  • com.android.application:Android APP

  • com.android.library:仅Android模块引用的,需要设置成这个。



 2.


android {...}

 用来指定Android打包插件的相关属性。


3.


compileSdkVersion 28//或者将 数字 配置到别的地方然后进行调用,详情看另一篇博文compileSdkVersion var.compileSdkVersioncompileSdkVersion rootProject.ext.android.compileSdkVersioncompileSdkVersion  ${System.env.xx}

compileSdkVersion:设置编译时用的Android版本


4.


buildToolsVersion 29.0.3

buildToolsVersion:设置编译时使用的构建工具的版本(默认可以不设置)


5.defaultConfig


defaultConfig:设置一些默认属性,其可用属性是buildTypes和ProductFlavors之和,具体直接看着两个属性内的属性。


6.sourceSets


sourceSets {    main.java.srcDirs += 'src/main/kotlin'}

配置相关源文件的位置,当你的项目的目录结构跟默认的有区别但又不想改的时候sourceSets就派上用场了.




  • aidl     设置aidi的目录

  • assets     设置assets资源目录

  • compileConfigurationName     The name of the compile configuration for this source set.

  • java     Java源代码目录

  • jni     JNI代码目录

  • jniLibs     已编译好的JNI库目录

  • manifest     指定清单文件

  • name     The name of this source set.

  • packageConfigurationName     The name of the runtime configuration for this source set.

  • providedConfigurationName     The name of the compiled-only configuration for this source set.

  • renderscript     Renderscript源代码目录

  • res     资源目录

  • setRoot(path)     根目录



 7.signingConfigs:配置签名信息


另外,如何签名请看另一篇博文:




  • keyAlias     签名的别名

  • keyPassword     密码

  • storeFile     签名文件的路径

  • storePassword     签名密码

  • storeType     类型



signingConfigs {  release {      storeFile file(props['KEYSTORE_FILE'])      keyAlias props['KEY_ALIAS']      storePassword props['KEYSTORE_PWD']      keyPassword props['KEY_PWD']  }  debug {      storeFile file("KeyStore/eim-android.keystore")      storePassword "545468222"      keyAlias "eim-android"      keyPassword "545468222"  }  deba{     setSigningProperties()  }}def setSigningProperties() {    def currentFlavor = getCurrentFlavor()    def flavorBuildPro = "app/src/${currentFlavor}/buildConfigs/build.properties"    def defaultBuildPro = "app/src/main/buildConfigs/build.properties"    def props = new Properties()    if(project.rootProject.file(flavorBuildPro).exists()) {        props.load(project.rootProject.file(flavorBuildPro).newDataInputStream())    } else {        props.load(project.rootProject.file(defaultBuildPro).newDataInputStream())    }    android.signingConfigs.release.storeFile = file(props['STORE_FILE'])    android.signingConfigs.release.storePassword = props['STORE_PASSWORD']    android.signingConfigs.release.keyAlias = props['KEY_ALIAS']    android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']}def getCurrentFlavor() {    Gradle gradle = getGradle()    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()    Pattern pattern    if( tskReqStr.contains( "assemble" ) )        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")    else        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")    Matcher matcher = pattern.matcher( tskReqStr )    if( matcher.find() ) {        println ("getCurrentFlavor()-> " +  matcher.group(1).toLowerCase())        return matcher.group(1).toLowerCase()    }    else    {        println "getCurrentFlavor()->  NO MATCH FOUND"        return ""    }}

区别各版本。其中:props['KEY_ALIAS']等常量就到对应的build.properties下找,eg:


STORE_PASSWORD=564781561KEY_ALIAS=eim-androidKEY_PASSWORD=564781561STORE_FILE=src/main/buildConfigs/eim-android.keystore

 8.buildTypes:配置构建类型,可打出不同类型的包,默认有debug,可以自行增加release{..}等。


以下的属性,在defaultConfig 和 ProductFlavors 中基本同样适用




  • applicationIdSuffix     修改applicationId,在默认applicationId的基础上加后缀。在buildType中修改applicationId时只能加后缀,不能完全修改

  • debuggable     设置是否生成debug版的APK

  • jniDebuggable     设置生成的APK是否支持调试本地代码

  • minifyEnabled     设置是否执行代码混淆

  • multiDexEnabled     Whether Multi-Dex is enabled for this variant.

  • renderscriptDebuggable     设置生成的APK是否支持调试RenderScript代码

  • renderscriptOptimLevel     设置RenderScript优化级别

  • signingConfig     设置签名信息

  • versionNameSuffix     修改版本名称,在默认版本名称的基础上加后缀。在buildType中修改版本名称时只能加后缀,不能完全修改

  • zipAlignEnabled     设置是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率(类比于ssd的4k对齐)

  • proguardFile(proguardFile)     添加一个混淆文件

  • proguardFiles(proguardFileArray)     添加多个混淆文件

  • setProguardFiles(proguardFileIterable)     设置多个混淆文件



release{    applicationIdSuffix ".beta"    debuggable false    signingConfig signingConfigs.release     multiDexEnabled false    minifyEnabled false    zipAlignEnabled false    shrinkResources false    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}

再详细说一下multiDexEnabled这个属性:



64K 引用限制问题官方文档 



 



  • 类型:Boolean

  • 描述:是否开启分包。因为安卓中方法索引值为两个字节,四位十六进制的一个数值,即[0, 0xffff],所以最大方法数为65536个。一旦超出了,就需要进行分包,所以我们就需要开启这个参数。

  • 使用方法:
    android{	buildTypes {		debug {			multiDexEnabled true			...		}	}}// 添加依赖dependencies {	// 如果使用的为 AndroidX,则使用下面这个导入	// implementation 'androidx.multidex:multidex:2.0.1'	// 如果不使用 AndroidX,则使用下面这段    compile 'com.android.support:multidex:1.0.3'}


 有两种开启 MultiDex 方法:


// 第一种:让你应用的 Application 继承 MultiDexApplication。public class MyApplication extends MultiDexApplication {}// 第二种:重写应用的 Application 方法 attachBaseContextpublic class MyApplication extends Application {    @Override    protected void attachBaseContext(Context base) {        super.attachBaseContext(base);        MultiDex.install(this);    }}

 最后别忘了在 AndroidManifest.xml 中使用我们在上面的 Application。


 9.productFlavors:配置不同风格的APP,在buildTypes的基础上还可以让每一个类型的APP拥有不同的风格,所以最终打出的APK的数量就是buildTypes乘以productFlavors。常说的马甲包就是通过这两种方式结合生成的。


以下的属性,在defaultConfig 和 ProductFlavors 中基本同样适用




  • applicationId     设置应用ID

  • testApplicationId     设置测试时的应用ID

  • testFunctionalTest     See instrumentation.

  • testHandleProfiling     See instrumentation.

  • testInstrumentationRunner     Test instrumentation runner class name.

  • versionCode     设置版本号

  • versionName     设置版本名称

  • minSdkVersion(int minSdkVersion)     设置兼容的最小SDK版本

  • minSdkVersion(String minSdkVersion)     设置兼容的最小版本

  • targetSdkVersion(int targetSdkVersion)     设置目标SDK版本

  • targetSdkVersion(String targetSdkVersion)     设置目标SDK版本



normal {   applicationId "com.example.android.test"   versionCode 282   versionName "3.10.0"   applicationIdSuffix ".beta"   signingConfig signingConfigs.release   buildConfigField "boolean", "IS_BETA", "false"   manifestPlaceholders = [app_icon      : "@mipmap/ic_launcher",                        app_icon_round: "@mipmap/ic_launcher_round"]   buildConfigField "int", "CHANNELID", "100"   buildConfigField "boolean", "ENABLE_QA", "true"}

 上升涉及到的 buildConfigField 可以查看一下这篇文章 


10.testOptions:设置测试相关属性




  • reportDir     设置测试报告的目录

  • resultsDir     设置测试结果的目录



11.aaptOptions:设置AAPT的属性




  • failOnMissingConfigEntry     Forces aapt to return an error if it fails to find an entry for a configuration.

  • ignoreAssets     Pattern describing assets to be ignore.

  • noCompress     Extensions of files that will not be stored compressed in the APK.

  • useNewCruncher     Whether to use the new cruncher.



 12.intOptions:设置Lint的属性


(挺多的,不罗列,可以直接去看官网)


 lintOptions {    disable 'GoogleAppIndexingWarning', 'HardcodedText', 'InvalidPackage'    textReport true    textOutput "stdout"    abortOnError false //设置是否在lint发生错误时终止构建    // if true, only report errors    ignoreWarnings true}

13.flavorDimensions


 这个涉及到的是:。如果不做这个设置的话,可以不搞。


14.dexOptions




  • incremental     Whether to enable the incremental mode for dx. This has many limitations and may not work. Use carefully.

  • javaMaxHeapSize     Sets the -JXmx* value when calling dx. Format should follow the 1024M pattern.

  • jumboMode     Enable jumbo mode in dx (--force-jumbo).

  • preDexLibraries     Whether to pre-dex libraries. This can improve incremental builds, but clean builds may be slower.



dexOptions {    javaMaxHeapSize "2g"    jumboMode = true}

15.compileOptions:设置编译的相关属性




  • sourceCompatibility     Language level of the source code.

  • targetCompatibility     Version of the generated Java bytecode.



compileOptions {   sourceCompatibility JavaVersion.VERSION_1_8   targetCompatibility JavaVersion.VERSION_1_8}

16.packagingOptions:设置APK包的相关属性




  • excludes     The list of excluded paths.

  • pickFirsts     The list of paths where the first occurrence is packaged in the APK.

  • exclude(path)     Adds an excluded paths.

  • pickFirst(path)     Adds a firstPick path. First pick paths do get packaged in the APK, but only the first occurrence gets packaged.



exclude,过滤掉某些文件或者目录不添加到APK中,作用于APK,不能过滤aar和jar中的内容。
比如:


packagingOptions {    exclude 'META-INF/**'    exclude 'lib/arm64-v8a/libmediaplayer.so'}



pickFirst,匹配到多个相同文件,只提取第一个。只作用于APK,不能过滤aar和jar中的文件。
比如:


 packagingOptions {    pickFirst "lib/armeabi-v7a/libaaa.so"    pickFirst "lib/armeabi-v7a/libbbb.so"  }



doNotStrip,可以设置某些动态库不被优化压缩。
比如:


 packagingOptions{    doNotStrip "*/armeabi/*.so"    doNotStrip "*/armeabi-v7a/*.so" }


merge,将匹配的文件都添加到APK中,和pickFirst有些相反,会合并所有文件。
比如:


packagingOptions {    merge '**/LICENSE.txt'    merge '**/NOTICE.txt'}

17.dependencies:配置依赖


dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    implementation fileTree(include: ['*.aar'], dir: 'libs')    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"    implementation 'androidx.appcompat:appcompat:1.0.2'    implementation 'androidx.core:core-ktx:1.0.2'    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'}

ref:


1.


2.


3..


 


 

上一篇:Android 键盘快捷键
下一篇:整理Markdown快捷键

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月07日 20时12分45秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章