浅谈Gradle 常用配置总结

这里分享下我在日常开发中对 Gradle 的常用配置规则

一、版本号配置

当项目逐渐演进的过程中,主工程依赖的 Module 可能会越来越多,此时就需要统一配置各个 Module 的编译参数了

在工程的根目录下新建一个 gradle 文件,命名为 config.gradle ,在此文件中统一声明工程的编译属性和依赖库的版本号

ext {
  compileSdkVersion = 28
  minSdkVersion = 15
  targetSdkVersion = 28
  versionCode = 1
  versionName = '1.0'

  dependencies = [
      appcompatV7   : 'com.android.support:appcompat-v7:28.0.0-rc02',
      constraintLayout: 'com.android.support.constraint:constraint-layout:1.1.3',
      junit      : 'junit:junit:4.12',
      testRunner   : 'com.android.support.test:runner:1.0.2',
      espressoCore  : 'com.android.support.test.espresso:espresso-core:3.0.2'
  ]

}

默认情况下, App Modulebuild.gradle 文件的默认配置如下所示

apply plugin: 'com.android.application'

android {
  compileSdkVersion 28
  defaultConfig {
    applicationId "leavesc.hello.gradlesamples"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
}

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
  implementation 'com.android.support.constraint:constraint-layout:1.1.3'
  testImplementation 'junit:junit:4.12'
  androidTestImplementation 'com.android.support.test:runner:1.0.2'
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

这里将其改为引用 config.gradle 文件的形式

首先,需要在根目录下的 build.gradle 文件中应用 config.gradle 文件,这样在 Module 配置文件中才引用得到当中的属性值

此时就可以修改应用版本号以及依赖库的声明方式了

apply plugin: 'com.android.application'

def globalConfiguration = rootProject.ext
def presentationDependencies = globalConfiguration.dependencies

android {
  compileSdkVersion globalConfiguration["compileSdkVersion"]
  defaultConfig {
    applicationId "leavesc.hello.gradlesamples"
    minSdkVersion globalConfiguration["minSdkVersion"]
    targetSdkVersion globalConfiguration["targetSdkVersion"]
    versionCode globalConfiguration["versionCode"]
    versionName globalConfiguration["versionName"]
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  }

  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
}

dependencies {
  implementation fileTree(include: ['*.jar'], dir: 'libs')
  implementation presentationDependencies.appcompatV7
  implementation presentationDependencies.constraintLayout
  testImplementation presentationDependencies.junit
  androidTestImplementation presentationDependencies.testRunner
  androidTestImplementation presentationDependencies.espressoCore
}

这样,即使以后工程中包含多个 Module ,只要配置的属性都是来自于 config.gradle 文件,就可以做到统一修改编译属性与依赖库版本了

二、签名属性配置

通常,应用的签名类型会分为 releasedebug 两类,并分别使用不同的签名文件

为了安全考虑以及实现自动化打包,可以通过 gradle 来声明签名配置,包括签名文件路径、签名别名、签名密码等

local.properties 文件中声明签名文件路径以及签名密码

sdk.dir=C\:\\Software\\SDK
key.keyStorePath=..\\doc\\key.jks
key.keyAlias=leavesC
key.keyPassword=987654321
key.storePassword=123456789

根据配置可知,签名文件是放在工程的 doc 文件夹内

通过代码获取到签名的各个配置项

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def keyStorePath_ = properties.getProperty("key.keyStorePath")
def storePassword_ = properties.getProperty("key.storePassword")
def keyAlias_ = properties.getProperty("key.keyAlias")
def keyPassword_ = properties.getProperty("key.keyPassword")
def storeFile_ = file(keyStorePath_)

配置不同的签名属性以及 build 类型

 signingConfigs {
    release {
      storeFile storeFile_
      storePassword storePassword_
      keyAlias keyAlias_
      keyPassword keyPassword_
      v1SigningEnabled true
      v2SigningEnabled true
    }
    debug {
      storeFile storeFile_
      storePassword storePassword_
      keyAlias keyAlias_
      keyPassword keyPassword_
      v1SigningEnabled true
      v2SigningEnabled true
    }
  }

  buildTypes {
    debug {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      signingConfig signingConfigs.debug
    }
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      signingConfig signingConfigs.release
    }
  }

