Gradle for Android

android下可配置项

android {
    defaultConfig {
        //默认配置项,defaultConfig就是程序的默认配置,注意,如果在   AndroidMainfest.xml里面定义了与这里相同的属性,会以这里的为主。
    }

    buildTypes {
      // 编译配置,release或debug版本的内容
    }

    compileOptions {
      // Java 的版本配置
    }

    sourceSets {
        //源码设置(项目目录结构的设置)
    }

    packagingOptions {
       //打包时的相关配置  
    }

    lintOptions {
        //编译的 lint 开关,程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
        //abortOnError false  
    }

    productFlavors {
        //产品发布的一些东西,比如渠道、包名等
        flavor1 {
        }

        flavor2 {
        }
    }

    signingConfigs {
        //签名的配置
        release {
        }
    }

    testOptions{
        //测试配置,TestOptions类型
    } 
    aaptOptions{
      //aapt配置,AaptOptions类型 
    } 
     lintOptions{
       //lint配置,LintOptions类型
    } 
    dexOptions{
       //dex配置,DexOptions类型
    } 
    compileOptions{
     // 编译配置,CompileOptions类型
    } 
    packagingOptions{
       // PackagingOptions类型
    } 
    jacoco{ 
       //JacocoExtension类型。 用于设定 jacoco版本
    } 
    splits{
       //Splits类型。
    } 
}

统一版本管理

顶层build.gradle文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
ext {
    configuration = [
            package          : "com.chm.myapplication",
            buildToolsVersion: "24.0.2",
            compileVersion   : 24,
            minSdk           : 14,
            targetSdk        : 23,
            version_code     : 1,
            version_name     : "0.0.1",
    ]

    libraries = [
            supportVersion    : "24.2.1",
            retrofit2         : "2.1.0",
            rxandroid         : "2.0.1",
            dagger            : "2.1",
            annotation        : "10.0-b28",
            rxjava2_adapter   : "1.0.0",
            javax_annotation  : "10.0-b28",
            butterknife       : "7.0.1",
            glide             : "3.7.0",
            recycler_animators: "2.1.0",
            circleimageview   : "2.0.0",
            eventBus          : "3.0.0",
            gson              : "2.6.2"
    ]
}

buildscript {
    ext.kotlin_version = '1.1.1'
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

module下build.gralde文件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: "kotlin-android-extensions"
apply plugin: 'com.neenbedankt.android-apt'

def cfg = rootProject.ext.configuration // 配置
def libs = rootProject.ext.libraries // 库

android {
    compileSdkVersion cfg.compileVersion
    buildToolsVersion cfg.buildToolsVersion

    defaultConfig {
        applicationId cfg.package
        minSdkVersion cfg.minSdk
        targetSdkVersion cfg.targetSdk
        versionCode 1
        versionName "1.0"

        //buildConfigField管理私有参数, 配置在gradle.properties里面.
        buildConfigField("String", "MARVEL_PUBLIC_KEY", "\"${marvel_public_key}\"")
        println("${marvel_public_key}")

    }
    buildTypes {
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
//    compileOptions {
//        sourceCompatibility JavaVersion.VERSION_1_8
//        targetCompatibility JavaVersion.VERSION_1_8
//    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile "com.android.support:appcompat-v7:${libs.supportVersion}"
    compile "com.android.support:design:${libs.supportVersion}"
    compile "com.android.support:cardview-v7:${libs.supportVersion}"
    compile "org.greenrobot:eventbus:${libs.eventBus}"

    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    compile project(':colorpicker')

    compile "jp.wasabeef:recyclerview-animators:${libs.recycler_animators}" // Recycler动画
    compile "de.hdodenhof:circleimageview:${libs.circleimageview}" // 头像视图

    compile "com.squareup.retrofit2:retrofit:${libs.retrofit2}"
    compile "com.squareup.retrofit2:converter-gson:${libs.retrofit2}"
    compile "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:${libs.rxjava2_adapter}"
    compile "io.reactivex.rxjava2:rxandroid:${libs.rxandroid}"
    // Because RxAndroid releases are few and far between, it is recommended you also
    // explicitly depend on RxJava's latest version for bug fixes and new features.
    compile "io.reactivex.rxjava2:rxjava:${libs.rxandroid}"
    compile "com.github.bumptech.glide:glide:${libs.glide}"
    provided "com.google.dagger:dagger-compiler:${libs.dagger}"
    compile "com.google.dagger:dagger:${libs.dagger}"
    provided "org.glassfish:javax.annotation:${libs.annotation}"
    compile "com.jakewharton:butterknife:${libs.butterknife}"
    compile "com.google.code.gson:gson:${libs.gson}"
}

利用Gradle全局变量,对于多Module有很大的好处,统一版本,管理起来方便。

多渠道打包

比如我们的app需要打包到多个应用市场,如xiaomi,360等。

  • 第一步 在AndroidManifest.xml里配置PlaceHolder
<meta-data
            android:name="MY_CHANNEL"
            android:value="${MY_CHANNEL}" />
  • 第二步 在build.gradle设置productFlavors
productFlavors{
        xiaomi {
            //用gradle修改AndroidManifest.xml中的meta-data元素值
            manifestPlaceholders = [MY_CHANNEL: "xiaomi"]
            applicationId "com.chm.xiaomi"
        }

        _360 {
            manifestPlaceholders = [MY_CHANNEL: "_360"]
            applicationId "com.chm._360"
        }
        baidu {
            manifestPlaceholders = [MY_CHANNEL: "baidu"]
            applicationId "com.chm.baidu"
        }

        huawei{
            manifestPlaceholders = [MY_CHANNEL: "huawei"]
            applicationId "com.chm.huawei"
        }
    }
  • 最后,最好在defaultConfig中定义一个默认的渠道
defaultConfig{
    ...
    manifestPlaceholders = [ MY_CHANNEL:"xiaomi" ]
}

生成如下一下包:

这里写图片描述

挑选其中的一个包(baidu)反编译看一下AndroidManifest.xml文件,MY_CHANNEL被正确赋值,并且包名也被正确赋值(com.chm.baidu)。

这里写图片描述

如果现在需求变更,需要一个free版本,一个price版本,如何打包呢?

android{
    ...

    flavorDimensions 'price','store'
    productFlavors{
        xiaomi{
            flavorDimension "store"
        }

        360{
            flavorDimension "store"
        }

        free{
            flavorDimension "price"
        }

        price{
            flavorDimension "price"
        }
    }
}

flavorDimensions—-是一个数组,store和price代表的2个维度,每个flavor分配到指定的维度中。

这里写图片描述

修改APP名称

  • 渠道包重命名

在build.gradle文件中加入如下代码:

android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                File outputDirectory = new File(outputFile.parent);
                def fileName
                if (variant.buildType.name == "release") {
                    fileName = "chm_${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "chm_${variant.productFlavors[0].name}_beta.apk"
                }
                output.outputFile = new File(outputDirectory, fileName)
            }
        }
    }

