在Android Studio中启用Release版本的LogCat

91

默认情况下,当我将 构建变体 更改为 发布 时,我在 logcat 上不会得到任何日志,但是我需要阅读我的应用程序的发布日志,该如何启用?


1
更改您的日志级别。我可能错了,但据我所知,当发布版本被导出时,Log.d调用会被移除 - 我不确定是否还有其他级别也会被移除。 - Squonk
@Squonk,我最近也发现在发布版本中Log.v日志也没有被暴露出来。有人知道这是什么原因吗? - Manmohan Soni
6个回答

103

<application>标签内,将android:debuggable="true"(默认值为false)添加到您的清单文件中。

来自文档:

android:debuggable
应用程序是否可以进行调试,即使在用户模式下运行时也可以——如果可以,则为“true”,否则为“false”。

分别是:

您可以通过从清单文件中的<application>标签中删除android:debuggable属性或在您的清单文件中将android:debuggable属性设置为false来禁用调试。

编辑

您可能需要在build.gradle文件的android{...}标记内添加以下内容:

lintOptions {
   checkReleaseBuilds false
}

作为一个附注:在设备上,日志总是会被记录,不论你的应用程序的“debuggable”属性设置为“false”还是“true”。但是只有在“debuggable”属性设置为“true”时,在Android Studio的LogCat中才能查看日志。(我刚测试过)

5
我认为这个答案不正确。至少,它引用的文档并没有说打开 android:debuggable 就会打开日志记录。实际上,https://developer.android.com/studio/publish/preparing.html#publishing-configure 相当明确地指出关闭日志记录和关闭调试是两个不同的事情。问答者询问如何打开日志记录。 - LarsH
附言:如果我错了,请纠正我,引用一份表明android:debuggable="true"启用日志记录的来源。 - LarsH
4
你说得有一定道理,但是debuggable的意思是可以将Android Studio中的Android Monitor附加到当前运行的APK上。这样可以在Logcat中显示日志语句,就像在调试版本中一样。除此之外:这个答案已经超过三年了 - 所以你很可能应该转而使用对应的build.gradle属性debuggable,可以根据buildType进行设置。 - reVerse

41

你应该添加

android {
    buildTypes {
        release {
            debuggable true

在这种情况下,你可以使用Log.System.out.println来查看日志。

如果你无法运行发布版本(app已禁用),并出现错误提示:“apk未签名。请使用“项目结构”对话框配置所选flavor的签名信息”,请参见app-release-unsigned.apk未签名


5
这对我很有效。在启用混淆(proguard)后,释出版本(release build)中有日志记录是必要的,至少第一次需要这样做。但不要忘记将生产版本(production builds)的 debuggable 设置为 false :) - MohK
@MohK,我同意你的看法。很奇怪,但在另一个项目中,我在“发布”版本中有“debuggable false”,但即使处于“true”状态,仍然看不到日志和调试信息。 :) - CoolMind
@CoolMind 这个项目是用Java开发的。 - IldiX
@IldiX,我在“发布”版本中设置了“debuggable false”(“minifyEnabled true”,“shrinkResources true”),但是“Log.d()”仍然可以使用。AS 3.6.1。 - CoolMind
@thecr0w,很高兴听到这个好消息!祝你好运! - CoolMind
显示剩余2条评论

34

我不喜欢另一种解决方案,因为那样你就无法测试应用程序的实际部署情况。

更好的解决方案是打开Android设备监视器,即使在发布配置下使用debuggable=false,也可以查看日志。

在这里找到它:

工具-> Android -> Android设备监视器

更新:
Android Studio 3.2中删除了Android Device Monitor。但是,它仍然存在于SDK中,您可以使用它来查看日志(位于$ANDROID_SDK/tools/)。


3
市场上的应用程序在清单中没有提到可以进行调试(因此是错误的)。在Android Studio的LogCat或DeviceMonitor中没有任何信息。 - Den Drobiazko
5
以此方式,您将看不到 Log.v 和 Log.d。 - NikkyD
@JensV 你仍然可以按照你的包名进行过滤,对吧? - bj4947
1
Android Device Monitor在AS 3.2中已被移除 - https://developer.android.com/studio/profile/monitor 但是,它仍然存在于SDK中,您可以使用它来查看日志(它位于$ANDROID_SKD/tools/)。 - Vadim Kotov
1
有一个错别字:应该是$ANDROID_SDK/tools/而不是$ANDROID_SKD/tools/ - 不幸的是,我无法保存我的编辑。 - Remigius Stalder
显示剩余5条评论

5

这种方法显然可以帮助您在测试生产版本时获取日志。但是,在将应用上载到Google Play商店之前,请确保将 debuggable 开关设置为 false

buildTypes {
    debug {
        manifestPlaceholders = [crashlyticsCollectionEnabled: "false"]
    }
    release {
        manifestPlaceholders = [crashlyticsCollectionEnabled: "false"]
        lintOptions {
            checkReleaseBuilds false
            abortOnError false
        }
        shrinkResources true
        minifyEnabled true
        debuggable true
        signingConfig signingConfigs.productionrelease
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

crashlyticsCollectionEnabled 设置为 false 可以避免在调试时崩溃报告发送到 Google Play 商店。

3
在build.gradle中设置“debuggable true”是有效的,但这会导致“BuildConfig.DEBUG”也为true。如果您的应用程序依赖于“BuildConfig.DEBUG”仅在调试版本时执行某些操作,则可能会出现问题。
在这种情况下,请尝试使用“Log.wtf(BuildConfig.APPLICATION_ID,“something went wrong”)”,即使是发布版构建,它也会打印到logcat中。

同意你的观点。在这种情况下,我在配置类中添加了一个常量,用于测试和发布版本(而不是依赖于BuildConfig.DEBUG)。例如:const val TEST = true。但是不要忘记在发布应用程序时更改它的值。 - CoolMind
Log.wtf非常有用。 - tenprint

2
在logcat的过滤字段中删除"package:mine"。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接