文章目录

  • 系列目录
  • 前言
  • 什么是ContentProvider
  • sdk初始化
    • 常规初始化方案
    • 使用ContentProvider初始化sdk
  • 为什么ContentProvider可以作为sdk初始化
  • 使用ContentProvider初始化优缺点
    • 优点
    • 缺点

系列目录

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

前言

最近因为国内上架应用,检测出firebase有违规收集android id行为,明明在代码中延迟初始化了,但firebase依然有操作数据的行为,跟踪发现firebase采用了ContentProvider来初始化sdk,怪不得通过代码延时初始化并没有效果,简单整理一下ContentProvider的初始化原理。

什么是ContentProvider

作为android四大组件之一,主要作用是封装底层具体实现,对内或对外提供数据。底层数据源可以是数据库、文件,或者网络,只需要ContentProvider提供的操作就能快速实现增、删、改、查。

sdk初始化

常规初始化方案

通常是在Application的attachBaseContext或onCreate执行初始化操作。Application 的 attachBaseContext 在 onCreate 之前执行。具体差别就不探究了。
例1:multidex
在attachBaseContext中初始化

public class MyApplication extends SomeOtherApplication {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);MultiDex.install(this);}
}

例2:网易云即时通信
在onCreate中初始化

public class IMApplication extends MultiDexApplication {@Overridepublic void onCreate() {super.onCreate();XKitImClient.init(this);}
}

使用ContentProvider初始化sdk

这两种都是常见的初始化sdk的位置,然而有一些sdk,能不加入代码,低侵入的方式集成,解耦等特点。在AndroidManifest文件中声明ContentProvider,代替Application的onCreate()中添加init()方法,例如leakcanary2的初始化、firebase初始化、Jetpack startup初始化等。

<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.squareup.leakcanary.leaksentry"><application><providerandroid:name="leakcanary.internal.LeakSentryInstaller"android:authorities="${applicationId}.leak-sentry-installer"android:exported="false"/></application>
</manifest>
<application><providerandroid:authorities="${applicationId}.firebaseperfprovider"android:exported="false"android:initOrder="101"android:name="com.google.firebase.perf.provider.FirebasePerfProvider"/>
</application>

为什么ContentProvider可以作为sdk初始化

SDK初始化,是把App的上下文(Context)注入到SDK中,让SDK具备访问app资源的能力。在Application被创建时会有可用的Context,并且时机比Activity中的Context创建的早,所以大部分SDK初始化都会放在Application中获取Context。

从输出的日志看,CustomApplication#attachBaseContext() → MyContentProvider#attachInfo() → MyContentProvider#onCreate() → CustomApplication#onCreate()

I/zzb: CustomApplication attachBaseContext
I/zzb: MyContentProvider attachInfo
I/zzb: MyContentProvider onCreate
I/zzb: CustomApplication onCreate

前面说过Application#attachBaseContext()和Application#onCreate()具备了获取Context初始化能力,ContentProvider的onCreate刚好处于Application#attachBaseContext()和Application#onCreate()中间,并且也能获取Context,也具备了初始化SDK的能力。

使用ContentProvider初始化优缺点

优点

  1. 低侵入接入,不需要手动添加初始化代码,降低接入成本。
  2. 降低耦合度,抽离代码方便。

缺点

  1. 多个SDK使用ContentProvider初始化,无法保证不同SDK初始化循序。
  2. 最好注意多个ContentProvider初始化的时长,加载完毕才会执行Application#onCreate的调用。
  3. 注意暴露风险,声明provider的时候,配置exported为false。