此处,我配置了两种不同的 buildTypedebugrelease ,并对应不同的签名文件

以后只要选定不同的 Build Variant ,即可打包具体签名的 Apk 文件

local.properties 文件可以保存到服务器来实现远程打包,从而保证了隐私安全

三、多渠道打包

有时候,为了方便进行精准营销,会有生成不同渠道包的要求,此时就需要在同个应用上打上不同的渠道ID(channelId),这可以通过 productFlavors 来实现

先在 AndroidManifest.xml 文件中配置占位符, appKey 即对应各个渠道的 ID 值

 <meta-data
      android:name="APP_KEY"
      android:value="${appKey}" />

gradle.properties 文件中声明需要的 ChannelId 以及对应的 ApplicationId ,在此文件中声明的属性可以直接在 build.gradle 中直接获取到

#默认配置
defaultApplicationId=leavesc.hello.gradlesamples
##各个渠道的配置
#应用宝
yingyongbaoChannelId="yingyongbao"
yingyongbaoApplicationId=leavesc.hello.gradlesamples.yingyongbao
yingyongbaoAppKey=appKey_yingyongbao
#豌豆荚
wandoujiaChannelId="wandoujia"
wandoujiaApplicationId=leavesc.hello.gradlesamples.wandoujia
wandoujiaAppKey=appKey_wandoujia
#小米
xiaomiChannelId="xiaomi"
xiaomiApplicationId=leavesc.hello.gradlesamples.xiaomi
xiaomiAppKey=appKey_xiaomi

productFlavors 可以理解为是对同个产品的不同“风味要求”,可以根据配置项生成特定风味的产品(App)

例如,此处就为不同渠道设定了不同的 applicationId

buildConfigField 属性则用于在 BuildConfig.java 文件中生成特定类型的字段,此处就生成了一个类型为 String ,名为 channelId 的字段,用于方便在应用运行过程中判断当前应用的渠道类型

manifestPlaceholders 就是用于替换 AndroidManifest.xml 文件中的指定占位符了

 productFlavors {
    yingyongbao {
      applicationId yingyongbaoApplicationId
      buildConfigField "String", "channelId", yingyongbaoChannelId
      manifestPlaceholders = [appKey: yingyongbaoAppKey]
    }
    wandoujia {
      applicationId wandoujiaApplicationId
      buildConfigField "String", "channelId", wandoujiaChannelId
      manifestPlaceholders = [appKey: wandoujiaAppKey]
    }
    xiaomi {
      applicationId xiaomiApplicationId
      buildConfigField "String", "channelId", xiaomiChannelId
      manifestPlaceholders = [appKey: xiaomiAppKey]
    }
  }

在主布局文件中展示当前应用的各项属性值

 @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StringBuilder sb = new StringBuilder();
    sb.append("ApplicationId: ");
    sb.append(getApplicationInfo().packageName);
    sb.append("\n");
    sb.append("ApplicationName: ");
    sb.append(getString(getApplicationInfo().labelRes));
    sb.append("\n");
    sb.append("ChannelId: ");
    sb.append(BuildConfig.channelId);
    sb.append("\n");
    try {
      ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
      String appKey = appInfo.metaData.getString("APP_KEY");
      sb.append("AppKey: ");
      sb.append(appKey);
    } catch (PackageManager.NameNotFoundException e) {
      e.printStackTrace();
    }
    TextView tv_appInfo = findViewById(R.id.tv_appInfo);
    tv_appInfo.setText(sb);
    ImageView iv_log = findViewById(R.id.iv_log);
    iv_log.setImageResource(getApplicationInfo().icon);
  }

