1.首先来看getDeviceId
frameworks/base/telephony/java/android/telephony/TelephonyManager.java
public String getDeviceId() {
...
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
return telephony.getDeviceId(mContext.getOpPackageName());
...
}
private ITelephony getITelephony() {
return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
}
2.TELEPHONY_SERVICE的注册
public static final String TELEPHONY_SERVICE = "phone";
1.frameworks路径查找下find . -name ITelephony*
base/telephony/java/com/android/internal/telephony/ITelephony.aidl
2.继续grep -rn “extends ITelephony.Stub”
3.没找到,去packages/services下继续
Telephony/src/com/android/phone/PhoneInterfaceManager.java
private PhoneInterfaceManager(PhoneGlobals app, Phone phone) {
...
publish();
}
private void publish() {
if (DBG) log("publish: " + this);
ServiceManager.addService("phone", this);
}
原来是在PhoneInterfaceManager注册的
3.getDeviceId实现
packages/services/Telephony/src/com/android/phone/PhoneInterfaceManager.java
public String getDeviceId(String callingPackage) {
return getDeviceIdWithFeature(callingPackage, null);
}
public String getDeviceIdWithFeature(String callingPackage, String callingFeatureId) {
...
return phone.getDeviceId();
...
}
frameworks/opt/telephony/src/java/com/android/internal/telephony/Phone.java
我们可以看到Phone是一个abstract类
在frameworks下grep -rn "extends Phone "
有三个实现类:
frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaPhone.java
frameworks/opt/telephony/src/java/com/android/internal/telephony/sip/SipPhoneBase.java
frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhoneBase.java
看下frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaPhone.java的getDeviceId
@Override
public String getDeviceId() {
if (isPhoneTypeGsm()) {
return getImei();
} else {
CarrierConfigManager configManager = (CarrierConfigManager)
mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
boolean force_imei = configManager.getConfigForSubId(getSubId())
.getBoolean(CarrierConfigManager.KEY_FORCE_IMEI_BOOL);
if (force_imei) return getImei();
String id = getMeid();
if ((id == null) || id.matches("^0*$")) {
loge("getDeviceId(): MEID is not initialized use ESN");
id = getEsn();
}
return id;
}
}
可以看出这些信息是在EVENT_RADIO_AVAILABLE里获取的