文章目录

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

系列文章

  • 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="com.google.android.gms.measurement.AppMeasurementReceiver"android:enabled="true"android:exported="false" ></receiver><serviceandroid:name="com.google.android.gms.measurement.AppMeasurementService"android:enabled="true"android:exported="false" /><serviceandroid:name="com.google.android.gms.measurement.AppMeasurementJobService"android:enabled="true"android:exported="false"android:permission="android.permission.BIND_JOB_SERVICE" /><serviceandroid:name="com.google.android.gms.auth.api.signin.RevocationBoundService"android:permission="com.google.android.gms.auth.api.signin.permission.REVOCATION_NOTIFICATION"android:exported="true" /><activityandroid:theme="@ref/0x01030010"android:name="com.google.android.gms.common.api.GoogleApiActivity"android:exported="false" />

尝试方案二

既然与gms,查看堆栈,找到对应的库,发现是play-services-measurement-impl中触发的,那就想办法移除这个库。

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

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

再次运行后,发现不会再出现由这两个库引起调用getInstallerPackageName方法了。
但在继续debug调试的过程,其他的gms库依然存在违规获取应用列表问题。如下图

我也play-services-measurement-basement库给移除掉,但移除后发现,app跑不起来。
继续debug调试的过程,又又又发现其他gms库也存在问题,在移除 play-services-measurement-sdk-api或play-services-measurement-api时,会白屏,并且提示错误,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@@20.0.0:1)

从这个错误,发现一点问题,好像与FirebaseAnalytics.getInstance的初始化有关,又去搜了一下google。android.gms.internal.measurement这个包有啥用,firebase官方文档还有真有这个类的介绍。

包含配置 Firebase Analytics 核心服务

顺着FirebaseAnalytics.getInstance去找问题,找到该方法的位置。

发现FirebaseAnalytics类是在com.google.android.gms:play-services-measurement-api库中引入,那也证实了FirebaseAnalytics与gms某些库有关联。

解决问题

找到FirebaseAnalytics.getInstance调用时机。

问题发生在FirebaseAnalytics初始化,FirebaseAnalytics.getInstance(context);
经过排查,发现在Flutter的插件FlutterFirebaseAnalyticsPlugin类中,在FlutterFirebaseAnalyticsPlugin被Flutter加载后,就执行了FirebaseAnalytics初始化方法,然后导致gms服务被加载,然后违规获取应用列表的行为。

只要修改firebase_analytics插件,等到用户同意后再执行。
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步:注释掉这个位置
//    analytics = FirebaseAnalytics.getInstance(context);this.context = context;String channelName = "plugins.flutter.io/firebase_analytics";channel = new MethodChannel(messenger, channelName);channel.setMethodCallHandler(this);FlutterFirebasePluginRegistry.registerPlugin(channelName, this);}/*** 第2步* 20220913自己加入一个方法,初始化*/private void initFirebaseAnalytics(){if(this.context != null && this.analytics == null){Log.i("zzb", "初始化initFirebaseAnalytics");analytics = FirebaseAnalytics.getInstance(this.context);}}@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {Task<?> methodCallTask;switch (call.method) {// 第3步,加入初始化方法,给flutter调用case "Analytics#initFirebaseAnalytics":initFirebaseAnalytics();return;}}private Task<Void> handleSetAnalyticsCollectionEnabled(final Map<String, Object> arguments) {return Tasks.call(cachedThreadPool,() -> {// 第4步,我偷懒,在handleSetAnalyticsCollectionEnabled方法进行初始化initFirebaseAnalytics();final Boolean enabled =(Boolean) Objects.requireNonNull(arguments.get(Constants.ENABLED));if(analytics != null){Log.i("zzb", "执行analytics handleSetAnalyticsCollectionEnabled");analytics.setAnalyticsCollectionEnabled(enabled);}return null;});}
}

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

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

最后

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