四、打包时指定 Apk 名字

为了方便标识各个测试包的版本已经打包时间,可以通过 Gradle 来指定生成的 Apk 文件的命名规则

例如,以下配置就根据 buildType、flavorName编译时间 来命名 Apk 文件

applicationVariants.all { variant ->
    def buildType = variant.buildType.name
    def flavorName = variant.flavorName
    def createTime = new Date().format("YYYY-MM-dd_hh_mm_ss", TimeZone.getTimeZone("GMT+08:00"))
    variant.outputs.all {
      outputFileName = flavorName + "_" + buildType + "_v" + defaultConfig.versionName + "_" + createTime + ".apk"
    }
  }

五、生成属性字段与资源文件值

上边讲过, buildConfigField 属性可用于在 BuildConfig.java 文件中生成特定类型的字段,此处可以利用其来记录应用的编译时间

此外,也可以利用 resValue 来生成一个 ID 引用类型的 string 字符串

首先,声明两个方法,分别用于获取当前时间以及当前电脑的用户信息

static def buildTime() {
  return new Date().format("yyyy-MM-dd HH:mm:ss")
}

static def hostName() {
  return System.getProperty("user.name") + "@" + InetAddress.localHost.hostName
}
defaultConfig {
    applicationId defaultApplicationId
    minSdkVersion globalConfiguration["minSdkVersion"]
    targetSdkVersion globalConfiguration["targetSdkVersion"]
    versionCode globalConfiguration["versionCode"]
    versionName globalConfiguration["versionName"]
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    flavorDimensions '1'
    resValue "string", "build_host", hostName()
    buildConfigField "String", "build_time", "\"" + buildTime() + "\""
  }

用代码来获取这两个属性值

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StringBuilder sb = new StringBuilder();
    sb.append("ApplicationId: ");
    sb.append(getApplicationInfo().packageName);
    sb.append("\n");
    sb.append("ApplicationName: ");
    sb.append(getString(getApplicationInfo().labelRes));
    sb.append("\n");
    sb.append("ChannelId: ");
    sb.append(BuildConfig.channelId);
    sb.append("\n");
    sb.append("BuildTime: ");
    sb.append(BuildConfig.build_time);
    sb.append("\n");
    sb.append("BuildUser: ");
    sb.append(getString(R.string.build_host));
    sb.append("\n");
    try {
      ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
      String appKey = appInfo.metaData.getString("APP_KEY");
      sb.append("AppKey: ");
      sb.append(appKey);
    } catch (PackageManager.NameNotFoundException e) {
      e.printStackTrace();
    }
    TextView tv_appInfo = findViewById(R.id.tv_appInfo);
    tv_appInfo.setText(sb);
    ImageView iv_log = findViewById(R.id.iv_log);
    iv_log.setImageResource(getApplicationInfo().icon);
  }

六、替换资源文件

在多渠道打包时,除了需要在应用中打上特定的标签外,也可能需要使之使用不同的资源文件,例如应用图标和应用名称

此时可以以各个 productFlavor 的名称来命名相应的文件夹,并在其中放置相应的图标文件以及声明了应用名称的 string.xml 文件,这样在多渠道打包时,Gradle 就会自动引用相应的资源文件

