惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
雷峰网
雷峰网
IT之家
IT之家
I
InfoQ
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 【当耐特】
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
月光博客
月光博客
P
Proofpoint News Feed
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
G
Google Developers Blog
小众软件
小众软件
宝玉的分享
宝玉的分享
Jina AI
Jina AI
V
Visual Studio Blog

技术小黑屋

Vibe Coding 的安全风险与应对策略 - 技术小黑屋 Vibe Coding 最佳实践:10 个让开发效率提升 10 倍的关键技巧 一看就会,为 AI 编程 Agent 撸一个 MCP 服务 同样是 Sonnet 4.5,为何 CLI 工具差距这么大 Android 升级 targetSDK 35 解决 namespace 问题 解决 Android Studio 关闭后终端 flutter run 进程自动结束的问题 使用 grep 查找关键字并显示上下文行 - 技术小黑屋 Android 开发中的三个常见构建错误及解决方案 - 技术小黑屋 使用 flock 解决 Git `unable to read tree` 问题 幂等性的劣化:从数学确定性到 AI 不确定性 - 技术小黑屋 Could not create task ':generateDebugRFile' 问题小记 Android 模拟器实现 hosts 修改 - 技术小黑屋 Vs Code 快速实现 重写 方法 Merge(Pull) Request 推荐的标签列表 - 技术小黑屋 中国特惠!多平台广告屏蔽专家 AdGuard 买断仅需 119 元起 使用 FVM 解决 flutter 3 无法添加 uploader 问题 AAPT2 aapt2-7.2.2-7984345-osx Daemon #5: Idle daemon unexpectedly exit. This should not happen 问题解决 git clone 使用代理,实现百倍加速 - 技术小黑屋 Flutter 处理 Error Setter not found AsciiChar 问题
定位 Android 权限声明来源 - 技术小黑屋
androidyue · 2025-10-12 · via 技术小黑屋

开发中经常需要排查某个权限是由哪个依赖库引入的,本文记录通过 Gradle daemon 日志快速定位权限来源的方法。

查询方法

使用以下命令在 Gradle daemon 日志中搜索权限声明:

1
grep -n -C 2 "android.permission.INTERNET" --include="*.out.log" -R ~/.gradle/daemon/ .

参数说明

  • -n:显示行号
  • -C 2:显示匹配行前后各 2 行上下文(关于 grep 上下文参数的详细用法见这篇文章
  • --include="*.out.log":只搜索 .out.log 文件
  • -R:递归搜索目录
  • ~/.gradle/daemon/:Gradle daemon 日志目录

daemon 日志文件说明

什么是 daemon*.out.log

Gradle daemon 是 Gradle 构建系统的后台进程,用于加速构建过程。daemon-*.out.log 文件记录了 daemon 进程的详细输出信息,包括:

  • 依赖解析过程:库的下载、合并信息
  • Manifest 合并日志:权限、组件的合并来源
  • 构建任务执行:编译、打包等任务的详细输出
  • 错误堆栈信息:构建失败时的完整日志

文件位置

1
2
3
4
5
6
7
~/.gradle/daemon/
├── 5.4.1/
│   ├── daemon-77407.out.log
│   └── daemon-77408.out.log
├── 7.0.2/
│   └── daemon-88901.out.log
└── ...

每个 Gradle 版本对应一个目录,每次 daemon 启动会生成新的日志文件,文件名中的数字为进程 ID。


结果分析

查询结果示例

1
2
/daemon/5.4.1/daemon-77407.out.log:132336:Merging uses-permission#android.permission.INTERNET 
with lower [net.butterflytv.utils:rtmp-client:3.0.1] AndroidManifest.xml:11:5-67

信息解读

从日志可以看出:

  • 权限名称android.permission.INTERNET
  • 来源依赖net.butterflytv.utils:rtmp-client:3.0.1
  • 声明位置:该依赖的 AndroidManifest.xml 第 11 行
  • 日志文件daemon-77407.out.log 第 132336 行

处理方式

使用 <uses-permission tools:node="remove"> 在主 Manifest 中显式移除。


注意事项

  • daemon 日志会随着构建次数增多而变大,定期清理 ~/.gradle/daemon/ 目录
  • 不同 Gradle 版本的日志格式可能略有差异
  • 查询结果可能包含多个匹配项,需根据依赖关系判断实际来源

延伸阅读