android使用ContentProvider初始化sdk,初始化时机
文章目录
- 系列目录
- 前言
- 什么是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初始化优缺点
优点
- 低侵入接入,不需要手动添加初始化代码,降低接入成本。
- 降低耦合度,抽离代码方便。
缺点
- 多个SDK使用ContentProvider初始化,无法保证不同SDK初始化循序。
- 最好注意多个ContentProvider初始化的时长,加载完毕才会执行Application#onCreate的调用。
- 注意暴露风险,声明provider的时候,配置exported为false。
android使用ContentProvider初始化sdk,初始化时机相关推荐
- android app初始化sdk,Android SDK使用系列教程——2.SDK初始化和常用类介绍
本帖最后由 碎羽 于 2015-6-18 11:36 编辑 上次讲到SDK的下载和导入,这次来讲讲SDK的初始化和常用类的介绍. 一.初始化SDK 初始化SDK,首先要获得对应设备的AppID.App ...
- Android集成极光聊天SDK
1.前往官网注册应用 2.添加依赖 //极光统计 implementation 'cn.jiguang.sdk:jmessage:2.9.0' implementation 'cn.jiguang.s ...
- 接入第三方SDK初始化失败原因
接入第三方SDK初始化失败原因 最近在接联通计费SDK,出现了一些问题,大家可以看下.(Java大神可以自动略过,只对SDK新人有效) 各种权限以及配置文件全部做好了,但是老是提示SDK初始化失 ...
- 【Android RTMP】x264 编码器初始化及设置 ( 获取 x264 编码参数 | 编码规格 | 码率 | 帧率 | B帧个数 | 关键帧间隔 | 关键帧解码数据 SPS PPS )
文章目录 安卓直播推流专栏博客总结 一. x264 编码器参数设置引入 二. 获取 x264 编码器参数 三. 设置 x264 编码器编码规格 四. 设置 x264 编码器编码图像数据格式 五. 设置 ...
- Android P SELinux (二) 开机初始化与策略文件编译过程
Android P SELinux (一) 基础概念 Android P SELinux (二) 开机初始化与策略文件编译过程 Android P SELinux (三) 权限检查原理与调试 Andr ...
- Android 9.0 SIM卡初始化流程
转载:https://blog.csdn.net/linyongan/article/details/51406123 本文主要讲述Android 9.0 SIM卡初始化流程,这个过程也涉及到UICC ...
- 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/ ...
- BCM 芯片SDK初始化
SDK初始化前,需要对SDK的架构有所了解,具体如下图:可以看出SDK的代码结构是一个层次化分明的架构,这里对各层的作用和详细工作机制不阐述了,具体可以参见SDK的介绍文档. SDK代码的结构图 SD ...
- 环信IM SDK使用(二):环信SDK初始化及注册和登录
上一篇文章,我们介绍了如何集成环信IM SDK:环信IM SDK使用(一):集成环信SDK及注意事项,后面的文章是在这个的基础上一步一步实现的,如果还有不清楚如何集成环信IM SDK的,请翻看上一篇文 ...
最新文章
- 解压和生成 system.imgdata.img ( ext4格式)
- 对网络骚扰和霸凌说不!神经网络可以做得更好
- bootstrap_fileinput上传文件 后台接受额外的参数
- python bottle部署g_python web(bottle框架)之环境搭建
- ajaxbootstrap
- pip /usr/bin/pip: No such file or directory
- Spring– DAO和服务层
- 哥大首位华裔女校长:人工智能的春天来了
- mysql触发器对同一张表做操作_mysql的触发器同数据库 多表的数据操作
- java声明代码是什么_java安全编码指南之:声明和初始化说明
- mysql三高讲解(三)3.2:如何确定用哪条索引
- Sql Server 内存相关计数器以及内存压力诊断
- 盘点 | 2017 年关于 Python 的 12 件大事
- 路由器php系统时间设置时间设置时间设置时间设置时间设置,win7电脑提示系统时间设置有误请更新系统日期...
- ThreadX视频教程第2期:通俗易懂的介绍Cortex-M内核的OS特性,双堆栈,非特权级,PendSV,SVC,Systick等,争取人人都可以掌握
- Flex Builder中网络监视器导致“访问URL时遇到安全性错误”
- eggs和egg是什么意思_eggs是什么意思_eggs的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 每日一佳——Structure Preserving Embedding(Blake Shaw et al. ,ICML,2009)
- Go生成Excel文件并下载及问题
- 目标检测YOLOv3