如何在Library模块中为Firebase Performance Monitor添加自定义追踪
我之前也碰到过这个问题,Firebase Performance确实对Library模块的直接集成支持有限,不过有两个靠谱的方案能帮你实现Library模块的自定义追踪需求,下面一步步给你拆解:
方案一:接口抽象+依赖注入(推荐,低耦合)
这个思路是让Library模块只定义追踪行为的接口,不直接依赖Firebase Perf,由App模块提供具体的Firebase实现,完美规避Library模块的限制。
- 在Library模块定义追踪接口
创建一个通用的性能追踪接口,涵盖你需要的自定义追踪能力:
// Library模块中 interface PerformanceTracker { fun startCustomTrace(traceName: String) fun stopCustomTrace(traceName: String) fun addTraceAttribute(traceName: String, key: String, value: String) }
- Library模块业务代码依赖接口实现追踪
在Library的业务逻辑中,通过注入的接口实例调用追踪方法,完全不直接接触Firebase类:
// Library模块中 class FileProcessingUtil(private val tracker: PerformanceTracker?) { fun processLargeFile(filePath: String) { // 开始追踪 tracker?.startCustomTrace("library_file_processing") tracker?.addTraceAttribute("library_file_processing", "file_path", filePath) // 执行你的文件处理逻辑 // ... // 结束追踪 tracker?.stopCustomTrace("library_file_processing") } }
- App模块实现Firebase版本的追踪接口
利用你已经集成好的Firebase Perf依赖,实现Library定义的接口:
// App模块中 class FirebasePerfTracker : PerformanceTracker { private val perfInstance = FirebasePerformance.getInstance() private val activeTraces = mutableMapOf<String, Trace>() override fun startCustomTrace(traceName: String) { val trace = perfInstance.newTrace(traceName) trace.start() activeTraces[traceName] = trace } override fun stopCustomTrace(traceName: String) { activeTraces.remove(traceName)?.stop() } override fun addTraceAttribute(traceName: String, key: String, value: String) { activeTraces[traceName]?.putAttribute(key, value) } }
- 初始化Library组件时注入实现
在App模块中创建Library业务类实例时,把Firebase的追踪实现传进去:
// App模块中 val firebaseTracker = FirebasePerfTracker() val fileProcessor = FileProcessingUtil(firebaseTracker) fileProcessor.processLargeFile("/sdcard/test.pdf")
方案二:CompileOnly依赖+ProGuard配置(快速实现,强耦合)
如果不想做接口抽象,也可以通过compileOnly让Library模块能编写Firebase Perf代码,由App模块提供实际依赖:
- Library模块添加CompileOnly依赖
在Library的build.gradle中添加:
// Library模块build.gradle dependencies { compileOnly 'com.google.firebase:firebase-perf:20.4.0' // 替换为你使用的最新版本 }
- Library模块直接编写Firebase追踪代码
现在可以在Library里直接调用Firebase Perf的API了:
// Library模块中 fun fetchRemoteData() { val trace = FirebasePerformance.getInstance().newTrace("library_remote_fetch") trace.start() // 执行网络请求逻辑 // ... trace.stop() }
- App模块配置ProGuard避免代码被移除
因为Library里的Firebase代码是编译时依赖,要确保ProGuard不会把这些代码混淆或移除,在App模块的proguard-rules.pro中添加:
-keep class com.google.firebase.perf.** { *; } -keep class com.google.android.gms.measurement.** { *; }
注意:这个方案会让Library模块和Firebase Perf强耦合,如果后续要替换监控工具,改动成本会很高,所以更推荐方案一。
内容的提问来源于stack exchange,提问作者Nidhin
相关产品推荐
相关产品推荐

