Kotlin DSL环境下为何Play Store发布包仍能输出日志?
关于Release版本日志仍可通过USB获取的问题
我们未在Release模式下启用日志,但通过USB连接Android Studio时,仍能获取到从应用商店下载的Release版本的日志。
当前BuildTypes配置(Kotlin DSL)
buildTypes { debug { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) configure<CrashlyticsExtension> { // No need during development, enabling it also prevents Gradle to work offline mappingFileUploadEnabled = false } signingConfig = signingConfigs.getByName("debug") } release { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig = signingConfigs.getByName("release") } }
疑问
使用Kotlin DSL时,是否需要在构建变体中显式禁用日志?
日志片段(三星A32,Android 13)
02:37:01.463 I ViewPostIme pointer 0 02:37:01.563 I ViewPostIme pointer 1 02:37:01.581 D initGoToTop 02:37:01.594 D [NativeCFMS] BpCustomFrequencyManager::BpCustomFrequencyManager() 02:37:01.631 I Relayout returned: old=(0,80,1080,2274) new=(28,669,1052,1684) req=(1024,1015)0 dur=10 res=0x3 s={true 0xb400006f071bd800} ch=true seqId=0 02:37:01.632 I mThreadedRenderer.initialize() mSurface={isValid=true 0xb400006f071bd800} hwInitialized=true 02:37:01.632 D eglCreateWindowSurface 02:37:01.637 D onsize change changed 02:37:01.638 I reportNextDraw android.view.ViewRootImpl.performTraversals:4438 android.view.ViewRootImpl.doTraversal:3116 android.view.ViewRootImpl$TraversalRunnable.run:10885 android.view.Choreographer$CallbackRecord.run:1301 android.view.Choreographer$CallbackRecord.run:1309 02:37:01.638 I Setup new sync id=0 02:37:01.639 I Setting syncFrameCallback 02:37:01.639 I registerCallbacksForSync syncBuffer=false 02:37:01.643 I Received frameDrawingCallback syncResult=0 frameNum=1. 02:37:01.643 I Setting up sync and frameCommitCallback
解答
无需在Kotlin DSL构建变体中显式禁用日志,但要确保ProGuard/R8的优化配置正确——Release构建默认不会自动移除所有应用日志,依赖混淆规则处理。
自定义日志移除方法:在
proguard-rules.pro中添加以下规则,配合proguard-android-optimize.txt的优化配置,可移除应用中的Log调用:
-assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int i(...); public static int w(...); public static int d(...); public static int e(...); }
注意:该规则仅在启用优化(proguard-android-optimize.txt包含优化配置)时生效,若使用默认的proguard-android.txt则不会触发。
系统日志无法移除:日志片段中的
ViewPostIme、mThreadedRenderer等属于系统级日志,是Android系统组件输出的,不受应用构建配置影响,无论Release还是Debug版本都能看到。只有initGoToTop这类自定义应用日志可以通过ProGuard移除。额外验证点:
- 确认应用商店上架的是正确的Release构建,而非Debug版本;
- 检查
isMinifyEnabled和isShrinkResources在Release变体中确实被设为true,确保混淆和资源收缩生效。
内容的提问来源于stack exchange,提问作者Bitwise DEVS
相关产品推荐
相关产品推荐

