android telephony 原理解析与开发指南_Android逆向pdf

android telephony 原理解析与开发指南_Android逆向pdf目录:Phone的继承关系与PhoneFactory(GsmCdmaPhone、ImsPhone、SipPhone)Phone进程的启动Phone对象的初始化(DefaultPhoneNotif

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目录:

  Phone的继承关系与PhoneFactory(GsmCdmaPhone、ImsPhone、SipPhone)

  Phone进程的启动

  Phone对象的初始化(DefaultPhoneNotifier和RIL对象,将作为创建GsmCdmaPhone参数

  为Phone实例注册监听事件(CM,注册与注销)

  Phone有什么作用(监听、上报消息、modem交互)

1、在Android N中,Phone的继承关系:

android telephony 原理解析与开发指南_Android逆向pdf

android telephony 原理解析与开发指南_Android逆向pdf

Android中有三种PhoneFactory:
PhoneFactory.java ——–>用于创建GsmCdmaPhone对象;
ImsPhoneFactory.java ——–>用于创建ImsPhone对象;
SipPhoneFactory.java ——–>用于创建SipPhone对象。
其中,GsmCdmaPhone对象是在Phone进程启动之后创建的(步骤1~6);之后,等到ImsService启动之后,就会创建ImsPhone(步骤7~11)。

 2.1 Phone进程的启动

在Android中进程名一般对应的是该APP的包名,所以我们可以在源码中找package=”com.android.phone”。
接着你就会在/packages/services/Telephony/AndroidManifest.xml文件中看到:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:androidprv
="http://schemas.android.com/apk/prv/res/android"
package
="com.android.phone"
coreApp
="true"
android:sharedUserId
="android.uid.phone"
android:sharedUserLabel
="@string/phoneAppLabel" >

 

<application android:name="PhoneApp" 
//在系统启动之时,ActivityManagerService的systemReady() 会加载所有persistent为true的应用
android:persistent
="true"
android:label
="@string/phoneAppLabel"
android:icon
="@mipmap/ic_launcher_phone"
android:allowBackup
="false"
android:supportsRtl
="true"
android:usesCleartextTraffic
="true">

2.2 Phone对象的初始化

在PhoneFactory.java的makeDefaultPhone方法中(时序图中的步骤3)

 

    public static void makeDefaultPhone(Context context) {
        ......
        //创建DefaultPhoneNotifier对象 sPhoneNotifier = new DefaultPhoneNotifier();

       //根据待机模式计算出要创建Phone对象的数量
        int numPhones = TelephonyManager.getDefault().getPhoneCount();
        //创建networkMode、PhoneProxy、RIL的数组,用于存储对应的对象
        int[] networkModes = new int[numPhones];
        //Android 6.0
        //sProxyPhones = new PhoneProxy[numPhones];
      //Android N中没有了PhoneProxy,所以通过getDefaultPhone()得到的就是Phone实例
     sPhones = new Phone[numPhones]; sCommandsInterfaces = new RIL[numPhones];  for (int i = 0; i < numPhones; i++) {
            // reads the system properties and makes commandsinterface // Get preferred network type.
           networkModes[i] = RILConstants.PREFERRED_NETWORK_MODE;
            Rlog.i(LOG_TAG, "Network Mode set to " + Integer.toString(networkModes[i]));
            //创建RIL,此时的i对应的是PhoneID。
          sCommandsInterfaces[i] = new RIL(context, networkModes[i], cdmaSubscription, i);
        }
        ......
        for (int i = 0; i < numPhones; i++) {
              Phone phone = null;
              //根据不用的类型,创建不同的Phone对象
              int phoneType = TelephonyManager.getPhoneType(networkModes[i]);
              if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
                  phone = new GsmCdmaPhone(context,
                          sCommandsInterfaces[i], sPhoneNotifier, i,
                          PhoneConstants.PHONE_TYPE_GSM,
                     //Android N中新增TelephonyComponentFactory类,主要用来 //初始化CallTracker、ServiceStateTracker、DcTracker等对象
                          TelephonyComponentFactory.getInstance());
             } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
                 phone = new GsmCdmaPhone(context,
                          sCommandsInterfaces[i], sPhoneNotifier, i,
                          PhoneConstants.PHONE_TYPE_CDMA_LTE,
                          TelephonyComponentFactory.getInstance());
             }
             Rlog.i(LOG_TAG, "Creating Phone with type = " + phoneType + " sub = " + i);

            sPhones[i] = phone;
        } 
        .....
        // Start monitoring after defaults have been made. // Default phone must be ready before ImsPhone is created // because ImsService might need it when it is being opened.
        for (int i = 0; i < numPhones; i++) {
         //开始监听ImsService,如果ImsService已启动,进而执行创建ImsPhone对象
            sPhones[i].startMonitoringImsService();
        }
    }

2.3 为Phone实例注册监听事件

PhoneGlobals.java的onCreate()方法中

 

    public void onCreate() {
        if (mCM == null) {
            // Initialize the telephony framework //先创建Phone实例
            PhoneFactory.makeDefaultPhones(this);
            mCM = CallManager.getInstance();
            for (Phone phone : PhoneFactory.getPhones()) {
              //把新创建的Phone实例传递进来
                mCM.registerPhone(phone);
            }
        }
    }

