carrier_config相关研究
概述: 在PhoneGlobals创建时,会同时创建carrier_config 服务,实现carrier_config 的类是CarrierConfigLoader。CarrierConfigLoader的主要目的是,绑定特定运营商的App,从而获取特定运营的配置信息。
1. 相关类和aidl
frameworks/base/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
packages/services/Telephony/src/com/android/phone/CarrierConfigLoader.java
frameworks/base/telephony/java/android/telephony/CarrierConfigManager.java
2. 初始化
private CarrierConfigLoader(Context context) {
mContext = context;
// 监听开机
IntentFilter bootFilter = new IntentFilter();
bootFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
context.registerReceiver(mBootReceiver, bootFilter);
// Register for package updates. Update app or uninstall app update will have all 3 intents,
// in the order or removed, added, replaced, all with extra_replace set to true.
// 监听安装或者卸载
IntentFilter pkgFilter = new IntentFilter();
pkgFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
pkgFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
pkgFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
pkgFilter.addDataScheme("package");
context.registerReceiverAsUser(mPackageReceiver, UserHandle.ALL, pkgFilter, null, null);
int numPhones = TelephonyManager.from(context).getPhoneCount();
// 运营商默认配置
mConfigFromDefaultApp = new PersistableBundle[numPhones];
// 运营商App设置
mConfigFromCarrierApp = new PersistableBundle[numPhones];
mServiceConnection = new CarrierServiceConnection[numPhones];
// Make this service available through ServiceManager.
// 让外部可以通过ServiceManager访问carrier_config
ServiceManager.addService(Context.CARRIER_CONFIG_SERVICE, this);
log("CarrierConfigLoader has started");
mHandler.sendEmptyMessage(EVENT_CHECK_SYSTEM_UPDATE);
}
在构造函数初始化完成后,发送了EVENT_CHECK_SYSTEM_UPDATE事件,Handler对于该事件的处理如下:
case EVENT_CHECK_SYSTEM_UPDATE:
SharedPreferences sharedPrefs =
PreferenceManager.getDefaultSharedPreferences(mContext);
final String lastFingerprint = sharedPrefs.getString(KEY_FINGERPRINT, null);
// 如果系统的构建信息发生了变化,即系统更新了,那么就需要清除缓存。
if (!Build.FINGERPRINT.equals(lastFingerprint)) {
log("Build fingerprint chan