热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidFirebase快速解决合规问题第4篇,解决FirebaseAnalytics库违规获取应用列表问题

文章目录系列文章背景依赖环境解决方案堆栈信息分析问题尝试方案一尝试方案二解决问题最后系列文章android使用ContentProvider初始化sdk,初始化时机


文章目录

  • 系列文章
  • 背景
  • 依赖环境
  • 解决方案
  • 堆栈信息
  • 分析问题
    • 尝试方案一
    • 尝试方案二
  • 解决问题
  • 最后


系列文章


  • android使用ContentProvider初始化sdk,初始化时机
  • Android ContentProvider初始化流程简化分析
  • Android-Firebase快速解决合规问题第1篇,汇总篇,一步解决问题
  • Android-Firebase快速解决合规问题第2篇,解决FirebasePerformance库获取软件安装列表的行为
  • Android-Firebase快速解决合规问题第3篇,解决FirebaseCrashlytics库违规网络请求、获取AndroidId问题
  • Android-Firebase快速解决合规问题第4篇,解决FirebaseAnalytics库违规获取应用列表问题

背景

2022年9月,小米应用商店上架审核,提示存在违规行为。
违规行为:未经许可读取个人信息 | 获取应用列表


依赖环境

demo的环境如下,只是为了演示firebase出现的问题,本篇文章基于Flutter作为开发语言,实现了demo演示问题,原生库、RN库同理可以解决问题。
android版本:
build.gradle

compileSdkVersion 31
minSdkVersion 21
targetSdkVersion 31

futter版本:Flutter 2.10.5
pubspec.yaml

firebase_core: 1.10.0
firebase_messaging: 10.0.0
firebase_crashlytics: 2.2.0
firebase_analytics: 9.1.0
firebase_performance: 0.7.0+3
dio_firebase_performance: ^0.3.0

解决方案

修改firebase_analytics插件,
修改的源码,分支firebase_analytics-v9.1.0-20220913。

等到用户同意后再执行,flutter调用以下方法,就会初始化FirebaseAnalytics。

// flutter
FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true)

堆栈信息

callstack:android.app.ApplicationPackageManager.getInstallerPackageName:2044;
com.google.android.gms.measurement.internal.e3.k:8;
com.google.android.gms.measurement.internal.c4.i:2;
com.google.android.gms.measurement.internal.y4.c:13;
com.google.android.gms.measurement.internal.x4.run:1;
java.util.concurrent.Executors$RunnableAdapter.call:458;
java.util.concurrent.FutureTask.run:266;
com.google.android.gms.measurement.internal.u4.run:6;

官方反馈的堆栈信息,看得莫名其妙。只好根据之前的定位问题的方式,找到栈顶方法,进行debug调试。
在这里插入图片描述
在这里插入图片描述


分析问题

从堆栈信息和debug断点模式来看,应用启动后就会执行到这,是gms(谷歌移动服务)发生的问题。那现在就要找到什么地方调用起来。


尝试方案一

根据之前的猜测可能是引入了gms相关的provider,自动初始化了。找到debug包中的AndroidManifest文件,查看有关的gms配置,我给每一项都加入tools:node=“remove”,移除该项配置,结果并没有用。

<receiverandroid:name&#61;"com.google.android.gms.measurement.AppMeasurementReceiver"android:enabled&#61;"true"android:exported&#61;"false" ></receiver><serviceandroid:name&#61;"com.google.android.gms.measurement.AppMeasurementService"android:enabled&#61;"true"android:exported&#61;"false" /><serviceandroid:name&#61;"com.google.android.gms.measurement.AppMeasurementJobService"android:enabled&#61;"true"android:exported&#61;"false"android:permission&#61;"android.permission.BIND_JOB_SERVICE" /><serviceandroid:name&#61;"com.google.android.gms.auth.api.signin.RevocationBoundService"android:permission&#61;"com.google.android.gms.auth.api.signin.permission.REVOCATION_NOTIFICATION"android:exported&#61;"true" /><activityandroid:theme&#61;"&#64;ref/0x01030010"android:name&#61;"com.google.android.gms.common.api.GoogleApiActivity"android:exported&#61;"false" />

尝试方案二

既然与gms&#xff0c;查看堆栈&#xff0c;找到对应的库&#xff0c;发现是play-services-measurement-impl中触发的&#xff0c;那就想办法移除这个库。
在这里插入图片描述

在app的gradle中&#xff0c;移除com.google.android.gms相关的库&#xff0c;我发现两个都有触发的可能性&#xff0c;所以都移除了。

