2012-06-19 27 views
34

Tôi muốn biết ý tưởng cấp cao về cách mã Android Modem sẽ gọi/chuyển thông báo tới lớp ứng dụng Android. Ví dụ: chúng tôi lấy SMS. Nếu mạng gửi SMS và Modem (nói mã Qualcomm C phân tích cú pháp nó) thì nó được truyền tới lớp Ứng dụng Android như thế nào?Mã Modem nói chuyện với mã Android như thế nào

Luôn có cuộc gọi JNI xảy ra? như giao diện giữa modem và Android? Bạn có thể vui lòng chia sẻ thông tin với chúng tôi không. Cảm ơn

Trả lời

68

Trong hầu hết các cơ sở nguồn android như được tìm thấy trong nguồn AOSP/CAF/CM (Dự án Android Open Source, CodeAurora diễn đàn, CyanogenMod tương ứng), sẽ có mã C được gọi là rild, (Radio Interface lớp Daemon) . Điều này thường được tìm thấy trong số /hardware/ril của cây nguồn.

Daemon này chạy từ thời điểm Android khởi động và tạo ổ cắm gọi là /dev/socket/rild/dev/socket/rild-debug. Sẽ có một thư viện độc quyền đến từ Qualcomm, HTC, được tải động vào thời gian chạy khi khởi động. Đó là thư viện độc quyền mà lần lượt, giao tiếp với phần mềm radio. Và các móc nối của rild cho các cuộc gọi lại vào thư viện độc quyền được thiết lập ở đó và sau đó.

Ở lớp rild, qua ổ cắm nói trên, là cách lớp Android (được tìm thấy trong cây nguồn, frameworks/base/telephony/com/android/internal/telephony/RIL.java) giao tiếp.

Ở phía Java, nó mở ổ cắm để đọc/ghi, cùng với việc thiết lập ý định và thiết lập đại biểu cho các sự kiện phát/nhận thông qua ổ cắm này.

Ví dụ: cuộc gọi đến, thư viện độc quyền, gọi móc gọi lại như được thiết lập bởi rild. Các rild viết tiêu chuẩn chung AT lệnh modem Hayes vào ổ cắm, ở phía bên Java, nó đọc và giải thích các lệnh modem, và từ đó, các PhoneManager chương trình phát sóng CALL_STATE_RINGING, trong đó Điện thoại ứng dụng (tìm thấy trong nguồn packages/apps/Phone) đã đăng ký người nhận và khởi động giao diện Người dùng và đó là cách bạn nhận được để trả lời cuộc gọi.

Một ví dụ khác, làm cho một cuộc gọi đi, bạn quay số trên Android, mục đích được tạo ra và do đó các PhoneManager (này là gốc rễ của tất cả, ở đây, không thể nhớ đầu đầu của tôi, nghĩ rằng nó ở một nơi nào đó trong cây nguồn) nhận được ý định, chuyển đổi nó thành một chuỗi các lệnh modem của AT Hayes, ghi nó vào ổ cắm, rild sau đó gọi một cuộc gọi lại đến thư viện độc quyền, độc quyền thư viện lần lượt đại biểu cho phần mềm radio.

dụ cuối cùng, gửi tin nhắn văn bản, từ Tin nhắn (tìm thấy trong cây packages/apps/Mms nguồn) ứng dụng, văn bản mà bạn gõ, bị đẩy vào một ý định, các PhoneManager nhận được ý định, chuyển đổi văn bản sang GSM- được mã hóa bằng cách sử dụng các chữ cái GSM 7 bit (IIRC), được ghi vào socket, lần lượt rild gọi lại thư viện sở hữu độc quyền, thư viện độc quyền lần lượt giao cho phần mềm radio và văn bản hiện đã rời tên miền của chiếc điện thoại và đang ở trong không khí ở đâu đó ...:) Cùng với việc gửi tin nhắn quảng bá trong chính Android, miễn là quyền sử dụng READ_PHONE_STATE được chỉ định và được chỉ định trong AndroidManifest.xml. Tương tự như vậy, khi nhận được tin nhắn văn bản, ngược lại, phần mềm radio nhận được một số byte, thư viện sở hữu độc quyền gọi lại gọi tới rild và do đó ghi ra các byte vào ổ cắm. Về phía Java, nó đọc từ nó, và giải mã chuỗi các byte, chuyển đổi nó thành văn bản như chúng ta biết, kích hoạt một phát sóng với một thông báo nhận được thông báo. Các Tin nhắn ứng dụng đến lượt nó, đã đăng ký nhận cho phát sóng nói, và gửi một mục đích để thanh thông báo để nói điều gì đó như "Tin nhắn mới nhận được từ + xxxxxx"

