Gradle 是一个基于Ant和Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,这比咱们的ANT使用XML构建配置要灵活的多。在编写配置时,你能够像编程同样灵活,Gradle是基于Groovy的DSL语言,彻底兼容JAVA。javascript
Android Studio是使用Gradle进行自动化构建的IDE,当咱们在Android Studio新建项目的时候,项目的目录大抵以下:html
├── 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 #工程配置复制代码
其中,settings.gradle用于配置project,标明其下有几个module,好比这里包含一个:app module(当咱们使用Android Studio添加一个在当前项目中添加一个module的时候,会自动的在这个文件中将新的module的名字include进来)java
include ':app'复制代码
和settings.gradle在同一目录下的build.gradle是一个顶级的build配置文件,在这里能够为全部project以及module配置一些经常使用的配置。linux
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()//使用jcenter库
}
dependencies {
// 依赖android提供的2.1.2的gradle build
classpath 'com.android.tools.build:gradle:2.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//为全部的工程的repositories配置为jcenters
allprojects {
repositories {
jcenter()
}
}复制代码
在android.signingConfigs{}下定义一个或者多个签名信息,而后在buildTypes{}配置使用便可。例如:android
android {
signingConfigs {
release {
//指定签名用的文件,file对应的根目录是gradle文件所在的根目录
storeFile file("release.keystore")
//别名
keyAlias "release"
//key的密码
keyPassword "123456"
//证书的密码
storePassword "123456"
}
debug {
...
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.debug
}
}
}复制代码
咱们能够为不一样的buildTypes选择是否启用混淆,通常release发布版本是须要启用混淆的,这样别人反编译以后就很难分析你的代码,而咱们本身开发调试的时候是不须要混淆的,因此debug不启用混淆。对release启用混淆的配置以下:git
android{
buildTypes {
release {
//是否启用混淆
minifyEnabled true
//是否去除无效的资源文件,这个设置依赖于minifyEnabled的设置,所以要二者同时设置为true才会生效
shrinkResources true
//getDefaultProguardFile('proguard-android.txt')表示获取SDK下'proguard-android.txt‘文件中的默认混淆规则
//'proguard-rules.pro'表示使用项目根目录下的 'proguard-rules.pro'文件中的混淆规则
//proguard-rules.pro文件名能够任意,只要在配置文件中指明便可
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}复制代码
此处查看更多关于proguard的信息github
zipalign是一款重要的优化apk应用程序的工具。
apk包的本质是一个zip压缩文档,优化的目的是使包内未压缩的数据可以有序的排列,从而减小应用程序运行时的内存消耗.shell
android{
buildTypes {
release {
zipAlignEnabled true
}
}
}复制代码
经过设置productFlavors的值,咱们能够指定不一样的渠道包,而且每一个渠道包能够自定义其applicationId、versionCode以及versionName等信息数据库
android {
productFlavors {
dev{
applicationId "com.gdut.demo.dev"
}
qa{
applicationId "com.gdut.demo.qa"
}
pro{
applicationId "com.gdut.demo.pro"
}
}
}复制代码
manifestPlaceholders,它容许咱们动态替换咱们在AndroidManifest文件里定义的占位符。例如:编程
<meta-data
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}"/>
<meta-data android:name="UMENG_SECRET" android:value="${umeng_app_secret}"/> 而后咱们能够针对不一样的flavors或者buildTypes动态的指定相应的值,例如: buildTypes { debug { manifestPlaceholders = [umeng_app_key: "替代的内容",umeng_app_secret:"替换的内容"] } ... }复制代码
BuildConfig.java是Android Gradle自动生成的一个java类文件,没法手动编译,可是能够经过Gradle控制,也就是说他是动态可配置的。在 gradle 文件 buildTypes 或者 productFlavors 下面,如:
buildTypes {
release{
//release的包中BuildConfig.ENDPOINT 就会被赋值为 http://example.com 就能够供 Java 代码调用了。
buildConfigField "String", "ENDPOINT", "\"http://example.com\""
}
}复制代码
修改 res value 的方式,好比修改 strings.xml 文件中的 AppName 的值。在gradle文件 buildTypes 或者 productFlavors 下面,如:
buildTypes{
release{
//将release的包中名为 AppName 的 string value 值改成 app1
resValue "string", "AppName", "app1"
}
}复制代码
咱们除了能够经过设置buildtypes来进行分类打包以外,还能够根据屏幕大小、cpu架构适配类型来进行分类打包,经过使用splits咱们能够达成这个目的,例如
splits {
density {
enable true
reset()
include "mdpi", "hdpi"
}
abi {
enable true
reset()
include "x86", "mips"
}
}复制代码
更多的使用状况以及使用说明请参考android的官方文档:Configure APK Splits
Android设定的方法数是65536个(DEX 64K problem),超过这个方法数,致使dex没法生成,就没法生成APK.处理这个问题,除了尽量的进行apk瘦身,减小整个apk的方法数以外,能够进行两种设置进行解决。
1. 使用multiDex。开启分包模式
defaultConfig {
multiDexEnabled=true
}
2. 忽略方法数的检查。2.3版本及如下的手机没法正常安装
android {
dexOptions {
jumboMode = true
}复制代码
dependencies {
compile fileTree(include: '*.jar', dir: 'libs')
compile project(':pullrefresh')
prodCompile files('src/prod/libs/bankcard-encrypt.jar')
debugCompile files('src/qa/libs/bugrpt.jar')
}复制代码
compile配置将被用于编译main application。它里面的全部东西都被会被添加到编译的classpath中,同时也会被打包进最终的APK。 如下是添加依赖时可能用到的其它一些配置选项:
compile main application(主module)。
androidTestCompile test application(测试module)
debugCompile debug Build Type(debug类型的编译)
prodCompile prod productFlavors(prod渠道的编译)复制代码
由于没有可能去构建一个没有关联任何BuildType(构建类型)的APK,APK默认配置了两个或两个以上的编译配置:compile和< buildTypes >Compile. 建立一个新的buildTypes或者productFlavors将会自动建立一个基于它名字的新配置
FindBugs是一个Java静态分析工具,用来检查类或者jar文件,用来发现可能的问题。检测完成以后会生成一份详细的报告,借助这份报告能够找到潜在的bug,好比NullPointException,特定的资源没有关闭,查询数据库没有调用Cursor.close()等;
Java的静态分析工具固然能够无难度的在Android上面运行,经过这种FindBugs的检查可让App的运行更加的稳定。
FindBugs Gradle插件使用实例以下:
apply plugin: "findbugs"
//定义一个task任务,这个任务的类型是FindBugs
task findbugs(type: FindBugs) {
//有警告错误的时候也是容许构建
ignoreFailures= true
effort= "default"
//报告的级别,Low,Medium,High
reportLevel= "high"
println( "$project.buildDir")
//classes和source分别是对应的.classe文件夹地址,和源代码文件地址。
classes = files("$project.buildDir/intermediates/classes")
source= fileTree("src/main/java/")
classpath= files()
//指定报告类型,有两种方式xml和html,只容许一种输出格式
reports{
xml.enabled=false
html.enabled=true
xml {
destination "$project.buildDir/findbugs.xml"
}
html{
destination "$project.buildDir/findbugs.html"
}
}
}复制代码