Как модемный код общается с кодом Android

Я хотел бы знать идею высокого уровня о том, как код модема Android будет вызывать / передавать сообщение на уровень приложений Android. Скажем, мы возьмем СМС, например. Если сеть отправляет SMS и модем (скажем, код Qualcomm C анализирует его), как он передается на уровень приложений Android?

Всегда ли происходит вызов JNI? как интерфейс между модемом и Android? Можете ли вы поделиться информацией с нами. Спасибо

2 ответа

Решение

Почти во всех исходных базах Android, как указано в источнике AOSP/CAF/CM (Android Open Source Project, CodeAurora Forum, Cyanogenmod соответственно), будет иметь C-код, называемый rild (Radio Interface Layer Daemon). Это обычно встречается в /hardware/ril исходного дерева.

Этот демон запускается с момента загрузки Android и создает сокет с именем /dev/socket/rild а также /dev/socket/rild-debug, Там будет проприетарная библиотека от Qualcomm, HTC, которая динамически загружается во время выполнения при загрузке. Это та проприетарная библиотека, которая, в свою очередь, связывается с прошивкой радио. И тут же устанавливаются зацепки rild для обратных вызовов в проприетарную библиотеку.

На уровне rild через вышеупомянутый сокет, как слой Android (находится в исходном дереве, frameworks/base/telephony/com/android/internal/telephony/RIL.java) общается.

На стороне Java он открывает сокет для чтения / записи, а также устанавливает намерения и настраивает делегатов для трансляции / приема событий через этот сокет.

Например, входящий вызов, проприетарная библиотека, вызывает ловушку обратного вызова в соответствии с настройкой rild. Rild записывает стандартные общие команды модема AT Hayes в сокет, на стороне Java, он читает и интерпретирует команды модема, и оттуда PhoneManager передает CALL_STATE_RINGING, в котором телефон приложения (найден в источнике packages/apps/Phone) зарегистрировал получателя и запускает интерфейс пользователя, и именно так вы можете ответить на звонок.

Другой пример, когда вы совершаете исходящий звонок, вы набираете номер на Android, создается намерение, и это, в свою очередь, PhoneManager (Это корень всего этого, здесь, не могу вспомнить верхнюю часть моей головы, думаю, что это в frameworks/base/core/java где-то в дереве исходного кода) получает намерение, преобразует его в последовательность команд модема AT Hayes, записывает его в сокет, затем rild вызывает обратный вызов в проприетарную библиотеку, проприетарная библиотека, в свою очередь, делегирует прошивку радио,

Последний пример, отправка текстовых сообщений из Сообщения (находится в packages/apps/Mms приложение, текст, который вы вводите, попадает в намерение, PhoneManager получает намерение, преобразует текст в кодировку GSM с использованием 7-битных букв GSM (IIRC), записывается в сокет, в свою очередь, в поле вызывает обратный вызов в проприетарную библиотеку, проприетарная библиотека, в свою очередь, делегирует прошивку радиоприемника, и текст теперь покинул домен телефона и находится где-то в эфире...:) Наряду с отправкой широковещательного сообщения внутри самого Android, при условии, что READ_PHONE_STATE разрешение используется и указывается в AndroidManifest.xml.

И наоборот, при получении текстового сообщения, оно наоборот, прошивка радиосвязи получает несколько байтов, проприетарная библиотека вызывает обратный вызов в Rild и таким образом записывает байты в сокет. На стороне Java он читает из нее и декодирует последовательность байтов, преобразует ее в текст, как мы знаем, запускает трансляцию с уведомлением о получении сообщения. Приложение Messaging, в свою очередь, зарегистрировало получателей для указанного широковещания и отправляет на панель уведомлений намерение сказать что-то вроде " Новое сообщение получено от + xxxxxx ".

Намерения найдены в frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java

В этом суть того, как работает телефонная система, настоящая прелесть в том, что она использует общие команды модема AT Hayes, тем самым упрощая и скрывая реальные проприетарные механизмы.

Что касается подобных Qualcomm, HTC, забудьте об этом, думая, что они когда-либо будут открывать исходный код для рассматриваемой библиотеки, потому что уровень радиотелефонии встроен в схему SoC (система на чипе)!

Что также является дополнительным замечанием, почему рискованно перепрограммировать прошивку радио, некоторые телефоны предоставляют возможность сделать это, прошить неправильную прошивку (например, несовместимую или не подходящую для телефона), поцеловать трубку на прощание и использовать это как дверная пробка или пресс-папье!:)

Следует отметить, что задействованы нулевые механизмы JNI.

Это из моего понимания того, как это работает, из того, что я могу сказать, это то, что прошивка радио загружается в адрес памяти где-то, где ядро ​​Linux зарезервировало адресное пространство и не трогает его, что-то вроде назад на старом ПК В дни, когда загружалась DOS, в BIOS были зарезервированные адреса, я думаю, что это похоже на то, что адреса, помеченные как зарезервированные, заняты микропрограммой, в которой проприетарная радиобиблиотека разговаривает с ним - и поскольку библиотека работает в адресное пространство, принадлежащее ядру, которое принадлежит root с привилегиями root, оно может "разговаривать" с ним, если вы подумаете об использовании старого базового диалекта peek и poke, я думаю, вы не будете далеко от Отметьте там, записывая определенную последовательность байтов по этому адресу, встроенное программное обеспечение радио действует на него, почти как наличие таблицы векторов прерываний... здесь я предполагаю, как это работает точно.:)

Продолжая объяснение t0mm13b, Когда мы говорим о смартфоне, подумайте о трехслойных операциях по отношению к SMS/ звонкам.

RIL (уровень пользователя) <-> AP <-> CP

AP: Процессор приложений (где работает ваша ОС Android. Подумайте об играх, песнях, видео, камере и т. Д., Работающих на этом процессоре)

CP: сотовый процессор (который на самом деле имеет дело с Air-интерфейсом для входящих / исходящих звонков / смс, взаимодействует с Network Tower и т. Д.)

Теперь допустим, что некоторые данные получены на стороне CP (это может быть интернет-данные / смс / вызов). Теперь есть определенные логические каналы между AP и CP. Таким образом, CP отправляет полученные данные в соответствующий канал в зависимости от типа данных. Эти данные будут получены AP. AP отправит эти данные обратно в RIL/App. RIL будет декодировать эти данные (особенно данные вызова / смс). На основании этого выдает уведомление пользователю о SMS/ звонке.

Другие вопросы по тегам