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

相关文章

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设