从2015年的七月份开始接触Android刚好有两年时间了。两年时间很长也很短暂。技术是不断更新的,程序员的我们也应该跟着不停的学习,不然很快就会被淘汰吧。很久没更新博客了,主要还是工作忙,996的节奏工作也吃不消。周末抽点时间把Gradle这一块的知识点做一个总结吧。
1.gradle构建系统的目标
2.几个有用的Gradle命令
- ./gradlew -v 版本号
- ./gradlew clean 清除app/目录下的build文件夹
- ./gradlew check 检查依赖
- ./gradlew build 检查依赖并编译打包,把debug,release环境的包都打出来
- ./gradlew assembleDebug 编译并打Debug包
- ./gradlew assembleRelease 编译并打Release的包
- ./gradlew –stop 停止编译
3.gradle文件细节详解
(1)主工程的build.gradle文件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
}
allprojects {
repositories {
jcenter()//引入远程仓库
maven{url MAVEN_URL}//引入自己的私有maven仓库
}
}
project.ext.set("android_support_version", "25.3.1")
project.ext.set("junit_version", "4.12")
project.ext.set("compileSdkVersion", "25")
project.ext.set("buildToolsVersion", "25.0.2")
(2)gradle.properties(全局配置文件)
#后台进程构建
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx1536m
org.gradle.parallel=true
#私有maven仓库地址
MAVEN_URL= http://xxx.xx.1.147:8081/nexus/content/repositories/thirdparty/
COMPILE_SDK_VERSION=25
BUILD_TOOLS_VERSION=25.0.2
MIN_SDK_VERSION=15
TARGET_SDK_VERSION=23
ANDROID_SUPPORT_VERSION=25.3.1
VERSION_CODE=31405
VERSION_NAME=3.1.4.05
(3)app/build.gradle(module)
//声明该项目代表一个Android项目,而且一个Android项目只有一句这个声明
//如果是moudle需要声明是为 apply plugin:'com.android.library'
apply plugin: 'com.android.application'
//声明是要使用谷歌服务框架
apply plugin: 'com.google.gms.google-services'
allprojects {
repositories {
jcenter()
}
}
repositories {
flatDir {
//引入某library下的aar文件
dirs project(':network_api').file('aars')
}
maven { url 'https://maven.fabric.io/public' }
mavenCentral()
}
//android节点:项目的配置方法
android {
//编译SDK的版本,纯粹是编译时使用,不会改变运行时的行为
compileSdkVersion Integer.parseInt(project.COMPILE_SDK_VERSION)
//构建工具的版本,比如打包工具aapt等
buildToolsVersion project.BUILD_TOOLS_VERSION
//关闭Android Studio的PNG合法性检查的
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
//默认的配置
defaultConfig {
applicationId "com.webull.liujian.webull_tv_show"
//程序可以运行的最低版本
minSdkVersion project.MIN_SDK_VERSION
//>=23需要做6.0权限适配
targetSdkVersion project.TARGET_SDK_VERSION
versionCode Integer.parseInt(project.VERSION_CODE)
versionName project.VERSION_NAME
//当方法超过65535的时候允许dex分包
multiDexEnabled true
//Android Test
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
//多语言
resConfigs "en", "zh-rCN", "zh-rTW", "de", "fr", "hi"
}
//签名文件配置,直接可以./gradlew assembleRelease命令生成release包
signingConfigs{
debug{
// No config
}
release{
storeFile file("../tv.keystore.jks")
storePassword "liujian"
keyAlias "liujian"
keyPassword "liujian"
}
}
//默认情况下,Android Plugin会自动给项目设置同时构建应用程序的debug和release版本。
//两个版本之间的不同主要围绕着能否在一个安全设备上调试,以及APK如何签名。
//buildTypes可以定制debug和release实例
buildTypes {
debug{
//debug版本的包名设置为.debug以便能够同时在一台设备上安装debug和release版本的apk。
applicationIdSuffix ".debug"
//显示log
buildConfigField "boolean","LOG_DEBUG","true"
//版本名字后面加上后缀名
versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
}
release {
//buildConfigField第一个参数为类型,第二个参数为字段名,第三个参数为值
//代码中通过BuildConfig.LOG_DEBUG获取设置的值
buildConfigField "boolean","LOG_DEBUG","false"
zipAlignEnabled true //zipAlign优化
shrinkResources true //移除无用的资源文件
minifyEnabled true //开启混淆
//自定义的混淆文件 proguard-rules.pro
proguardFiles 'proguard.cfg'
signingConfig signingConfigs.release
}
}
//为同一个应用创建不同的版本,比如一个国内版本,一个国外版
productFlavors {
home {
manifestPlaceholders = [ CHANNEL:”0"]
minSdkVersion 21
}
abroad {
manifestPlaceholders = [ CHANNEL:”1"]
minSdkVersion 14
}
}
//默认的项目结构不适应时,配置项目结构
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
//如果创建文件theme用于存放主题相关的color或者style,添加res/theme
res.srcDirs = ['res','res/theme',]
assets.srcDirs = ['assets']
//在src下面创建jniLibs文件夹,存放so文件
jniLibs.srcDirs = ['libs']
}
//表示单元测试的代码在tests目录下(src并列的目录)
instrumentTest.setRoot('tests')
androidTest.setRoot('tests')
//设置编译内容
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
lintOptions{
//build release 版本 时 开启lint 检测
checkReleaseBuilds true
//lint时遇到error时继续构建
abortOnError false
}
//multiDex的一些相关配置,这样配置可以让你的编译速度更快
dexOptions {
preDexLibraries = false
//让它不要对Lib做preDexing
incremental true
//开启incremental dexing,优化编译效率,这个功能android studio默认是关闭的。
javaMaxHeapSize "4g" //增加java堆内存大小,避免导致编译时出现OOM异常
}
}
dependencies {
def android_support_version = project.ANDROID_SUPPORT_VERSION
//一次性引入所有libs下的所有jar文件
compile fileTree(include: ['*.jar'], dir: 'libs')
//引用库项目
compile project(':network_api')
compile "com.android.support:appcompat-v7:$android_support_version"
compile "com.android.support:gridlayout-v7:$android_support_version"
compile "com.android.support:recyclerview-v7:$android_support_version"
compile "com.android.support:design:$android_support_version"
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
compile 'com.android.support:appcompat-v7:24.0.0'
compile project(':MPChartLib')
compile 'com.github.PhilJay:MPAndroidChart-Realm:v1.1.0@aar'
compile(name:'camerascan-1.0', ext:'aar')
}
gradle文件中定制productFlavors:
//为同一个应用创建不同的版本,比如一个国内版本,一个国外版
productFlavors {
home {
manifestPlaceholders = [ CHANNEL:”0"]
minSdkVersion 21
}
abroad {
manifestPlaceholders = [ CHANNEL:”1"]
minSdkVersion 14
}
}
AndroidManifest.xml :
这种多渠道打包方式优点是方便简单,缺点是耗时
(0)aar文件的作用
aar相较于jar包的优点:
包含资源文件
无需重新编译,加快编译速度
(1)生成aar文件
Moudule在项目编译后会自动生成aar包,包的路径在Moudule->build->outputs->aar目录
(2)使用
①将aar包复制到libs目录下
②配置build.gradle文件
repositories{
flatDir{
dirs ‘libs’
}
}
dependencies{
compile(name:'camerascan-1.0', ext:'aar')
}