Gradle构建控制Log开关——BuildConfig\自定义

2023-11-09 18:59

本文主要是介绍Gradle构建控制Log开关——BuildConfig\自定义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50553945 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

关于使用Gradle来控制版本和生成不同版本的代码,我总结了三篇文章,网上关于这些知识,都比较零散,我在学习这些的之前,根本不知道还有这样的方法。所以说不知道并不可怕,可怕的是不知道自己不知道。相信这三篇文章,会给你不少灵感

Gradle构建控制Log开关——BuildConfig\自定义

使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中 < meta-data>变量的值

Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量

在Android开发中,很多时候我们会自己封装一个Log类,里面设置一个开关,

  • 在开发的时候将所有级别的Log全部打开输出。
  • 在发布应用前,把Log.i和Log.d这类级别的Log关闭,仅留下Log.e类型的输出。

这样做是为了防止别人通过log来研究我们的代码,同时也可以把一些不必要给别人看的信息过滤掉。

方案1:通过BuildConfig类来关闭

当你使用Android Gradle插件打包,执行默认的build任务时,会在build/intermediates/classes/release中自动生成一个BuildConfig.class


有class就应该有java源代码文件啊,那么这个class文件对应的java文件在哪里呢?

答案是app/build/generated/source/buildConfig/下。

关于这个生成的类文件,我们可以通过在build.gradle脚本中的buildTypes闭包中指定参数,使得这个类生成出来的时候包含一个我们自定义的boolean类型的静态常量ENABLE_DEBUG,直接上代码:

buildTypes {release {// 不显示logbuildConfigField "boolean", "ENABLE_DEBUG", "false"...}debug {// 显示LogbuildConfigField "boolean", "ENABLE_DEBUG", "true"...}}

按照上面的脚本编写之后,

  • 生成的release版BuildConfig类中就会多出一个常量,即
 public static final boolean ENABLE_DEBUG = false;;
  • 而debug版的BuildConfig类中的常量值则为true,即
public static final boolean ENABLE_DEBUG = true;。

你可以分别在源代码中调用这两个常量,最后这两个类分别也会被打包到release和debug版各自的apk文件当中。

当你修改build.gradle脚本以后,按照Android Studio的提示,点击Gradle Sync,就可以在之前我们自定义的UncleNought测试类中调用BuildConfig类中常量,可以看到ENABLE_DEBUG这个类已经自动生成出来了。下面是一段调用的示例:

package com.nought.hellolib;import android.util.Log;public class UncleNought {public static void Output() {if (BuildConfig.ENABLE_DEBUG) {Log.i(UncleNought.class.getSimpleName(), "I'm a library!");}}
}

方案2:自定义Log开关

假设我们不想把BuildConfig打包进来,只想在自己的类中定义一个常量,然后在release的时候修改这个动态去常量,应该怎么做呢?这个时候就可以利用gradle强大的能力了,话不多说,一步步看代码。

首先在测试类的代码里添加一个常量ENABLE_DEBUG

package com.nought.hellolib;import android.util.Log;public class UncleNought {public static boolean ENABLE_DEBUG = true;public static void Output() {if (ENABLE_DEBUG) {Log.i(UncleNought.class.getSimpleName(), "I'm a library!");}}
}

然后修改build.gradle文件,添加:

def enableLoggerDebug(boolean flag) {def loggerFilePath = "src/main/java/com/qq/e/comm/util/GDTLogger.java"def updatedDebug = new File(loggerFilePath).getText('UTF-8').replaceAll("DEBUG_ENABLE\\s?=\\s?" + (!flag).toString(), "DEBUG_ENABLE = " + flag.toString())new File(loggerFilePath).write(updatedDebug, 'UTF-8')println(flag ? 'GDTLogger.DEBUG_ENABLE : [true]' : 'GDTLogger.DEBUG_ENABLE : [false]')
}preBuild {}.doFirst {if (('jarMyLib' in gradle.startParameter.taskNames)) {enableLoggerDebug(false)}
}jarMyLib {}.doLast {enableLoggerDebug(true)
}

前面我提过,Gradle兼容Java的语法,所以我就想到,可以用正则表达式替换掉原来代码中的true,让它变成false。

  • 要保证这该替换必须发生在complileReleaseJavaWithJavac之前,
  • 然后在打包彻底完成以后,再把Log开关打开,即再false变回true,使得开发环境一直都是可以输出Debug Log的。

打包前执行下面这条语句,得出的结果是:public static boolean ENABLE_DEBUG = false;

gradle jarMyLib

参考:
Gradle实践之自定义打包jar+Log开关自动关闭

http://www.cnblogs.com/kangyi/p/4448398.html

关注我的公众号,轻松了解和学习更多技术
这里写图片描述

这篇关于Gradle构建控制Log开关——BuildConfig\自定义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378006

相关文章

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息