主項目上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方法在里面初始化就完事啦~