configurations {all {
// // 重点是这个exclude group: "com.google.android.gms", module: "play-services-measurement-sdk"exclude group: "com.google.android.gms", module: "play-services-measurement-impl"}}

再次运行后&#xff0c;发现不会再出现由这两个库引起调用getInstallerPackageName方法了。
但在继续debug调试的过程&#xff0c;其他的gms库依然存在违规获取应用列表问题。如下图
在这里插入图片描述
我也play-services-measurement-basement库给移除掉&#xff0c;但移除后发现&#xff0c;app跑不起来。
继续debug调试的过程&#xff0c;又又又发现其他gms库也存在问题&#xff0c;在移除 play-services-measurement-sdk-api或play-services-measurement-api时&#xff0c;会白屏&#xff0c;并且提示错误,FirebaseAnalytics.getInstance初始化失败。实在无力吐槽了。

// 出现错误
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/internal/measurement/zzee;at com.google.firebase.analytics.FirebaseAnalytics.getInstance(com.google.android.gms:play-services-measurement-api&#64;&#64;20.0.0:1)

从这个错误&#xff0c;发现一点问题&#xff0c;好像与FirebaseAnalytics.getInstance的初始化有关&#xff0c;又去搜了一下google。android.gms.internal.measurement这个包有啥用&#xff0c;firebase官方文档还有真有这个类的介绍。
在这里插入图片描述


包含配置 Firebase Analytics 核心服务


顺着FirebaseAnalytics.getInstance去找问题&#xff0c;找到该方法的位置。
在这里插入图片描述
发现FirebaseAnalytics类是在com.google.android.gms:play-services-measurement-api库中引入&#xff0c;那也证实了FirebaseAnalytics与gms某些库有关联。


解决问题

找到FirebaseAnalytics.getInstance调用时机。
在这里插入图片描述
问题发生在FirebaseAnalytics初始化&#xff0c;FirebaseAnalytics.getInstance(context);
经过排查&#xff0c;发现在Flutter的插件FlutterFirebaseAnalyticsPlugin类中&#xff0c;在FlutterFirebaseAnalyticsPlugin被Flutter加载后&#xff0c;就执行了FirebaseAnalytics初始化方法&#xff0c;然后导致gms服务被加载&#xff0c;然后违规获取应用列表的行为。

只要修改firebase_analytics插件&#xff0c;等到用户同意后再执行。
github下载源码 基于v9.1.0分支

public class FlutterFirebaseAnalyticsPluginimplements FlutterFirebasePlugin, MethodCallHandler, FlutterPlugin {private FirebaseAnalytics analytics;private MethodChannel channel;private Context context;private void initInstance(BinaryMessenger messenger, Context context) {// 第1步&#xff1a;注释掉这个位置
// analytics &#61; FirebaseAnalytics.getInstance(context);this.context &#61; context;String channelName &#61; "plugins.flutter.io/firebase_analytics";channel &#61; new MethodChannel(messenger, channelName);channel.setMethodCallHandler(this);FlutterFirebasePluginRegistry.registerPlugin(channelName, this);}/*** 第2步* 20220913自己加入一个方法&#xff0c;初始化*/private void initFirebaseAnalytics(){if(this.context !&#61; null && this.analytics &#61;&#61; null){Log.i("zzb", "初始化initFirebaseAnalytics");analytics &#61; FirebaseAnalytics.getInstance(this.context);}}&#64;Overridepublic void onMethodCall(&#64;NonNull MethodCall call, &#64;NonNull Result result) {Task<?> methodCallTask;switch (call.method) {// 第3步&#xff0c;加入初始化方法&#xff0c;给flutter调用case "Analytics#initFirebaseAnalytics":initFirebaseAnalytics();return;}}private Task<Void> handleSetAnalyticsCollectionEnabled(final Map<String, Object> arguments) {return Tasks.call(cachedThreadPool,() -> {// 第4步&#xff0c;我偷懒&#xff0c;在handleSetAnalyticsCollectionEnabled方法进行初始化initFirebaseAnalytics();final Boolean enabled &#61;(Boolean) Objects.requireNonNull(arguments.get(Constants.ENABLED));if(analytics !&#61; null){Log.i("zzb", "执行analytics handleSetAnalyticsCollectionEnabled");analytics.setAnalyticsCollectionEnabled(enabled);}return null;});}
}

由于Flutter与原生进行通信使用firebase_analytics_platform_interface库&#xff0c;如果还要修改firebase_analytics_platform_interface库&#xff0c;就要维护两个库&#xff0c;firebase_analytics和firebase_analytics_platform_interface&#xff0c;不想修改这个库的内容。

所以偷懒的方式&#xff0c;把初始化方法&#xff0c;放在了现有的方法FlutterFirebaseAnalyticsPlugin.java的handleSetAnalyticsCollectionEnabled()中。
Flutter层需要调用一次FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true)来初始化analytics。


最后

Firebase实在太恶心了&#xff0c;在国内强烈不建议使用&#xff01;&#xff01;&#xff01;firebase生态库相互唤起&#xff0c;出问题了很难定位。


推荐阅读
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 解决发布版APK构建失败的问题 ... [详细]
  • 往期文章Prom ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 在实际开发中,连接池是最常使用的数据库管理技术之一。连接池通过创建和管理一组预初始化的数据库连接,使得这些连接可以被多个线程复用,从而显著提高应用程序的性能和资源利用率。本文将详细介绍如何从零开始构建一个自定义的 MySQL 连接池,并将其与 Spring Data 进行集成,以实现高效、可靠的数据库操作。 ... [详细]
  • 深入解析 Java UTC 时间处理技术与应用 ... [详细]
author-avatar
晨曦--雨荷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有