android使用ContentProvider初始化sdk,初始化时机相关推荐

  1. android app初始化sdk,Android SDK使用系列教程——2.SDK初始化和常用类介绍

    本帖最后由 碎羽 于 2015-6-18 11:36 编辑 上次讲到SDK的下载和导入,这次来讲讲SDK的初始化和常用类的介绍. 一.初始化SDK 初始化SDK,首先要获得对应设备的AppID.App ...

  2. Android集成极光聊天SDK

    1.前往官网注册应用 2.添加依赖 //极光统计 implementation 'cn.jiguang.sdk:jmessage:2.9.0' implementation 'cn.jiguang.s ...

  3. 接入第三方SDK初始化失败原因

     接入第三方SDK初始化失败原因 最近在接联通计费SDK,出现了一些问题,大家可以看下.(Java大神可以自动略过,只对SDK新人有效) 各种权限以及配置文件全部做好了,但是老是提示SDK初始化失 ...

  4. 【Android RTMP】x264 编码器初始化及设置 ( 获取 x264 编码参数 | 编码规格 | 码率 | 帧率 | B帧个数 | 关键帧间隔 | 关键帧解码数据 SPS PPS )

    文章目录 安卓直播推流专栏博客总结 一. x264 编码器参数设置引入 二. 获取 x264 编码器参数 三. 设置 x264 编码器编码规格 四. 设置 x264 编码器编码图像数据格式 五. 设置 ...

  5. Android P SELinux (二) 开机初始化与策略文件编译过程

    Android P SELinux (一) 基础概念 Android P SELinux (二) 开机初始化与策略文件编译过程 Android P SELinux (三) 权限检查原理与调试 Andr ...

  6. Android 9.0 SIM卡初始化流程

    转载:https://blog.csdn.net/linyongan/article/details/51406123 本文主要讲述Android 9.0 SIM卡初始化流程,这个过程也涉及到UICC ...

  7. Flutter 集成umeng_common_sdk 1.2.4打包出现‘SDK初始化失败,请检查是否集成umeng-asms-1.2x.aar库’

    Flutter 集成umeng_common_sdk 1.2.4打包出现'SDK初始化失败,请检查是否集成umeng-asms-1.2x.aar库' 转载 https://blog.csdn.net/ ...

  8. BCM 芯片SDK初始化

    SDK初始化前,需要对SDK的架构有所了解,具体如下图:可以看出SDK的代码结构是一个层次化分明的架构,这里对各层的作用和详细工作机制不阐述了,具体可以参见SDK的介绍文档. SDK代码的结构图 SD ...

  9. 环信IM SDK使用(二):环信SDK初始化及注册和登录

    上一篇文章,我们介绍了如何集成环信IM SDK:环信IM SDK使用(一):集成环信SDK及注意事项,后面的文章是在这个的基础上一步一步实现的,如果还有不清楚如何集成环信IM SDK的,请翻看上一篇文 ...

最新文章

  1. 解压和生成 system.imgdata.img ( ext4格式)
  2. 对网络骚扰和霸凌说不!神经网络可以做得更好
  3. bootstrap_fileinput上传文件 后台接受额外的参数
  4. python bottle部署g_python web(bottle框架)之环境搭建
  5. ajaxbootstrap
  6. pip /usr/bin/pip: No such file or directory
  7. Spring– DAO和服务层
  8. 哥大首位华裔女校长:人工智能的春天来了
  9. mysql触发器对同一张表做操作_mysql的触发器同数据库 多表的数据操作
  10. java声明代码是什么_java安全编码指南之:声明和初始化说明
  11. mysql三高讲解(三)3.2:如何确定用哪条索引
  12. Sql Server 内存相关计数器以及内存压力诊断
  13. 盘点 | 2017 年关于 Python 的 12 件大事
  14. 路由器php系统时间设置时间设置时间设置时间设置时间设置,win7电脑提示系统时间设置有误请更新系统日期...
  15. ThreadX视频教程第2期:通俗易懂的介绍Cortex-M内核的OS特性,双堆栈,非特权级,PendSV,SVC,Systick等,争取人人都可以掌握
  16. Flex Builder中网络监视器导致“访问URL时遇到安全性错误”
  17. eggs和egg是什么意思_eggs是什么意思_eggs的翻译_音标_读音_用法_例句_爱词霸在线词典...
  18. 每日一佳——Structure Preserving Embedding(Blake Shaw et al. ,ICML,2009)
  19. Go生成Excel文件并下载及问题
  20. 目标检测YOLOv3

热门文章

  1. 计算机网络系统互联,关于计算机网络系统的开放性结构与网络互联
  2. 艺赛旗RPA验证码处理系列(一):解决滑动加文字识别验证码
  3. 中华五千年的朝代顺序
  4. 华严数字体系--说说不可说
  5. python服务端设置心跳处理_Heartrate:看见 Python 程序运行的“心跳”
  6. JAVA程序设计基础05循环结构
  7. 2013互联网公司找工作--大牛总结(ZJU)
  8. 微信公众号和微信群怎么推广?
  9. 修炼内功——理解函数栈帧创建和销毁
  10. 最大化最小值和最小化最大值