日志记录标记最多可包含23个字符

Tom*_*mCB 43 logging android android-studio

自从更新AS 1.1 Preview 2后,我的所有Log消息都显示红线

Log.d(TAG, "message");
Run Code Online (Sandbox Code Playgroud)

带有消息:" 日志记录标记最多可包含23个字符.. ".

除了Android Studio本身,我没有从根本上更新任何内容.这是一个错误吗?

squ*_*ish 43

如果您愿意,可以禁用它.

在Android Studio中,分析 - >检查代码.

截图

在检查配置文件下,单击带有3个水平点的按钮.

应打开以下窗口.搜索"log"并取消选中"Too Long Log Tags".

截图

更新: Android Studio 2.2,它位于Android Lint:Correctness下

截图

  • 这有什么后果? (10认同)

And*_* T. 38

不,这不是一个错误.

来自Android Studio 1.1 Preview 2的最新更改,

检查传递给日志记录调用的标记(如果其值可以解析)最多为23个字符(根据Logging API的要求).

记录标记是31

正如最近对最近的变化所解释的,这是由于如何 Log API不允许超过23个字符的标记.

SLF4J Android对此有一个解释:

[...]此类标签的长度目前限制为23个字符(23 = 32 - 8表示名称空间前缀 - 1表示C终结符)

它与Android的源代码相匹配.

目前,唯一明确提到此异常的函数是Log.isLoggable(),

...

抛出

如果tag.length()> 23,则抛出IllegalArgumentException.

但是,根据注释,显然记录器会在发布模式下抛出异常(在调试模式下会被忽略).

您可以按照Terence的回答禁用lint检查,但是您已经收到警告.

  • 这背后的逻辑是什么?当然错误是系统生成的,我可以获得的错误和我可以键入的字符串之间存在某种相关性,但它包含我在"字符串"中使用的ASCII字符,为什么它不允许23个字符,甚至为什么23 ?谢谢. (3认同)
  • 来自[Android源代码](https://github.com/android/platform_frameworks_base/blob/master/core/jni/android_util_Log.cpp#L84),这是由于32(属性键的最大长度) - 8(名称空间前缀) - 1(C终结符),引自[SLF4J Android](http://www.slf4j.org/android/). (2认同)
  • 这种棉绒检查只是无意义的.你可以非常肯定Android会在*Log.d`等人中开始执行此操作.因为那只会打破大量的应用程序而没有任何*好的理由.我真的希望将来可以改进lint检查,以便更严格地显示或仅仅使用`Log.isLoggable()`. (2认同)
  • 你永远不能禁用这个lint检查,因为它在发布时崩溃应用程序(最有趣的是它在调试模式下不会崩溃) (2认同)
  • @HeathBorders 注意您给出的引用有一个拼写错误,目前文档说:“如果 Nougat (7.0) 和之前版本 (API <= 25) 的 tag.length() > 23,则抛出 IllegalArgumentException,没有标签限制关注此 API 级别。` - 在 https://issuetracker.google.com/issues/124593220 中修复此问题后 (2认同)

str*_*aya 18

补充@Terence的答案

您还可以在build.gradle文件中使用gradle关闭特定的检查:

lintOptions {
    disable 'LongLogTag'
}
Run Code Online (Sandbox Code Playgroud)

或者使用xml将lint.xml文件添加到项目中:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="LongLogTag" severity="ignore" />
</lint>
Run Code Online (Sandbox Code Playgroud)

  • 你应该把`lintOptions`放在`android`块中 (2认同)

Jac*_*cky 6

你永远不能忽略这个lint检查,它肯定会在你的发布版本上带来意想不到的结果,因为它抛出异常并停止执行(它不会使你的应用程序崩溃).

我最近得到了一个可怕的教训:它在调试模式下没问题,但在发布版本上表现不同.