Android-Firebase快速解决合规问题第4篇,解决FirebaseAnalytics库违规获取应用列表问题相关推荐

  1. 亚马逊合规必备,一文解决跨境卖家关于VAT、欧代、商标的所有问题

    2022年亚马逊招商已陆续开始,不少新卖家已经开启了自己的跨境之旅.店铺注册好,合规运营是第一步,尤其是欧洲站的新卖家,商标.欧代.VAT作为合规运营上的第一道"门槛",这些政策是 ...

  2. 魔坊APP项目-17-种植园,商城页面、服务端提供商品api,解决App打包编译以后的跨域限制、客户端获取商品列表并进行展示,集成Alipayplus模块完成支付

    种植园 一.商城页面 orchard.html,代码: <!DOCTYPE html> <html> <head><title>用户中心</tit ...

  3. 解决苹果发布正式环境后支付拉不起来或获取商品列表为空问题

    最近在海外苹果商店发布新游戏,经历了一个操蛋的两天: 产品在提交testflight沙盒环境下是可以获取到苹果商品列表,并且测试支付可以拉起并到账,等到我通过TF转发布到正式环境后,游戏点击游戏内商店 ...

  4. 安全合规--43--基于国内法律法规的企业数据合规体系建设经验总结(一)

    作者:随亦 本篇介绍:个人信息收集 本篇为第1篇/共9篇 下一篇:基于国内法律法规的企业数据合规体系建设经验总结(二) 引子 在离开前公司之后(2020.06),我来到新的公司担任安全部负责人,负责新 ...

  5. 《个人信息保护法》与隐私计算应用场景的合规路径浅析

    从<个人信息保护法>看隐私计算的科技向善应用 --关于隐私计算应用场景的合规路径浅析 2021年8月20日,<个人信息保护法>(以下简称<个保法>)经十三届全国人大 ...

  6. 农行运营合规管理心得体会_农行滨州分行:夯实合规管理支撑体系的几点思考...

    体制.机制是合规管理的"支点".夯实合规管理的支撑体系,优化合规运行机制,解决合规管理用什么标准去做.由谁做.怎么做.做到什么程度等关键问题,这是推进合规管理的基本方法. (一)健 ...

  7. RHEL 8 - 用OpenSCAP工具对容器镜像进行漏洞安全合规扫描,并修复

    <OpenShift 4.x HOL教程汇总> 已在 RHEL 8.4 上验证 本文的前置条件:RHEL8 - 配置基于安装 ISO 文件的 YUM Repo 文章目录 准备环境 扫描容器 ...

  8. iOS提交TestFlight测试显示缺少合规证明

    当我们在使用TestFlight进行应用测试时,上传应用后在选择构建版本时警告"缺少出口合规证明".如下图 解决方式是在Info.plist中增加字段App Uses Non-Ex ...

  9. 商业银行合规管理用OA:“上报、评估、整改、分析”全面数字化

    商业银行"合规管理"是对法律.法规及相关条例等规定的银行合规风险(比如:防洗钱.客户隐私及数据安全以及商业操守等)进行"识别.评估.监控.报告"的过程. 为了响 ...

最新文章

  1. IBM GSA Senior DBA招聘
  2. JSTL 格式化 BigDecimal对象
  3. final关键字_Dart核心语言基础const关键字与final关键字的区别
  4. SAP Sybase Adaptive Server Enterprise:高性能,低风险
  5. 点击按钮创建一个表格 点击按钮创建一个表格 权限选择 元素的value属性操作
  6. MMDetection-运行时
  7. ISA Best Practices Analyzer Tool
  8. php取掉字符串第一位支付,php怎样去掉字符串中的第一个字符
  9. number java_java中Number Math 类方法
  10. SpringSecurity常用登录认证方案
  11. leetcode 208 python3
  12. 一行代码,能导入所有Python库!
  13. 论文笔记_S2D.48_2017-IEEE RAL_单视图和多视图深度融合
  14. linux退出gnome模式,gnome-session怎么关闭比较好?
  15. 移动硬盘插入提示需要格式化RAW_Macbook无法识别移动硬盘?!不仅仅因为硬盘格式问题...
  16. 面向对象编程中的 诡异事件
  17. 2018软科计算机科学工程排行,2018全球计算机与工程学科排名:清华第7,中国9个学科世界第一!...
  18. Kindle Paperwhite 越狱/加字体/支持PDF、EPUB、DjVu、FB2、CHM和DOC文档
  19. 昔日的手游大作,《无尽之剑》系列如今为何走向英雄末路?
  20. keil编译出现错误Undefined symbol __aeabi_assert,解决办法

热门文章

  1. mac快速安装homebrew
  2. Android单目手势识别,手势追踪研究与手势识别应用平台实现
  3. CSS(3)学习笔记——持续更新
  4. U8流程财务段的处理
  5. 博士申请 | 香港科技大学(广州)梁宇轩老师招收全奖博士/硕士/博后/RA/实习生...
  6. Linux基础防火墙、KVM、zabbix具体配置
  7. JAVA计算机毕业设计在线影视点播系统Mybatis+源码+数据库+lw文档+系统+调试部署
  8. XMReport-标签设计打印神器
  9. 酷狗繁星的作品MV怎么下载?
  10. 不同进制之间的转换(完整版)