Android Gradle详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang_yong_hui_1234/article/details/78824676

了解Gradle配置对于我们日常开发太重要了,我们要知道为什么要这样配置,这样配置的优缺点,不能盲目。

一,默认配置

1,defaultConfig是Android对象中默认配置,它是一个ProductFlavor。默认配置有包名,版本号,版本名称等信息

android{
   compileSdkVersion 23
   buildToolsVersion "23.0.1"
  
  defaultConfig{
     applicationId "com.example.test"
     minSdkVersion 14
     targetSdkVersion 23
     versionCode 1
     versionName "1.0"
//......
}
}

2,applicationId是ProductFlavor的一个属性,用于生成App包名,等同于AndroidManifest.xml文件中配置的manifest标签的package属性值。

3,minSdkVersion是ProductFlavor的一个方法,是App最低支持Android操作系统的版本。

4,targetSdkVersion用于配置基于哪个Android SDK开发。

5,versionCode用于配置App内部版本号,通常用于版本升级。

6,versionName用于配置App的版本名称,是让用户知道当前的版本。

7,配置签名信息

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    signingConfigs{
        debug{
            storeFile file("test.keystore")
            storePassword "password"
            keyAlias "test"
            keyPassword "password"
        }
        release{
            storeFile file("test.keystore")
            storePassword "password"
            keyAlias "test"
            keyPassword "password"
        }
    }
    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }


}

8,minifyEnabled 开启代码混淆

9,multiDexEnabled 方法超限,启动拆分多个Dex

10,proguardFiles 混淆配置文件,可以配置多个

11,shrinkResources 自动清理未使用的资源

12,zipAlignEnabled 整理优化apk

二,Gradle高级用法

1,批量修改apk文件名,AS 3.0之前版本和之后版本写法不同

apply plugin: 'com.android.application'
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    dataBinding {
        enabled = true
    }
    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            zipAlignEnabled true
        }
    }
    applicationVariants.all { variant ->
        variant.outputs.all { output -> // AS 3.0之后版本 each 改为 all
            def fileName = "${buildTime()}_release.apk"
            def outFile = output.outputFile
            if (outFile != null && outFile.name.endsWith('.apk')) {
                outputFileName = fileName// AS 3.0之后版本 output.outputFile 改为 outputFileName
            }
        }
    }

}

def buildTime() {
    def date = new Date()
    def formattedDate = date.format('yyyyMMdd')
    return formattedDate
}

2,隐藏签名文件信息

apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion "26.0.2"

    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
        }
    }
    buildTypes {
        signingConfig signingConfigs.release
        zipAlignEnabled true
    }
}

3,动态配置AndroidManifest文件

Android Gradle提供了manifestPlaceholder占位符,用来替换AndroidManifest文件中的内容。比如:我们在用友盟第三方统计需要指定渠道名,这时我们就用到了占位符。

AndroidManifest文件中,第三方统计指定渠道名。${UMENG_CHANNEL}就是一个占位符

<meta-data android:value="${UMENG_CHANNEL}" android:name="UMENG_CHANNEL"/>

build.gradle中定义两个渠道,xiaomi和baidu,配置manifestPlaceholders。key都是UMENG_CHANNEL,在构建的时候会把AndroidManifest中的UMENG_CHANNEL占位符替换成manifestPlaceholders中对应的value值

android {
    compileSdkVersion 23
    buildToolsVersion "26.0.2"
    productFlavors{
        xiaomi{
            manifestPlaceholders.put("UMENG_CHANNEL","xiaomi")
        }
        baidu{
            manifestPlaceholders.put("UMENG_CHANNEL","baidu")
        }
    }

}

如果渠道非常多,每个渠道都得 指定渠道名,这样未免太麻烦,不过还有更好的方式。all函数遍历所有productFlavors,把name作为友盟渠道名。

android {
    compileSdkVersion 23
    buildToolsVersion "26.0.2"
    productFlavors {
        xiaomi {
        }
        baidu {
        }
    }
    productFlavors.all { flavor ->
        mManifestPlaceholders.put("UMENG_CHANNEL", name)
    }

}

4,自定义BuildConfig
BuildConfig是Gradle构建时自动生成的,我们是如何使用它呢。比如我们打包时有debug和release版本,debug需要显示log信息,release版本需要隐藏log信息,那么我们打包时不用改代码就能知道需要关闭还是打开log

在build.gradle进行配置 buildConfigField 数据类型 名称 值

  buildTypes {
        debug {
            buildConfigField "boolean", "type", "true"
        }
        release {
            buildConfigField "boolean", "type", "false"
            minifyEnabled true//是否启动混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

在项目中直接调用BuildConfig

   if(BuildConfig.type){
            //打开log
        }else{
            //关闭log
        }

5,动态添加资源和图片
现在有个需求,不同的渠道包app图标不同,文字也不同。小米渠道显示的是小米,百度的渠道显示的是百度。通过resValue可以动态配置string资源,不同的渠道资源不同。resValue 数据类型 名称 值,调用的时候就想调用strings.xml中的资源一样。manifestPlaceholders替换AndroidManifest中的icon,首先在 android:icon="${app_icon}"中定义占位符app_icon,然后manifestPlaceholders中引用即可

 productFlavors {
        xiaomi {
            resValue 'string', 'name', 'xiaomi'
            // 修改 AndroidManifest.xml 里的icon
            manifestPlaceholders = [app_icon: "@mipmap/ic_launcher_xiaomi"]
        }
        baidu {
            resValue 'string', 'name', 'baidu'
             // 修改 AndroidManifest.xml 里的icon
            manifestPlaceholders = [app_icon: "@mipmap/ic_launcher_baidu"]
        }
    }

6,JAVA编译选项

在我们编译代码的时候,如果对JDK的版本有要求或者是编码格式有要求,那我们也可以进行配置。

compileOptions {
    encoding = 'utf-8'
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

猜你喜欢

转载自blog.csdn.net/wang_yong_hui_1234/article/details/78824676