发布Android应用时Log.i()语句会被移除吗?不删除直接发布安全吗?
Android正式包日志相关问题解答
1. 正式发布的APK是否会自动移除Log.i()语句?
默认不会自动移除。只有同时满足以下两个条件时,Log.i()才会在构建正式包阶段被自动删除:
- 开启了构建配置中的
minifyEnabled开关(即开启混淆/压缩能力) - 在ProGuard/R8规则文件中添加了移除日志的配置,常用规则如下:
-assumenosideeffects class android.util.Log { public static *** v(...); public static *** i(...); public static *** d(...); public static *** w(...); public static *** e(...); }
注:两个条件缺任意一个,都不会自动清理代码里的
Log调用。
2. 不删除Log.i()直接发布是否存在风险?
存在明确的安全风险,不建议未清理日志就上线正式包:
- 若日志中包含用户账号、身份token、接口请求参数、设备唯一标识等敏感信息,只要开启USB调试、或是安装了可读取系统日志的应用,就能直接拿到所有日志内容,极易被用于恶意攻击、数据爬取。
- 即使确认日志无敏感信息,大量日志输出也会增加应用不必要的性能消耗,占用系统日志缓冲区,还可能被竞品用于分析你的应用业务逻辑。
- 部分应用市场的安全检测规则会扫描残留的公开日志输出,可能判定应用存在安全隐患,影响上架流程。
推荐处理方案
可以自行封装全局日志工具类,通过编译常量自动控制日志开关,无需手动删除代码就能避免日志泄露风险,示例如下:
public class LogUtils { // 编译时自动识别构建类型,Debug包开启日志,Release包自动关闭 private static final boolean ENABLE_LOG = BuildConfig.DEBUG; public static void i(String tag, String msg) { if (ENABLE_LOG) { Log.i(tag, msg); } } // 其他日志等级的方法按照相同逻辑封装即可 }
内容的提问来源于stack exchange,提问作者Bhaskar Jyoti Dutta
相关产品推荐
相关产品推荐