生成如下的一些包:

这里写图片描述

  • 根据渠道修改APP名称
buildTypes {
        debug {
            // 显示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
            //重命名
            resValue("string","app_name","DEBUG")
            versionNameSuffix "-debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.debug
        }
        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //重命名
            resValue("string","app_name","RELEASE")
            //混淆
            minifyEnabled true
            //加载默认混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //签名
            signingConfig signingConfigs.release
        }
    }

签名的配置

上面打出的包都是没有指定签名的,我们要配置一个签名,首先需要生成签名文件。我生成的签名文件是1.jks

signingConfigs{
        signR1{
            storeFile file("build/1.jks");
            storePassword "123456"
            keyAlias "xxx"
            keyPassword "123456"
        }
        signR2{
            storeFile file("build/2.jks");
            storePassword "123456"
            keyAlias "xxx"
            keyPassword "123456"
        }
    }

签名在signingConfigs中配置,signR1,signR2是签名的名字,在buildTypes中使用。注意:signingConfigs声明应在buildTypes前面,不然buildTypes中找不到signR1、signR2等属性。

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        r1{
            signingConfig signingConfigs.signR1
            //在包名后面加上了一个后缀r1
            applicationIdSuffix ".r1"
        }
        r2{
            signingConfig signingConfigs.signR2
            applicationIdSuffix ".r2"
        }

    }

动态参数配置

signingConfigs{
        release{
            storeFile file("build/mykey.jks")
            storePassword   "123456"
            keyAlias "123456"
            keyPassword   "123456"
        }
    }

上面的这段配置,有个缺点,就是值直接写死了,我们可以动态配置参数。在哪里配置呢,一开始就说了,在gradle.properties中配置参数。如下:

systemPro.keyAliasPassword=123456
systemPro.keyAlias=123456
systemPro.keyStorePassword=123456
systemPro.keyStore=mykey.jks

配置好了,就可以在相关处使用了。

signingConfigs{
        release{
            storeFile       System.properties["keyStore"]
            storePassword   System.properties["keyStorePassword"]
            keyAlias        System.properties["keyAlias"]
            keyPassword     System.properties["keyAliasPassword"]
        }
    }

gradle.properties文件配置

gradle.properties常见配置比如有:

  • 开启并行编译:加快gradle 的编译
org.gradle.parallel=true
  • 开启编译守护进程:

该进程在第一次启动后回一直存在,当你进行二次编译的时候,可以重用该进程。

org.gradle.daemon=true
  • 加大可用编译内存:
org.gradle.jvmargs=-Xms256m -Xmx1024m

最后,总结一下:

  • build.gradle:控制每个Module的构建过程

  • gradle.properties:配置gradle脚本中的参数

  • local.properties:gradle的SDK和NDK环境变量配置

  • setting.gradle:配置gradle的多项目管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值