由CallManager来管理这些Phone实例并且为它们注册监听事件。

 

 // list of registered phones, which are PhoneBase objs
    private final ArrayList<Phone> mPhones;

    public boolean registerPhone(Phone phone) {
        Phone basePhone = getPhoneBase(phone);

        if (basePhone != null && !mPhones.contains(basePhone)) {

            if (DBG) {
                Rlog.d(LOG_TAG, "registerPhone(" +
                        phone.getPhoneName() + " " + phone + ")");
            }
            if (mPhones.isEmpty()) {
                mDefaultPhone = basePhone;
            }
            //管理Phone实例
            mPhones.add(basePhone);
            mRingingCalls.add(basePhone.getRingingCall());
            mBackgroundCalls.add(basePhone.getBackgroundCall());
            mForegroundCalls.add(basePhone.getForegroundCall());
         //为Phone实例注册监听事件
            registerForPhoneStates(basePhone);
            return true;
        }
        return false;
    }
    private void registerForPhoneStates(Phone phone) {
        ......
        phone.registerForDisconnect(handler, EVENT_DISCONNECT,mRegistrantidentifier);
        phone.registerForIncomingRing(handler, EVENT_INCOMING_RING,mRegistrantidentifier);
        ......
    }

 

3. Phone有什么作用

回忆第2小节创建GsmCdmaPhone对象时

      sPhoneNotifier = new DefaultPhoneNotifier();
      sCommandsInterfaces[i] = new RIL(context, networkModes[i],
                            cdmaSubscription, i);

      phone = new GsmCdmaPhone(context,
              sCommandsInterfaces[i], sPhoneNotifier, i,
              PhoneConstants.PHONE_TYPE_GSM,
              TelephonyComponentFactory.getInstance());

初始化了DefaultPhoneNotifier和RIL对象,将它们作为参数,再创建GsmCdmaPhone。
所以在GsmCdmaPhone中可以直接操纵这两个对象的方法。
DefaultPhoneNotifier实现了PhoneNotifier接口,PhoneNotifier接口中定义了很多notifyXXX的接口,所以DefaultPhoneNotifier主要的作用就是上报消息

 

public interface PhoneNotifier {

    public void notifyPhoneState(Phone sender);
    public void notifyServiceState(Phone sender);
    ...
}

而RIL对象主要作用是跟modem交互。
因此,Phone实例就间接地拥有了跟modem交互的能力和上报消息的能力,再加上Phone实例自身就有监听事件的能力,所以Phone的作用就是:
1.注册监听事件,及时上报消息(Call状态变化、Service状态变化、新来电等等)
2.间接地为其他类提供跟modem交互的服务。

————————————————
版权声明:本文为CSDN博主「linyongan」的原创文章,遵循undefined版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linyongan/article/details/51994817

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168026.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java代码生成器,springboot代码生成器—增加更新,查询功能(持续更新)

    java代码生成器,springboot代码生成器—增加更新,查询功能(持续更新)时隔一周多,今天终于抽出时间来更新一波代码生成器,最近公司让我研究rpa,弄得焦头烂额的,话不多说,进入正题。之前有朋友让我讲一下代码生成器的原理,这篇博客就大体描述一下,以后慢慢细致讲解。双击codeMan.exe,众所周知,java做成exe程序很麻烦,在这里我是利用了.net的ikvm插件把jar包直接编译成了exe程序,这个启动界面会连接我的服务器,去检查版本更新,如果有更新就会在…

    2022年6月5日
    34
  • 动态迁移_动作迁移

    动态迁移_动作迁移概念在虚拟化环境中的迁移,又分为动态迁移,静态迁移,也有人称之为冷迁移和热迁移,或者离线迁移在线迁移;静态迁移和动态迁移的区别就是静态迁移明显有一段时间客户机的服务不可用,而动态迁移则没有明显的服务暂停时间,静态迁移有两种1,是关闭客户机将其硬板镜像复制到另一台宿主机系统,然后回复启动起来,这种迁移不保留工作负载,2是,两台客户机公用一个存储系统,关闭一台客户机,防止其内存到另一台宿主机,这样做的

    2025年7月26日
    4
  • DatagramPacket与DatagramSocket 详解

    DatagramPacket与DatagramSocket 详解1.基本概念:  a.DatagramPacket与DatagramSocket位于java.net包中  b.DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送数据报的套接字  c.由这两个类所有构成的网络链接是基于UDP协议,是一种不可靠的协议。  之所以不可靠是因为发送方不负责数据是否发送成功,接收方收到数据时也不会

    2022年5月2日
    82
  • leetcode 两数相加(两个数相加分别叫什么)

    publicclasstest{ publicstaticvoidmain(String[]args){ System.out.println("HelloWorld!"); ListNodea=newListNode(0); ListNodeb=newListNode(0); a.val=2; a.next=newListNode(4); a….

    2022年4月10日
    42
  • plugins webpack_webpack实现原理

    plugins webpack_webpack实现原理plugin插件是webpack的支柱功能。webpack自身也是构建于你在webpack配置中用到的相同的插件系统之上!插件目的在于解决loader无法实现的其他事。常用的插件

    2022年7月29日
    6
  • 矩阵乘以其矩阵转置

    矩阵乘以其矩阵转置在推导公式和计算中,常常能碰到矩阵乘以其矩阵转置,在此做个总结。1.假设矩阵A是一个m∗nm∗nm*n矩阵,那么A∗ATA∗ATA*A^T得到一个m∗mm∗mm*m矩阵,AT∗AAT∗AA^T*A得到一个n∗nn∗nn*n的矩阵,这样我们就能得到一个方矩阵。看一个例子:Xθ=HXθ=HX\theta=H求解θθ\theta.XTXθ=XTHXTXθ=XT…

    2022年6月30日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号