Gradle简介

Gradle 是一个基于Ant和Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,这比我们的ANT使用XML构建配置要灵活的多。在编写配置时,你可以像编程一样灵活,Gradle是基于Groovy的DSL语言,完全兼容JAVA。

Android Studio中使用Gradle

Android Studio是使用Gradle进行自动化构建的IDE,当我们在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 #工程配置复制代码

其中,settings.gradle用于配置project,标明其下有几个module,比如这里包含一个:app module(当我们使用Android Studio添加一个在当前项目中添加一个module的时候,会自动的在这个文件中将新的module的名字include进来)

include ':app'复制代码

和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提供的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 Gradle基本配置

配置应用的签名信息

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

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

}

}

}复制代码

启用proguard混淆息

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

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的信息

启用zipAlign

zipalign是一款重要的优化apk应用程序的工具。

apk包的本质是一个zip压缩文档,优化的目的是使包内未压缩的数据能够有序的排列,从而减少应用程序运行时的内存消耗.

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"

}

}

}复制代码

AndroidManifest里的占位符

manifestPlaceholders,它允许我们动态替换我们在AndroidManifest文件里定义的占位符。例如:

android:name="UMENG_APPKEY"

android:value="${umeng_app_key}"/>

android:name="UMENG_SECRET"

android:value="${umeng_app_secret}"/>

然后我们可以针对不同的flavors或者buildTypes动态的指定相应的值,例如:

buildTypes {

debug {

manifestPlaceholders = [umeng_app_key: "替代的内容",umeng_app_secret:"替换的内容"]

}

...

}复制代码

自定义Android BuildConfig

BuildConfig.java是Android Gradle自动生成的一个java类文件,无法手动编译,但是可以通过Gradle控制,也就是说他是动态可配置的。在 gradle 文件 buildTypes 或者 productFlavors 下面,如:

buildTypes {

release{

//release的包中BuildConfig.ENDPOINT 就会被赋值为 http://example.com 就可以供 Java 代码调用了。

buildConfigField "String", "ENDPOINT", "\"http://example.com\""

}

}复制代码

动态设置 Android resValue

修改 res value 的方式,比如修改 strings.xml 文件中的 AppName 的值。在gradle文件 buildTypes 或者 productFlavors 下面,如:

buildTypes{

release{

//将release的包中名为 AppName 的 string value 值改为 app1

resValue "string", "AppName", "app1"

}

}复制代码

splits的使用

我们除了可以通过设置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依赖配置

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

FindBugs是一个Java静态分析工具,用来检查类或者jar文件,用来发现可能的问题。检测完成之后会生成一份详细的报告,借助这份报告可以找到潜在的bug,比如NullPointException,特定的资源没有关闭,查询数据库没有调用Cursor.close()等;

Java的静态分析工具当然可以无难度的在Android上面运行,通过这种FindBugs的检查可以让App的运行更加的稳定。

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"

}

}

}复制代码

参考文献

Android Plugin DSL Reference

android gradle 设置,android gradle配置指南相关推荐

  1. maven、gradle 设置MANIFEST.MF配置

    maven.gradle 设置MANIFEST.MF配置 一.说明 二.gradle 设置MANIFEST.MF 三.maven 设置MANIFEST.MF 一.说明 在使用maven.gradle对 ...

  2. (转)Android属性设置android:noHistory=true

    设置 android:noHistory="true"后,该Activity在statck中不留历史痕迹.默认的值是false. 举例说明,假设有三个Activity分别是:A,B ...

  3. android api 设置,Android API中文文档EditText

    Android API中文文档EditText是本文要介绍的内容,主要是来了解并学习Android API文档的帮助,具体关于Android API的内容的详解来看本文. 一.Android API中 ...

  4. Android中设置org.gradle.jvmargs

    一.配置文件 gradle.properties文件 二.作用 Specifies the JVM arguments used for the daemon process. The setting ...

  5. Android P 中的网络安全配置指南 network-security-config

    摘要:随着数据隐私变得越来越重要,谷歌一直在试图增强移动操作系统的功能,用以保护Android移动设备和端点的所有数据.Android 9.0 P(Pie)预计在8月发布,其网络通信将默认为TLS.为 ...

  6. android通知栏设置,android系统通知栏提示消息

    在使用android手机时,大家一定都会接触过系统通知栏提示的消息,如图... 我们在开发android程序时也经常会用到这个技术,先奉上初始化的函数一个 private void initNotif ...

  7. android壁纸设置,android设置壁纸 的方法

    前几天看到豌豆荚上面风景壁纸的APP 下载得挺火,闲来无事心痒痒的想写一个壁纸程序.由于是Android开发新手,忘记了一个很重要的开发步骤,就是对权限的设置.开始以为自己写的壁纸设置程序有问题,经过 ...

  8. android客户端设置,android客户端设置界面开发实例

    我们在开发软件的时候,都会填一个功能就是设置,查看很多软件大多数都是圆角形式,最近在帮一个客户做直播客户端也要添加一个设置界面,因此分享一下制作过程先看一下效果图(上面还包含一个头,但是里面含有客户信 ...

  9. android 自定义switchpreference,Android设置选项开发及自定义Preference样式

    一个完整的Android应用程序都应该提供选项(或者叫偏好设置等等)让用户对APP的表现形式能够进行设置,比如说是否加入用户体验计划,或者是否自动升级.定时提醒.开启自启动.后台运行等等.提供一个好的 ...

最新文章

  1. slb健康检查方式_SLB健康检查也是“正常”-问答-阿里云开发者社区-阿里云
  2. mybaits五:主键的自增
  3. java读取InputStream输入流后输出String字符串
  4. 工程师如何给女友买包?问问阿里“百事通”
  5. 八个程序员必备的代码编辑器(附下载链接)
  6. struct x264_t 维护着CODEC的诸多重要信息
  7. 使用Java的Apache Camel入门
  8. python接口自动化测试框架实战从设计到开发_Python接口自动化测试框架实战 从设计到开发...
  9. GraphX中Pregel单源点最短路径(转)
  10. C#Socket客户端
  11. IT学生技术入门值得关注的网站(页)链接
  12. 网站服务器在什么地方怎么查,如何查询一个网站所在服务器信息
  13. Windows xp开机时不显示用户名导致无法登录的错误处理方法
  14. 垃圾网线,毁我青春(ubuntu安装失败)
  15. Postman请求报405错误
  16. 华为od机试真题 C++ 实现【导师请吃火锅】【2023 B卷】
  17. uniapp 在h5 模式下扫码
  18. ping命令使用什么协议
  19. win7 wif热点
  20. 【刷(shui)题记录】201807

热门文章

  1. Redis--高并发之分布式锁
  2. arcgis加载天地图_【arcgis地图实战】之天地图在线服务加载
  3. 保存自动修复_CAD小技巧:怎样将自动保存的图形复原
  4. h5实现一键复制到粘贴板 兼容iOS
  5. Java .net 心得_我做英文站的心得-如何做好英文站 - 程序员日记 - 做人做技术【关注.NET和JAVA】...
  6. java面向对象怎么学_Java面向对象入门
  7. root权限执行java_执行具有root权限的java代码(一)
  8. python画图xlable显示中文_xlabel和ylabel超出绘图区域,无法在figu中完全显示
  9. input做成label效果
  10. Codeforces Round #666 (Div. 2)C - Multiples of Length(错位相减)