前言
近排看了一本书《Gradle for Android 中文版》,整理了一下gradle在项目中经常用到的地方。跟着大家一起入坑,另外欢迎加入Android 开发车群398910565,大家一边开车一边学习。
一、配置Android 应用的gradle(基础)
1. 用gradle管理我们自己项目的初始化资源
一般在项目中我们的BaseUrl是这样的:
public class Constant {
//debug的Url
private String BaseUrl="http://192.168.1.1/api/hello";
//realse的Url
// private String BaseUrl="http://120.156.1.1/api/hello";
//判断是否登录的标志
private boolean IS_LOGIN=false;
}
而在gradle中我们可以这样:
android{
buildTypes {
debug {
minifyEnabled false
//注意字符串要用转译符号\
//在代码中可直接调用 BuildConfig.BaseUrl 以及 BuildConfig.IS_LOGIN
buildConfigField("String", "BaseUrl", "\"http://192.168.1.1/api/hello\"")
buildConfigField("boolean", "IS_LOG", "true")
//系统自动生成在build\generated\res\resValues\debug\values\generated.xml
resValue("string", "AppName", "MyTestDemo_debug")
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
//注意字符串要用转译符号\
//在代码中可直接调用 BuildConfig.BaseUrl 以及 BuildConfig.IS_LOGIN
buildConfigField("String", "BaseUrl", "\"http://120.156.1.1/api/hello\"")
buildConfigField("boolean", "IS_LOG", "false")
//系统自动生成在build\generated\res\resValues\debug\values\generated.xml
resValue("string", "AppName", "MyTestDemo")
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
在代码中使用:
String BaseUrl=BuildConfig.BaseUrl;
String appName=getString(R.string.AppName);
其中buildConfigField(String type, String name, String value)中有3个参数,第一个为基本类型名称,第二个就是字段名称,第三个就是value。
resValue也一样。
优点:打包时候不用手动切换baseUrl(提升bi格)。
2. 一键初始化多个模块gradle属性
当项目有多个模块时候,里面可能有不同的compileSdkVersion、targetSdkVersion、versionCode 当我想同时更改的就太麻烦了,需要一个个问价打开来改。
类似这样:
//这是library1
defaultConfig {
applicationId "cxx.myapplication"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
//这是library2
defaultConfig {
applicationId "cxx.myapplication"
minSdkVersion 17
targetSdkVersion 25
versionCode 3
versionName "3.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
但是利用gradle我们可以这样:
//这是library1
defaultConfig {
applicationId mapplicationId
minSdkVersion minSdk
targetSdkVersion targetSdkVersion
versionCode versionCode
versionName versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
//这是library2
defaultConfig {
applicationId mapplicationId
minSdkVersion minSdk
targetSdkVersion targetSdkVersion
versionCode versionCode
versionName versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
具体做法是先创建一个自定义的gradle:
config.gradle
ext{
minSdk = 19
targetSdkVersion= 26
versionCode =1
versionName ="1.0"
mCompileSdkVersion =26
mbuildToolsVersion='26.0.2'
mapplicationId="cxx.mytestdemo"
}
然后在project的gradle中添加依赖:
buildscript {
//主要添加这一句,表示所有子模块都能使用
apply from: 'config.gradle'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
最后在子模块里面调用具体的参数了,当我想统一修改compileSdkVersion时,可以找到config.gradle文件来修改。
注意:涉及到的 ext 代码块其实是gradle定义额外属性的一种方式。另外还有gradle.properties文件、-p命令行,这两种以后学到再来补坑。
二、配置Android 应用的gradle(高级)
1. 减少apk文件大小
(1)利用proguard 也就是我们的混淆文件:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
主要原理:
proguard 不仅可以混淆,还可以在编译期优化、预校验代码、缩小apk大小,其中减少apk体积主要是通过遍历应用的所有代码路径,找出未使用的代码并删除
(2)缩减资源
buildTypes {
release {
minifyEnabled true
//注:需要配合minifyEnabled =true一起使用
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
主要原理:
利用构建工具,把没有使用的资源排除在apk之外。这里有个问题,有可能过多移除资源,比如动态使用被意外删除,就可能导致bug,所以你可以在res/raw下新建一个排除代码文件keep.xml
keep.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/keep_us,@layout/keep_more_*">
</resources>
2.加速构建
(1)gradle.properties文件中添加:
org.gradle.daemo=true
org.gradle.jvmargs= -Xms560m -Xmx1536m
org.gradle.parallel=true
原理:
org.gradle.daemo=true : 第一次运行时开启守护线程,后续会复用该线程,减少启动成本。
org.gradle.jvmargs= -Xms560m -Xmx1536m :为jvm分配内存,xms为初始化内存,xmx为最大内存。
org.gradle.parallel=true:根据你当前cpu参数对子模块进行并行构建。
三、用gradle管理Android发布版本
1. 同一台手机安装两个相同apk
buildTypes{
realse{
minifyEnabled true
debuggable = false
buildConfigField("String", "BASE_URL", "\"http://baidu.com\"")
}
debug{
minifyEnabled false
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
debuggable = true
buildConfigField("String", "BASE_URL", "\"http://baidu.com\"")
}
}
原理:
applicationIdSuffix : 主要是追加debug在包名后面
release包名:com.package
debug包名:com.package.debug
打包不同包名的apk就可以安装在同一台手机,而不被替换了。
2. 定制多个版本的apk,如一个收费一个免费
productFlavors {
//付费版本
pay {
flavorDimensions("pay")
applicationId 'cxx.mytestdemo.pay'
versionName 'pay_1'
version 2
}
//免费版本
free {
flavorDimensions("free")
applicationId 'cxx.mytestdemo.free'
versionName 'free_1'
version 3
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField("String", "BASE_URL", "\"http://192.168.1.125.baidu.com\"")
signingConfig signingConfigs.release
}
debug {
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
debuggable = true
buildConfigField("String", "BASE_URL", "\"http://baidu.com\"")
}
}
然后在打包时就会发现:
3. 修改打包后apk的名字
//放在android{}里
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.contains('release.apk')) {
//apk 名字
def fileName = "${variant.name}.apk"
outputFileName = fileName
}
}
}
最后附上github传送门:代码呀代码