程序员

Gradle for android-配置文件

2018-09-29  本文已影响57人  crossroads

前言

在Android Studio下直接创建一个新的项目就可以使用啦!

一、Gradle设置文件

settings.gradle用于指示 Gradle 在构建应用时应将哪些模块包括在内。这里只包含了app模块

include ':app'

二、顶级构建文件

看项目下project的build.gradle,位于项目根目录

//buildscript为gradle本身配置仓库(repositories)和依赖(dependencies
buildscript{
    //ext 添加自定义属性
    ext.kotlin_version = '1.2.50'
//gradle用这个仓库搜索或下载依赖
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
//gradle构建项目需要使用的依赖
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

//项目中所有模块会用到的依赖,例如第三方的插件或库,
// 不是所有模块都会用到的依赖,应该放在模块的build.gradle中。
//这里只将都用到的仓库放在这里,而不配置任何一个依赖。
allprojects {
    repositories {
        google()
        jcenter()
    }
}

三、模块级构建文件

用于配置所在模块的构建设置

//应用插件
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

//配置构建项
android {
    //编译版本,填写Android的版本号
    compileSdkVersion 27
    //build工具的版本号,Android系统每次添加新特性,就需要使用新的工具来build
    // buildToolsVersion的版本需要>=CompileSdkVersion.
    buildToolsVersion "28.0.3"
    //默认配置,也可以重写AndroidManifest.xml的一些属性
    //在需要多个版本时,可以被重写
    defaultConfig {
        //applicationId唯一识别发布的包名,当然源代码仍然使用AndroidManifest.xml中定义的包名
        applicationId "com.example.crossroads.aa"
        //最小sdk版本,即APP最低支持的手机版本
        minSdkVersion 21
        //指定API目标版本,要 <= compileSdkVersion。
        // 如果来不及配置新的特性和系统,将其设置小一点。例如,如果不想动态申请权限,就将targetSdkVersion写成23以下,
        //如果是>=23,就需要申请动态权限了。
        targetSdkVersion 26
        //APP的版本号
        versionCode 1
        //APP的版本名
        versionName "1.0"
      //允许方法数目超过64K,minsdk小于21的,需要添加multidex依赖,这里不展开讲解
        multiDexEnabled true
        //使用AndroidJUnitRunner进行测试
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    // 配置多种构建类型,默认有release和debug这两个类型
    //debug在我们生成的默认配置中没有明确显示,但它已经包含了debug相关工具并用debug key进行签名
    //release运用proguard的设置,默认没有签名。
    buildTypes {
        release {
           //是否进行资源压缩
           shrinkResources true
            //是否进行混淆
            minifyEnabled false
            //混淆文件的位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //flavor维度,可以有多个
    flavorDimensions ('money','package')

    //productFlavors对一套代码进行生成多个不同版本的apk,
    // 当要求一套代码生成多个APP的时候,就可以用这个哦
    //这里的配置可以覆盖defaultConfig
    productFlavors {
        //A APP
        productA {
            //配置A产品的applicationId
            applicationIdSuffix ".A"
            dimension 'package'
        }
        //B APP
        productB {
            //配置B产品的applicationId,这样就相当于是两个APP了。
            applicationIdSuffix ".B"
            dimension 'package'
        }
        free{
            dimension 'money'
        }
        vip{
            dimension 'money'
        }
    }

    //APK拆分,只支持按照屏幕密度和ABI拆分,
    // 使用这个需要让每一个APK拥有不同的versionCode
    //这个开发期间没用过,不做详解,感兴趣的可以自行搜索APK拆分。
//    splits {
//        //按屏幕密度拆分
//        density {
//            enable false //启用屏幕密度拆分机制
//        }
//        abi {
//            enable false //启用ABI拆分机制
//        }
//    }

}

//模块级别的依赖,后续详解
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:design:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

这里有一个dimension,是维度的意思,维度相同的包是互斥的,不同的包可以相互结合,见下图

四、新增构建类型

    buildTypes {
     ......
        beta {
           // 复制调试属性和debug签名
            initWith debug
            versionNameSuffix 'b'
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            //指定替代匹配,beta构建类型在库依赖项中没有响应配置,将会使用matchingFallbacks中第一个可用的配置。
            matchingFallbacks = ['release', 'debug']
        }
    }

对每个构建类型重命名

  buildTypes {
        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                outputFileName = "aa-${variant.flavorName}-${variant.buildType.name}-${variant.versionName}-${variant.versionCode}.apk"
            }
        }
  }

这里我们输入命令./gradlew clean installfreeProductBDebug
,可以看到在outputs中会有aa-freeProductB-debug-1.0-1.apk文件,这就是我们重命名后的包。

五、过滤变体

将freeProductADebug和freeProductARelease过滤掉

 variantFilter{variant->
      def names =variant.flavors*.name
        if(names.contains("freeProductA")){
            setIgnore(true)
        }
    }

六、重写AndroidManifest.xml一些属性

AndroidManifest.xml中重写ACCESS_ID

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

build.gradle中这样写:

android {
    defaultConfig {
       manifestPlaceholders = [
          ACCESS_ID:123456
        ]
    }
    ...
}

如果对于不同的构建类型,这样写

   buildTypes {
        release {
            ......
            manifestPlaceholders=[
                    ACCESS_ID:123456     
            ]
        }
    }

七、配置项目范围的属性

在项目级别定义的属性,可以在所有模块中使用

project的build.gradle

ext {
    compileSdkVersion = 27
}

模块的build.gradle

 compileSdkVersion rootProject.ext.compileSdkVersion

这样子感觉有点长,那还有一个方式,放在gradle.properties中,也可以被所有模块使用
gradle.properties

BUILD_TOOLS_VERSION=28.0.3

模块的build.gradle

   buildToolsVersion BUILD_TOOLS_VERSION

参考网址

android官网

上一篇 下一篇

猜你喜欢

热点阅读