使用Gradle管理你的Android Studio工程

来源:互联网 发布:淘宝上传宝贝图片大小 编辑:程序博客网 时间:2024/06/08 23:10

使用Android Studio新建一个工程之后,其目录结构是这样的:

├── app #Android App目录│   ├── app.iml│   ├── build #构建输出目录│   ├── build.gradle #构建脚本│   ├── libs #so相关库│   ├── proguard-rules.pro #proguard混淆配置│   └── src #源代码,资源等├── build│   └── intermediates├── build.gradle #工程构建文件├── gradle│   └── wrapper├── gradle.properties #gradle的配置├── gradlew #gradle wrapper linux shell脚本├── gradlew.bat├── LibSqlite.iml├── local.properties #配置Androod SDK位置文件└── settings.gradle #工程配置

项目目录下的build.gradle文件,一个顶级的build配置文件,为所有project以及module配置一些常用的配置。

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {    repositories {        jcenter()//使用jcenter库    }    dependencies {        // 依赖android提供的1.1.0的gradle build        classpath 'com.android.tools.build:gradle:1.1.0'        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}//为所有的工程的repositories配置为jcentersallprojects {    repositories {        jcenter()    }}

app目录下的build.gradle文件是该project的配置。

apply plugin: 'com.android.application'android {    compileSdkVersion 21    buildToolsVersion "22.0.1"    defaultConfig {        applicationId "org.flysnow.demo"        minSdkVersion 9        targetSdkVersion 21        versionCode 1        versionName "1.0"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile 'com.android.support:appcompat-v7:22.0.0'}

配置应用的签名信息

在android.signingConfigs{}下定义一个或者多个签名信息,然后在buildTypes{}配置使用即可。

android {    signingConfigs {        release {            storeFile file("release.keystore")            keyAlias "release"            keyPassword "123456"            storePassword "123456"        }        debug {            ...        }    }    buildTypes {        release {            signingConfig signingConfigs.release        }        debug {            signingConfig signingConfigs.debug        }    }  }

storeFile是签名证书文件,keyAlias是别名,keyPassword是key的密码,storePassword是证书的密码。配好好相关信息即可在buildTypes配置使用。

启用proguard混淆

可以为不同的buildTypes选择是否启用混淆,一般release发布版本是需要启用混淆的,这样别人反编译之后就很难分析你的代码,而我们自己开发调试的时候是不需要混淆的,所以debug不启用混淆。对release启用混淆的配置如下:

android {    buildTypes {        release {            minifyEnabled true            proguardFile 'proguard.cfg'        }   }}

minifyEnabled为true表示启用混淆,proguardFile是混淆使用的配置文件,这里是module根目录下的proguard.cfg文件

启用zipAlign

在buildTypes里配置,可以为不用的buildTypes选择时候开启zipAlign

android {    buildTypes {        release {            zipAlignEnabled true        }   }}

多渠道打包

android  {    productFlavors {        dev{        }        google{        }        baidu{        }    }}

这样当我们运行assembleRelease的时候就会生成3个release包,分别是dev、google以及baidu的。目前看这三个包除了文件名没有什么不一样,因为我们还没有定制,使用的都是defaultConfig配置。这里的flavor和defaultConfig是一样的,可以自定义其applicationId、versionCode以及versionName等信息,比如区分不同包名:

android  {    productFlavors {        dev{            applicationId "org.flysnow.demo.dev"        }        google{            applicationId "org.flysnow.demo.google"        }        baidu{            applicationId "org.flysnow.demo.baidu"        }    }}

AndroidManifest里的占位符

AndroidManifest.xml这是一个很重要的文件,我们的很多配置都在这里定义。有时候我们的一些配置信息,比如一个第三方应用的key,第三方统计分析的渠道号等也要在这里进行配置。这里以友盟统计分析平台为例,演示这一功能的使用。在友盟统计分析中,我们需要根据渠道进行统计,比如google,百度,应用宝等渠道的活跃新增等,友盟的SDK是在AndroidManifest里配置一个name为UMENG_CHANNEL的meta-data,这样这个meta-data的值就表示这个apk是哪个渠道,我们版本发布有几十个渠道,以前ant打包的时候是采用文字替换的办法,现在Gradle有更好的处理办法,那就是manifestPlaceholders,它允许我们动态替换我们在AndroidManifest文件里定义的占位符。

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

如上${UMENG_CHANNEL_VALUE}就是一个占位符,然后我们在gradle的defaultConfig;里这样定义脚本:

android {    defaultConfig {        manifestPlaceholders = [UMENG_CHANNEL_VALUE: 'dev']    }}

以前的意思就是我们的默认配置里AndroidManifest的${UMENG_CHANNEL_VALUE}占位符会被dev这个字符串所替换,也就说默认运行的版本是一个开发板。以此类推,我们其他渠道的版本就可以这样定义:

android  {    productFlavors {        google{            applicationId "org.flysnow.demo.google"            manifestPlaceholders.put("UMENG_CHANNEL_VALUE",'google')        }        baidu{            applicationId "org.flysnow.demo.baidu"            manifestPlaceholders.put("UMENG_CHANNEL_VALUE",'baidu')        }    }}

这样有多少个渠道就做多少次这样的定义,即可完成分渠道统计。但是如果上百个渠道,这样一个个写的确太累,很麻烦,我们继续研究,同学们有没有发现,我们的渠道名字和我们的flavorName一样,我们用这个flavorName作为UMENG_CHANNEL_VALUE不就好了吗,可以批量的替换吗?当然可以,这又体现了我们Gradle的强大和灵活之处。

productFlavors.all { flavor ->        manifestPlaceholders.put("UMENG_CHANNEL_VALUE",name)    }

自定义你的BuildConfig

BuildConfig.java是Android Gradle自动生成的一个java类文件,无法手动编译,但是可以通过Gradle控制,也就是说他是动态可配置的,有了这个功能就很好玩了,这里以生产环境和测试环境为例来说明该功能的使用。

我们在开发App的时候免不了要和服务器进行通信,我们的服务器一般都有生产和测试环境,当我们处理开发和测试的时候使用测试环境进行调试,正式发布的时候使用生成环境。以前的时候我们通过把不同的配置文件打包进APK中来控制,现在不一样了,我们有更简便的方法,这就是buildConfigField。

android {    defaultConfig {        buildConfigField 'String','API_SERVER_URL','"http://test.flysnow.org/"'    }    productFlavors {        google{            buildConfigField 'String','API_SERVER_URL','"http://www.flysnow.org/"'        }        baidu{            buildConfigField 'String','API_SERVER_URL','"http://www.flysnow.org/"'        }    }}

buildConfigField 一共有3个参数,第一个是数据类型,就是你定义的常量值是一个什么类型,和Java的类型是对等的,这里是String。第二个参数是常量名,这里是API_SERVER_URL。第三个参数是常量值。如此定义之后,就会在BuildConfig.java中生成一个常量名为API_SERVER_URL的常量定义。默认配置的生成是:

public final static String API_SERVER_URL = "http://test.flysnow.org/"

当是baidu和google渠道的时候生成的就是http://www.flysnow.org/了。这个常量可以在我们编码中引用。在我们进行打包的时候会根据Gradle配置动态替换。

我们发现一般渠道版本都是用来发布的,肯定用的是生产服务器,所以我们可以使用批处理来搞定这个事情,而不用在一个个渠道里写这些配置。

productFlavors.all { flavor ->        buildConfigField 'String','API_SERVER_URL','"http://www.flysnow.org/"'    }

此外,比如Gradle的resValue,也是和buildConfigField,只不过它控制生成的是资源,比如我们在android的values.xml定义生成的字符串。可以用它来动态生成我们想要的字符串,比如应用的名字,可能一些渠道会不一样,这样就可以很灵活的控制自动生成。

dexOptions javaMaxHeapSize

在Gradle 进行dex的可能会遇到内存不够用的情况,错误信息大概是java.lang.OutOfMemoryError: GC overhead limit exceeded。这个时候只需要配置dexOptions的javaMaxHeapSize大小即可,我这里配置4g:

dexOptions {    javaMaxHeapSize "4g"}

原文链接:

使用Gradle管理你的Android Studio工程

1 0
原创粉丝点击