Gradle 奇技淫巧

2023-11-02

http://blog.chengyunfeng.com/?p=833

Gradle 奇技淫巧

作者: rain  分类: 奇技淫巧移动  发布时间: 2015-12-31 19:42  6 0条评论

Gradle 现在已经是 Android 开发必备的建构工具了。本文总结了一些在日常开发过程中会遇到的各种小技巧。
Android Gradle Plugin 的参考文档在这里 http://google.github.io/android-gradle-dsl/current/index.html

buildTypes 和 productFlavors

buildTypes 是指建构的类型,一般只用两种默认类型 debug 和 release ,顾名思义 debug 用来配置开发过程中的一些内容;release 用来配置正式发布版本的内容;这里面可以设置 applicationIdSuffix 、minifyEnabled 、name 等属性,所有的可配置属性参考这里 — BuildType 和 ProductFlavor

productFlavors 指各种产品分类,比如免费版本和收费版本。有些定制软件可能会出很多版本,通过 productFlavors 就非常方便, 比如某某输入法就经常出各种定制版,这样以后管理代码和发版就方便多了。

例如:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
defaultConfig {
     applicationId "org.goodev.material"
         // 配置生成的 BuildConfig 文件中的常量
     buildConfigField "String" , "CHANNEL" , '"PLAY_STORE"'
}
buildTypes {
     debug {
       buildConfigField "String" , "API_URL" , '"http://dev.goodev.org/"'
       buildConfigField "boolean" , "SHOW_LOG" , "true"
     }
     release {
       buildConfigField "String" , "API_URL" , '"http://api.goodev.org/"'
       buildConfigField "boolean" , "SHOW_LOG" , "false"
               signingConfig signingConfigs . release
     }
}
productFlavors {   
     youmi {
       applicationId = "org.goodev.material.youmi"
                 buildConfigField "String" , "CHANNEL" , '"YOUMI"'
                 resValue "string" , "app_name" , "Material free"
     }
     pro {
       applicationId = "org.goodev.material.pro"
                 buildConfigField "String" , "CHANNEL" , '"OTHER"'
                 resValue "string" , "app_name" , "Material pro"
     }
   }
    
signingConfigs {
     release {
         storeFile      "${System.env.PRIVATE_KEY}"
         keyAlias        "${System.env.ALIAS}"
         storePassword "${System.env.STORE_PW}"
         keyPassword    "${System.env.APP_PW}"
     }
}

保护私有数据

上面示例中还演示了如何通过 System.env 来访问系统环境变量中的值,这样你就可以把一些私有的内容排除在代码外,这样当你提交代码的时候,就不会泄露这些内容。还可以把私有数据放到local.properties 文件中:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     signingConfigs {
         release {
             def Properties localProps = new Properties ( )
             localProps . load ( new FileInputStream ( file ( 'local.properties' ) ) )
             def Properties keyProps = new Properties ( )
             if ( localProps [ 'keystore.props.file' ] != null ) {
                 keyProps . load ( new FileInputStream ( file ( localProps [ 'keystore.props.file' ] ) ) )
             }
             storeFile keyProps [ "store" ] != null ? file ( keyProps [ "store" ] ) : null
             keyAlias keyProps [ "alias" ] ? : ""
             storePassword keyProps [ "storePass" ] ? : ""
             keyPassword keyProps [ "pass" ] ? : ""
         }
     }

使用 Git tag 或者 hash 作为版本号

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
// query git for the SHA, Tag and commit count. Use these to automate versioning.
def gitSha = 'git rev-parse --short HEAD' . execute ( [ ] , project . rootDir ) . text . trim ( )
def gitTag = 'git describe --tags' . execute ( [ ] , project . rootDir ) . text . trim ( )
def gitCommitCount = 100 +
         Integer . parseInt ( 'git rev-list --count HEAD' . execute ( [ ] , project . rootDir ) . text . trim ( ) )
 
defaultConfig {
         versionCode gitCommitCount
         versionName gitTag
         archivesBaseName = "material-${versionName}"
         buildConfigField "String" , "GIT_SHA" , "\"${gitSha}\""
 
     }

使用建构的时间

