楔子

log在发布版本中打印会出现极大的安全问题,但在debug版本中确是不可缺少的。

需求

自动判断当前版本类型,选择是否输出log

实现

查阅了stormzhang的文章,提出使用BuildConfig.DEBUG和自定义BuildConfig字段,网上还有第三种方法通过 ProGuard 优化掉 Log 代码

stormzhang的文章地址

一.BuildConfig.DEBUG

首先在Gradle脚本中默认的debug和release两种模式BuildCondig.DEBUG字段分别为true和false,而且不可更改。该字段编译后自动生成,在Studio中生成的目录在 app/build/source/BuildConfig/Build Varients/package name/BuildConfig 文件下。

if (BuildConfig.DEBUG) {

Logger.d(Xml);

}

需要注意的事,并不是通过条件判断去除的log。而是通过编译器优化的原理,因为BuildConfig.DEBUG是一个常量,所以这整段代码都会在编译时删除。

二.自定义BuildConfig字段

三.通过 ProGuard 优化掉 Log 代码

四.一个可能遇到的问题

可以看到stormzhang的文章下有个被顶起来的问题没有得到解答。小僧不才,斗胆一试。

问题出现原因

大的项目一般不会只有一个主模块,会抽取出一些公用类和方法放在子模块,主模块依赖子模块。而BuildConfig是根据模块来生成的,每个模块都有一个。

那么他们的BuildConfig.DEBUG就毫无相关性了。也失去了这段代码的意义。

解决问题

主模块由于依赖可以直接使用子模块的方法和属性。但是子模块想得到主模块的变量就要依靠java的神器,反射。

//主模块方法

public static boolean isDebug(){

return BuildConfig.DEBUG;

}

//子模块通过反射调用主模块的debug属性

public static boolean getGotobusIsDebug() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {

return (boolean) Class.forName(classGotobusConfig).getMethod("isDebug").invoke(null);

}

参考

android 自动打印出来,Android:签名打包后关闭Log打印相关推荐

  1. android 自动 键盘,关于Android中的软键盘

    InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系 ...

  2. android自动创建快捷方式,Android开发之生成桌面快捷方式细则(原创)

    本文已独家授权 郭霖 ( guolin_blog) 公众号发布! 申明,标题里的快捷方式不是指开发人员使用频率极高的Ctrl+C和Ctrl+V:也不是IDE里Ctrl+D.Ctrl+F等常用快捷键.这 ...

  3. android自动夜间模式,Android实现日夜间模式的深入理解

    在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...

  4. Android 自动搜索频道,Android自定义收音机搜台控件RadioRulerView

    前言:像这类的自定义控件有非常多的开源项目,但还是没有找到我项目想要的,所以简单实现了一个,下面简单讲讲实现原理. 效果图: 实现思路: 首先画固定背景尺子,而实现这个则要计算刻度线的宽度.刻度线间的 ...

  5. android自动添加包,android nfc写入应用程序包名与网址 自动打开应用程序与网址...

    安卓手机大部分手机提供了NFC芯片   可以根据NFC传递数据   NFC卡与手机  手机与手机数据等交互  非常好的功能,这篇文章教大家如何向NFC卡或标签写入功能. 用法 :  点击包名   将N ...

  6. Android自动伸展动画,android – 如何实现平滑的展开/折叠动画

    我指的是在这里找到的扩展/折叠动画代码. 虽然这样做不好,动画不顺利. 我做一些登录代码. public static void expand(final View v) { v.measure(Me ...

  7. android自动更新demo,Android程序自动更新功能模块的实现方法【附完整demo源码下载】...

    本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更 ...

  8. android自动切换图片,Android应用中图片浏览时实现自动切换功能的方法详解

    先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com. ...

  9. android 自动挂断,android实现接通和挂断电话

    本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...

最新文章

  1. 统一异常处理+错误编码设计方案
  2. 扎克伯格“气哭”了:Meta搞元宇宙巨亏,股价暴跌市值蒸发2000多亿美元
  3. VScode操作记录
  4. JS类的封装及实现代码
  5. java高并发(八)不可变对象
  6. 重构javascript_JavaScript代码清理:如何重构以使用类
  7. Flask 中的数据库迁移
  8. 触发器 创建 删除 等操作
  9. [转载] Python快速编程入门课后程序题答案
  10. php模板和框架,php模板和框架的区别的区别是什么
  11. 在你公司Code Review是一种形式,还是一种开发文化?
  12. 20道常见的kafka面试题以及答案
  13. 微信小程序地图和百度地图定位位置不一样
  14. kali linux暴力破解wifi密码
  15. ios睡眠分析 卧床 睡眠_使用Swift在HealthKit中进行睡眠分析
  16. Redis分布式锁真的安全吗?
  17. 优动漫PAINT的变形文字工具教程
  18. html 播放amr ios,关于iOS设备以amr格式播放音频文件
  19. 第三方框架Masonry的基本使用
  20. 扫码签到突破100000用户

热门文章

  1. JDBC连接数据库的步骤
  2. PHP中ob系列函数讲解(浏览器缓存技术)
  3. 浅析希区柯克的悬念电影:以《惊魂记》为例
  4. 所有C#程序员必须知道的13件事
  5. 沙发家具网站源码_小户型装修不会选家具?大湾网推荐你了解这些装修风格家具,装修省心空间大!...
  6. spark java 案例_Spark入门案例
  7. python星号什么意思_Python星号*与**用法分析
  8. Python+OpenCV:二维直方图(2D Histograms)
  9. TensorFlow:曼德布洛特(Mandelbrot)集合
  10. 机器视觉基本设计因素有哪几点?