主项目上R8之后发现由于mapping过于巨大,原本的bugly已经无法上传mapping文件了,于是迁移到了firebase。
结果发现firebase的很多额外插件不需要初始化就可以直接启动,只要 implementation 引用一下就能运行了。还有这种好事?那以后写第三方工具库的时候不是可以完全不用一遍遍的教别人怎么初始化了嘛。好奇之下跟了一下firebase的源码,在aar的AndroidManifest文件里发现一个奇怪的provider。
<provider
android:name="com.google.firebase.perf.provider.FirebasePerfProvider"
android:authorities="${applicationId}.firebaseperfprovider"
android:exported="false"
android:initOrder="101" />
跟了下源码如下:
public class FirebaseInitProvider extends ContentProvider {
public void attachInfo(Context context, ProviderInfo providerInfo) {
b.a((Object) providerInfo, (Object) "FirebaseInitProvider ProviderInfo cannot be null.");
if ("com.google.firebase.firebaseinitprovider".equals(providerInfo.authority)) {
throw new IllegalStateException("Incorrect provider authority in manifest. Most likely due to a missing applicationId variable in application's build.gradle.");
}
super.attachInfo(context, providerInfo);
}
public int delete(Uri uri, String str, String[] strArr) {
return 0;
}
public String getType(Uri uri) {
return null;
}
public Uri insert(Uri uri, ContentValues contentValues) {
return null;
}
public boolean onCreate() {
String str = "FirebaseInitProvider";
//很明显这里就是初始化代码
if (FirebaseApp.a(getContext()) == null) {
Log.i(str, "FirebaseApp initialization unsuccessful");
} else {
Log.i(str, "FirebaseApp initialization successful");
}
return false;
}
public Cursor query(Uri uri, String[] strArr, String str, String[] strArr2, String str2) {
return null;
}
public int update(Uri uri, ContentValues contentValues, String str, String[] strArr) {
return 0;
}
}
打断点跟进了一下,果然app一启动就调用了,并且可以完美的获取app context。以后需要context初始化的代码简单了,只要自己在aar里注册一个contentprovider,再覆写onCreate方法在里面初始化就完事啦~