如何借助ProGuard与R8移除特定包外的所有日志调用?
Android Release模式下保留指定包日志的ProGuard配置
当前配置情况
我已将Android项目配置为Release模式下移除所有日志,具体配置如下:
build.gradle(app)配置
postprocessing { removeUnusedCode false obfuscate false optimizeCode true proguardFile 'proguard-rules.pro' }
proguard-rules.pro规则
-assumenosideeffects class android.util.Log { *; }
需求
当前配置会移除应用内所有Log.*调用,但希望保留特定包(例如com.mylibrary)内的日志,需要调整ProGuard规则。
正确配置方案
ProGuard并不支持-except-in这类语法,正确的做法是先保留目标包的Log调用,再对其余代码启用日志移除:
修改proguard-rules.pro为以下内容:
# 保留com.mylibrary包下所有类的Log相关方法调用 -keepclassmembers class com.mylibrary.** { public static *** d(...); public static *** e(...); public static *** i(...); public static *** v(...); public static *** w(...); public static *** wtf(...); } # 移除其他所有类的Log调用 -assumenosideeffects class android.util.Log { public static *** d(...); public static *** e(...); public static *** i(...); public static *** v(...); public static *** w(...); public static *** wtf(...); }
说明
-keepclassmembers规则确保com.mylibrary包下所有类的Log方法(debug、error、info等)不会被移除;-assumenosideeffects规则会移除其他所有类的Log调用,实现"仅保留指定包日志"的需求;- build.gradle中的
postprocessing配置无需修改,保持原有设置即可。
内容的提问来源于stack exchange,提问作者Two Horses
相关产品推荐
相关产品推荐