Java
1
2
3
4
5
6
7
8
def buildTime = new Date ( ) . format ( "yyyy-MM-dd'T'HH:mm:ss'Z'" , TimeZone . getTimeZone ( "UTC" ) )
 
defaultConfig {
       buildConfigField "String" , "BUILD_TIME" , "\"${buildTime}\""
               // 还可以这样
                   buildConfigField "long" , "BUILD_TIME_LONG" , "${System.currentTimeMillis()}L"
 
     }

动态生成 Android Manifest 中的内容

为了让所有的 productFlavors 都可以安装到同一个手机上, 安卓系统要求不同的应用具有不同的 provider 等内容,如果冲突则其他应用无法安装,可以通过如下方式来解决该问题

XHTML
1
2
3
4
5
6
7
   <permission android : name = "${applicationId}.permission.XX"   
        android : protectionLevel = "signature" />
   <uses-permission android : name = "${applicationId}.permission.XX" />
 
   <provider   android : name = ".MyProvider"   
            android : authorities = "${applicationId}.provider"
             />

不同的 productFlavors 具有不同的 permission

有的应用,不同的版本可能要求的权限不一样,也就是不同的 productFlavors 所对应的 Manifest 文件内容是不同的,
除了通过上面的方式替代部分内容外,就要用到Manifest 文件合并功能了。

比如可以分别创建所有 productFlavors 对应的 AndroidManifest 文件:

app/src/free/AndroidManifest.xml
app/src/pro/AndroidManifest.xml
app/src/adsfree/AndroidManifest.xml

然后在默认的 Manifest 文件中写上所有的内容, 如果那个里面不需要某个 XML 属性,可以通过 tools:node=”remove” 来删除:

XHTML
1
2
3
     <permission
   android : name = "com.android.vending.CHECK_LICENSE"
   tools : node = "remove" />

另外还有一种方式就是,默认的 Manifest 文件中值写上共同的内容, 不同的内容分别写到对应的 productFlavors 的 Manifest 文件中。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gradle 奇技淫巧 的相关文章

