Android studio Gradle 编程

前言

近排看了一本书《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传送门:代码呀代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值