build.gradle常见配置方式

来源:互联网 发布:小区网络装iptv服务器 编辑:程序博客网 时间:2024/06/06 20:43
随着Android Studio的横空出世,以及Google大力推荐,使用Gradle编译Android App的小伙伴越来越多,因此我们有必要稍微了解一些使用Gradle编译Android App的常见配置方式。

1、统一配置工程中的compileSdkVersion、buildToolVersion等
为什么要做统一的配置呢?如果我们每个module都分别配置, 当我们工程中引入的module越来越多的时候,如果想再次修改或升级版本,这个时候就需要一个个module修改,实在是麻烦了,使用统一配置,就如同一个全局变量,修改定义的地方,所有使用的地方都生效了,何乐而不为?方法如下:
1)在工程的根目录下的build.gradle配置全局参数,如:
ext {
  compileSdkVersion = 23
  buildToolsVersion = '23.0.1'
  minSdkVersion = '14'
  targetSdkVersion = '22'
  supportLibraryVersion = '24.0.0'
  gradleVersion = '2.0.0-beta7'
}
2)在app或者其它module中使用全局参数,如:
  compileSdkVersion rootProject.compileSdkVersion
  buildToolsVersion rootProject.buildToolsVersion
  minSdkVersion rootProject.minSdkVersion
  targetSdkVersion rootProject.targetSdkVersion

2、gradle.properties配置数据
这个配置文件也非常有用,我们可以用来配置工程的版本代码、版本名称、不同环境下的服务器地址等等,使用方法也很简单,方法如下:
1)在配置文件中定义各种参数,如工程版本代码、名称、测试地址、正式地址等,如下
VERSION_CODE=1
VERSION_NAME=1.0.001
signing_keyAlias=123
signing_certificate =123
signging_certificatePassword =123
signging_storePassword=123
DEBUG_SERVER = "http://www.baidu.com";
RELEASE_SERVER = "http://www.baidu.com";
2)在需要用的地方使用,如build.gradle使用,如下
// 版本号、版本名称
versionCode project.properties['VERSION_CODE'].toInteger()
versionName project.properties['VERSION_NAME']
// 签名配置
signingConfigs {
  debugConfig {
  keyAlias "${signing_keyAlias}"
  keyPassword "${signging_certificatePassword}"
  // 当前表示build.gradle所在文件夹上三层文件夹下的BuildCfg文件夹下的配置文件(路径可以自定义)
  storeFile file("../../../BuildCfg/${signing_certificate}")  
  storePassword "${signging_storePassword}"
  }
}
// 测试环境、正式环境服务器url
buildTypes {
  debug {
  minifyEnabled false
  buildConfigField('String', 'SERVER_URL', project.properties['DEBUG_SERVER'])
  }

  release {
  minifyEnabled false
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  signingConfig signingConfigs.releaseConfig
  buildConfigField('String', 'SERVER_URL', project.properties['RELEASE_SERVER'])
  }
}
3)在源码中使用build.gradle配置的参数,debug包及release包自动使用各自配置的值,如2)中的SERVER_URL:
// 直接使用BuildConfig类获取配置的变量  
String SERVER_URL = BuildConfig.SERVER_URL;

3、修改输出安装包的名称
默认输出的安装包名称常常为app-debug.apk、app-release.apk,如果我们想自定义下输入安装包的名称,比如,添加当前版本号,添加打包的时候等,如app名称_v1.0.0_2017-01-08_release.apk
def releaseTime() {
  return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
// 
applicationVariants.all { variant ->
  variant.outputs.each { output ->
  def outputFile = output.outputFile
  def fileName
  if (outputFile != null && outputFile.name.endsWith('.apk')) {
     if (variant.buildType.name.equals('release')) {
        fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_release.apk"
     } else if (variant.buildType.name.equals('debug')) {
        fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_debug.apk"
     }
     output.outputFile = new File(outputFile.parent, fileName)
  }
  }
}

4、引入libs文件夹下的本地第三方库,如下图中引入libammsdk.jar

// 映射libs文件夹
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}
// 引入第三方库文件
dependencies {
    compile files('libsbammsdk.jar')
}
// 引入armeabli、x86下的.so文件
ndk {
    abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
}

5、忽略lint错误
lintOptions {
    abortOnError false
}

6、突然Dex超出方法数限制
multiDexEnabled true

7、打包时一些配置
minifyEnabled true // 混淆
zipAlignEnabled true // zip align(对齐,排列)优化。
shrinkResources true // 去掉没有用的资源文件

8、 常见的完整的buid.gradle
apply plugin: 'com.android.application'

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android {
    compileSdkVersion rootProject.compileSdkVersion
    buildToolsVersion rootProject.buildToolsVersion

    defaultConfig {
        applicationId "com.android.test"
        minSdkVersion rootProject.minSdkVersion
        targetSdkVersion rootProject.targetSdkVersion
        versionCode project.properties['VERSION_CODE'].toInteger()
        versionName project.properties['VERSION_NAME']

        multiDexEnabled true
        resConfigs "zh" //只保留英语和中文语言,可以减小APK大小
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
        }
    }

    // 导入so文件
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

    signingConfigs {
        release {
            storeFile file("app.jks")
            storePassword "123"
            keyAlias "app"
            keyPassword "123"
        }
    }

    lintOptions {
        abortOnError false
    }

    buildTypes {

        debug {
            minifyEnabled false

            buildConfigField('String', 'SERVER_ADDRESS', project.properties['IP_DEBUG'])
            buildConfigField('int', 'SOCKET_PORT', project.properties['PORT_DEBUG']);
            signingConfig signingConfigs.debug
        }

        release {
            buildConfigField "boolean", "LOG_DEBUG", "false"
            minifyEnabled true // 混淆
            zipAlignEnabled true // zip align(对齐,排列)优化。
            shrinkResources true // 去掉没有用的资源文件
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            buildConfigField('String', 'SERVER_ADDRESS', project.properties['IP_RELEASE'])
            buildConfigField('int', 'SOCKET_PORT', project.properties['PORT_RELEASE']);

            // 更改输出release版的名称
            // app_v[版本号]_[编译日期]_[release/debug].apk,例如:app_v1.0.0_2017-01-09_release.apk
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    def fileName

                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        if (variant.buildType.name.equals('release')) {
                            fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_release.apk"
                        } else if (variant.buildType.name.equals('debug')) {
                            fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_debug.apk"
                        }
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }

//    productFlavors {
//        app{}
//    }
//
//    productFlavors.all {
//        flavor -> flavor.manifestPlaceholders = [FLAVOR_CHANNEL_VALUE : name]
//    }

    signingConfigs {
        debug {
            storeFile file("weixin.keystore")
            storePassword "123"
            keyAlias "spay"
            keyPassword "123"
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
    compile files('libs/libammsdk.jar')
}


0 0
原创粉丝点击