随机推荐

  • YOLOv5:对yolov5n模型进一步剪枝压缩

    YOLOv5 对yolov5n模型进一步剪枝压缩 前言 前提条件 相关介绍 具体步骤 修改yolov5n yaml配置文件 单通道数据 黑白图片 修改models yolo py文件 修改train py文件 剪枝后模型大小 参考 前言 由
  • 线段树的入门-Poj2528(简单线段树和简单离散化)

    此题目的线段树就是一般的线段树思路 但是我们会发现他的范围实在是太大 怎么办 离散化 离散化的目的就是为了压缩空间 这个题目的离散化也是比较简单的 例如样例有5个区间 1 4 2 6 8 10 3 4 7 10 然后我们将这十个端点拿出来
  • SpringBoot实现装饰器模式

    文章目录 前言 一 装饰器模式简介 二 代码实现 1 定义制作奶茶接口 2 定义普通奶茶类 3 定义装饰器类 4 测试 总结 前言 装饰器模式在现实生活中的例子简直太多了 比如有个手机 裸机Phone类 如果需要不断的为这个Phone增添某
  • 使用VMware Workstation 16 Player安装ubuntu18.04

    VMware Workstation Player安装 这里是使用的VMware Workstation Player安装ubuntu虚拟机 软件安装不需要再说了吧 这里默认你已经安装好了VMware Workstation Player
  • 天天搜题 大学生在线免费的搜题网站

    1 网站使用Flask VUE3搭建 借助Nginx实现前后端全分离 题库已破千万 2 如果这篇文章的浏览量足够的话 我会使用Python高性能框架Tornado完整的教学大家如何编写 3 网站已经上线 大家可以进行测试 如果有什么逻辑问题
  • pgsql:odbc连接设置

    pgsql使用odbc工具连接时 需要安装pgsql odbc工具包 下载地址 psqlodbc数据源驱动 zip 互联网文档类资源 CSDN下载 1 选择数据库驱动 安装完后 在控制面板找到并打开odbc数据源 选择pgsql对应的驱动
  • WSL2常用命令、设置静态 IP 地址

    常用命令 列出分发版 wsl l wsl list wsl list all wsl list running 设置默认分发版 wsl s Ubuntu 取消注册和重新安装分发版 注销后 与该分发关联的所有数据 设置和软件都将永久丢失 从
  • 【详细】Spring、SpringBoot、SpringCloud、SpringCloudAlibaba、JDK、Maven版本对应关系

    注意 整理日期 2022年4月21日 0x0 SpringBoot Spring JDK Maven Spring Boot Version Spring Framework Version JDK Version Maven Versio
  • 南大通用GBase8s 常用SQL语句(284)

    在非缺省的语言环境中的 UNLOAD TO 数据格式 在非缺省的语言环境中 DATE DATETIME MONEY 和数值列值有语言环境对这些数据类型支持的格式 要获取更多信息 请参阅 GBase 8s GLS 用户指南 要获取更多关于 D
  • Java 删除链表中的节点

    删除链表中的节点 中等 有一个单链表的 head 我们想删除它其中的一个节点 node 给你一个需要删除的节点 node 你将 无法访问 第一个节点 head 链表的所有值都是 唯一的 并且保证给定的节点 node 不是链表中的最后一个节点
  • 二分查找--图文详解

    二分查找 1 什么是二分查找 2 原理 3 例子 3 1 当数组长度为奇数 3 1 当数组长度为偶数 3 3 实现过程 4 顺序查找与二分查找的区别 结束语 1 什么是二分查找 二分查找也称折半查找 是在一组有序 升序 降序 的数据中查找一
  • 刷题之旅第33站,CTFshow web12

    感谢ctf show平台提供题目 F12查看一下源代码 得到了提示 既然提示了cmd 那么可能后端代码中存在 eval 或者exec 等可以执行命令的代码 尝试提交 我们看到了php的配置信息 cmd phpinfo 使用glob通配符命令
  • C++笔记三(封装、静态、const、友元)

    1 C 面向对象特性 1 1C 面向对象的三大特性为 封装 继承 多态 万物皆对象 2 封装 2 1 封装的意义 其一 将属性和行为作为一个整体 表现生活中的事物 创建类别忘了 后有个 其实可以理解为类与结构体类似 类中的属性与行为统一称为
  • condition_variable用法

    参考文章 https blog csdn net princeteng article details 103945610添加链接描述 condition variable con 有两种用法 用法一 con wait lck return
  • UMC云管理平台下ESB产品升级说明

    随着近些年各种层出不穷的技术以及企业核心需求的推动 IT行业的发展势必会倒逼公司旗下产品的升级迭代 同时在产品由旧变新的升级过程中也有很多注意要点 由于公司产品大多以整合方案的形式部署到环境上 所以升级部署是否可快速简便尤为重要 产品升级对
  • 基于redis分布式锁解决定时任务重复问题

    在看代码之前请先看优化篇 基于Redis的Setnx实现分布式锁 p f 的博客 CSDN博客 1 在启动了上加 EnableScheduling 注解 SpringBootApplication MapperScan com xpf di
  • 华为OD机试 - 字符串分割(Java )

    题目描述 给定非空字符串s 将该字符串分割成一些子串 使每个子串的ASCII码值的和均为水仙花数 1 若分割不成功 则返回0 2 若分割成功且分割结果不唯一 则返回 1 3 若分割成功且分割结果唯一 则返回分割后子串的数目 输入描述 输入字
  • 运算放大器的选择---相关参数

    1 供电电压Vs 有单电源电压 双电源电压 双电源电压尽量两个电源都接 2 输入电压范围和输出电压范围 输入电压接近供电电压时 就称为输入电压轨到轨 如图8 LM358输入电压能达到负电源轨 不能达到正电源轨 输出电压非轨到轨 3 输入偏置
  • 的技术难点_推铅球技术教学的重点与难点

    一 推铅球的技术特点 推铅球技术的变革 无论从侧向到背向 还是从背向到旋转 不外乎有以下几个趋势 一是尽量加长铅球在手中运行的距离 使铅球预先获得较大的初速度 二是尽量加长最后用力的工作距离 三是能使更多的肌肉群参与推铅球的最后用力 并为这
  • Gradle 奇技淫巧

    http blog chengyunfeng com p 833 Gradle 奇技淫巧 作者 rain 分类 奇技淫巧 移动 发布时间 2015 12 31 19 42 6 0条评论 Gradle 现在已经是 Android 开发必备的建