上述所有的示例代码可以在这里获取: GradleSamples

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring boot利用docker构建gradle项目的实现步骤

    前言 这是一篇关系到四个知识点的文章,分别是java,docker,springboot和gradle,我们希望在java环境下,使用springboot框架,通过gradle去构建项目,然后把项目部署和运行在docker容器里! 更多关于gradle的介绍大家可以参考这篇文章://www.jb51.net/article/125602.htm Java运行时 springboot开源脚手架 gradle最流行的项目构建工具 docker最流行的容器产品 下面话不多说了,来一起看看详细的介绍:

  • Android studio gradle环境变量配置教程

    本文实例为大家分享了Android studio gradle环境变量配置的教程,供大家参考,具体内容如下 我的gradle 下载自动解压到了这个目录  C:\Users\jacli\.gradle\wrapper\dists\gradle-2.10-all\a4w5fzrkeut1ox71xslb49gst\gradle-2.10 1.右击"计算机"点击"属性"点击"高级系统设置" 你会看到系统属性 2.点击"环境变量"在弹

  • 史上最全的Android build.gradle配置教程

    前言 Android Studio是采用gradle来构建项目的,gradle是基于groovy语言的,如果只是用它构建普通Android项目的话,是可以不去学groovy的.当我们创建一个Android项目时会包含两个Android build.gradle配置详解文件,如下图: 一.Project的build.gradle文件: 对应的build.gradle代码如下: // Top-level build file where you can add configuration optio

  • Gradle快速安装及入门

    1.什么是Gradle Gradle是一种结合了Ant和Maven两者优势的下一代构建工具,既有Ant构建灵活性的优点,也保留Maven约定优于配置的思想,在灵活构建和约定构建之间达到了很好的平衡. 2.安装Gradle (1)Gradle属于解压配置即可使用的软件 下载解压gradle-4.1-all.zip,例如解压到:D:/ gradle-4.1 (2)window中设置gradle环境变量: GRADLE_HOME    D:/ gradle-4.1 path              

  • Gradle构建多模块项目的方法步骤

    通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块. Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build). 我们首先创建一个多项目构建: mkdir cmdGradleProj && cd cmdGradleProj gradle init 这时候 D:\cmdGradleProj> 目录下执行:tree /f 的项目结构如下: │ build.gradle │ gradlew │ gradlew.bat │

  • Android中使用Gradle来构建App项目的入门指南

    gradle是Android开发中引入的全新的构建系统,因为全新的构建系统主要是出于下面的目的: 1. 方便复用代码和资源 2. 构建多种版本的apk更见简单,不论是为多渠道构建不同的apk还是构建不同环境的apk(debug,release) 3. 方便配置,扩展,自定义构建过程 4. 良好的IDE集成 为什么选择Gradle? Gradle主要有以下几个有点: 1. 使用领域驱动语言(DSL)来描述构建逻辑 2. 构建脚本使用Groovy,可以方便的定制构建逻辑 3. 内建的依赖管理系统,使

  • springboot+gradle 构建多模块项目的步骤

    springboot用以进行web项目开发的便捷性,本文不再赘述,主要是想将工作中基于springboot与gradle的多模块项目的构建经验进行总结与归纳. 1.创建项目 首先安装java和gradle,本文选用的java版本为1.8.0_40,gradle版本为2.10,安装过程本文不再赘述. 其次创建项目,名称为 springboot-mm: mkdir springboot-mm cd springboot-mm gradle init 此时的项目结构如下: 接下来,创建多个模块,这里以

  • 使用Android Studio Gradle实现友盟多渠道打包

    最新项目中要求在友盟后台看到不同渠道的统计,Android大大小小的应用市场要几百个,要一个一个手工打包那一天也干不完,还好是有大牛的,弄出了好多解决方法,就Gradle做一下记录和分享,首先看一些理论知识: 1.应用的打包签名 什么是打包? 打包就是根据签名和其他标识生成安装包. 签名是什么? 1.在android应用文件(apk)中保存的一个特别字符串 2.用来标识不同的应用开发者:开发者A,开发者B 3.一个应用开发者开发的多款应用使用同一个签名 就好比是一个人写文章,签名就相当于作者的署

  • 详解关于Android Studio中安装和gradle的一些坑

    本人从开始用Android Studio到现在已经快一年了吧,在我刚开始用的时候Android Studio还是1.2的版本.当时安装会因为国内墙的缘故,导致下载SDK步骤卡死无法安装. 最近的版本似乎都没出现这个问题,但是还是要吐槽一下最近的2.2.3的更新.这个版本安装包自带的SDK里build tools版本是25.0.2,支持的最低gradle版本是3.3,然而安装包内自带的gradle版本是3.2,所以单纯这个用安装包你并不能建立任何完整的项目,连自带的Helloworld项目都会报错

  • Android使用Gradle依赖配置compile、implementation与api的区别介绍

    前言 AndroidStudio升级到3.0之后,gradle版本也随之升级到了3.0.0版本. 当gradle插件升级到3.0.0及以上后,我们会发现在gradle中添加依赖的时候,会推荐你使用implementation或者api,而不再推荐你使用compile,今天就来简单介绍下这两者的使用与区别! classpath 'com.android.tools.build:gradle:3.0.0' 在新建一个Android工程的时候,build.gradle中的依赖默认为implementa

  • 使用IDEA和Gradle构建Vertx项目(图文步骤)

    最近是真的忙,好久没写了,再来分享一点新东西!!! 一. 新建Gradle项目 ① ②选择Gradle(如果没有安装gradle,自己下载一个) ③ ④选择gradle 下一步,然后输入项目名称和磁盘路径,点击Finish. 二.配置vertx依赖 项目打开之后,在build.gradle文件中dependencies里面加入vertx的核心依赖 compile 'io.vertx:vertx-core:3.4.2' 在build.gradle最下面加入任务 task copyJars(type

  • 关于gradle你应该知道的一些小事

    前言 gradle的定义(来自维基百科) Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言限于Java.Groovy和Scala,计划未来将支持更多的语言. 通俗的理解:gradle是一种构建工具,我们可以用他来对多工程进行各种管理(依赖,打包,部署,发布,各种渠道的差异管理): 有些时候,我们会有一些个性化的构建需求,比如我们引入了第三方库,或者我们想要在通

  • Android gradle插件打印时间戳的方法详解

    Android中时间戳的详细解释: (1).定义: 时间戳就是根据当前系统时间生成的一组随机数字. (2).作用: 作为对数据唯一性的一种判断依据.避免了重复修改数据所带来的错误! (3).应用: (1).在银行account表中建立时间戳字段timestamp,设定为文本类型varchar. (2).当银行A读取account表中的存款字段时,同时也读取时间戳字段,比如123456. (3).当银行A修改完存款数值后,进行存盘操作时,将先前读取的时间戳123456与当时表中的时间戳进行一次对比

  • 给Android初学者的Gradle知识普及

    Gradle build android 历史 Android Tools 主页 ,大概是2016年2月份发布 adt21.1 的时候,忽然在主页发现了New Build System 原来是可以用gradle 来构建android项目,至于gradle是什么(既然点击进来看了应该都知道了吧.).然后,又看了一下RoadMap 那时候,还并不支持Proguard 打包,于是就没看了. android studio 发布,终于gradle 0.4 也跟着出来了,于是,先把gradle 学了一遍,然

  • 解决 IDEA 创建 Gradle 项目没有src目录问题

    前几天遇到一个问题,就是使用ider创建gradle项目后,src目录没有自动生成出来,今天就给大家分享一下怎么解决. 目录: 1.创建Gradle项目 2.解决没有生成src目录 问题一:创建gradle项目 首先打开ider创建gradle项目 新建项目选择左侧gradle,右侧选择自己jdk版本,勾选java项目,点击Next 写上GroupId组名ArtifactId项目名后点击Next 这里选择使用本地gradle分布,在下面url选择自己本机gradle路径即可,点击Next选择项目

  • 详解Gradle依赖冲突解决方式

    问题 在Android开发中,相信遇到关于版本依赖的问题的同学有不少.虽然Android Studio一般都会自动帮我们去重,但是有时候去重失败了还是需要手动处理.在这里总结下自己长期遇到的各类问题的解决方式. 为了方便看效果,我们改下gradle解决策略为有版本冲突时自动失败,如下: configurations.all { resolutionStrategy { failOnVersionConflict() } } 当我们同时依赖不同版本rxjava时编译会报错如下: 解决方案 1.统一

随机推荐