các ý đồ được tìm thấy trong frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java

Đó là ý chính về cách hệ thống điện thoại hoạt động, vẻ đẹp thực sự là, nó sử dụng các lệnh modem chung của AT Hayes do đó đơn giản hóa và ẩn các cơ chế sở hữu thực sự.

Đối với những người như Qualcomm, HTC, hãy quên nó khi nghĩ rằng họ sẽ mở thư viện được đề cập vì lớp điện thoại vô tuyến được nhúng trong mạch S-o-C (Hệ thống trên Chip)! Một số thiết bị cầm tay cung cấp khả năng để làm điều đó, flash phần mềm sai (chẳng hạn như không tương thích hoặc không thích hợp cho thiết bị cầm tay), hôn điện thoại tốt -bye và sử dụng nó như một cái nút cửa hoặc trọng lượng giấy! :)

Cần lưu ý rằng không có cơ chế JNI nào có liên quan. Đây là từ sự hiểu biết của tôi về cách nó hoạt động, từ những gì tôi có thể nói là điều này, firmware đài phát thanh được nạp vào một địa chỉ bộ nhớ một nơi nào đó hạt nhân Linux đã dành không gian địa chỉ và không chạm vào nó, một cái gì đó giống như trở lại trong những ngày máy tính cũ khi DOS khởi động, có những địa chỉ dành riêng được BIOS sử dụng, tôi nghĩ, nó tương tự ở đây, các địa chỉ được đánh dấu là đã bị chiếm bởi firmware, trong đó thư viện radio độc quyền nói với nó - và kể từ thư viện đang chạy trong không gian địa chỉ thuộc sở hữu của hạt nhân, một lá thuộc sở hữu của root với quyền root, nó có thể "nói chuyện" với nó, nếu bạn nghĩ sử dụng phương ngữ BASIC cũ của peek và poke, tôi đoán bạn sẽ không ở xa dấu ấn ở đó, bằng cách viết một chuỗi byte nhất định tới địa chỉ đó, phần mềm radio hoạt động trên nó, gần giống như có một bảng vectơ ngắt ... đây là cách đoán nó ở đây như thế nào hoạt động chính xác. :)

+0

vì vậy nếu bạn hoán đổi «rild' cho Osmocom OpenBSC, bạn có điện thoại mở không? –

+0

@JanusTroelsen Điều đó có thể nghi ngờ, tùy thuộc vào chipset phần mềm của đài phát thanh trong điện thoại và có thể có nhiều tính năng cụ thể hơn trong đó một thư viện độc quyền sẽ được yêu cầu để xử lý điều đó. – t0mm13b

+0

Làm thế nào để móc vào lớp mạ vàng mà không cần sử dụng JNI? – gonzobrains

0

Tiếp tục từ giải thích bởi t0mm13b, Khi chúng ta nói về điện thoại thông minh, hãy nghĩ đến 3 thao tác trên lớp với SMS/Cuộc gọi.

RIL (cấp tài khoản) < -> AP < -> CP

AP: Processor Application (. Trong trường hợp hệ điều hành Android của bạn chạy Nghĩ về trò chơi, bài hát, video, máy ảnh vv chạy trên bộ vi xử lý này)

CP: Bộ xử lý di động (Thực tế giao dịch với giao diện Air cho các cuộc gọi/tin nhắn đến/đi, tương tác với Network Tower, vv ..)

Bây giờ hãy nói một số dữ liệu được nhận ở phía CP (Có thể là dữ liệu internet/sms/cuộc gọi). Bây giờ có một số kênh logic giữa AP và CP. Vì vậy, CP sẽ đẩy dữ liệu nhận được đến một kênh tương ứng dựa trên loại dữ liệu. Dữ liệu này sẽ được AP nhận. AP sẽ gửi dữ liệu này về RIL/App. RIL sẽ giải mã dữ liệu này (đặc biệt là dữ liệu cuộc gọi/sms).Dựa trên đó cung cấp thông báo cho người dùng về SMS/Cuộc gọi.

Các vấn đề liên quan