Android getDeviceId流程分析

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里获取的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值