2011-09-05 20 views
5

Tôi có một lớp mở rộng android.os.Handler. Một thể hiện của trình xử lý này được truyền cho hàm tạo của một Messenger. Số IBinder của từ getBinder được chuyển thành kết quả của sự kiện onBind trong dịch vụ của tôi. Các tin nhắn được gửi qua trình kết nối từ các ứng dụng từ xa đi đến phương thức handleMessage của trình xử lý, tuy nhiên, các cuộc gọi đến Binder.getCallingUidBinder.getCallingPid trong phạm vi handleMessage luôn trả về uid và pid của quy trình dịch vụ (chắc chắn không phải là quá trình tương tự như ứng dụng từ xa). handleMessage chắc chắn là một phần của giao dịch IPC, phải không? Vậy tôi đã đi sai ở đâu? Tôi cần điều này để làm việc để xác thực các ứng dụng kết nối.getCallingUid/getCallingPid trả lại giá trị uid và pid hiện tại trong Handler.handleMessage

Xin cảm ơn trước.

Sửa

OK. Tôi có cảm giác kinh khủng này rằng handleMessage không phải là một phần của giao dịch IPC, bởi vì điều đó xảy ra trong các luồng riêng biệt cho AIDL đặt các thông điệp trong hàng đợi cho Messenger. Có cách nào khác để lấy ID người dùng và ID tiến trình của người gọi không?

Trả lời

6

Tạo một lớp tùy chỉnh Handler và ghi đè sendMessageAtTime (đây chỉ là phương pháp gửi bài Overridable trong lớp Handler), và sau đó sử dụng nó để tạo ra một Messenger trở về từ onBind.

Trong phương thức sendMessageAtTime, bạn có thể nhận được pid/uid của ứng dụng gọi từ xa theo số getCallingPidgetCallingUid.

Nhưng, trong IPC sử dụng Messenger, thay vì sử dụng AIDL, getCallingPid sẽ luôn trả về 0 vì tin nhắn gửi bởi ứng dụng từ xa không đồng bộ; giao dịch với IBinder.FLAG_ONEWAY. Do đó, uid là thông tin duy nhất có sẵn.

+0

Cảm ơn rất nhiều! Thật vậy, có vẻ như sendMessageAtTime cung cấp phản hồi chính xác trên getCallingPid – Boy

0

Mã xử lý thư không liên quan đến bất kỳ IPC nào, thay vào đó bạn nên xem mã đang đăng thông báo lên trình xử lý.

+0

Đó không phải là một phần của chính Android? Tôi đang xem xét gói một proxy xung quanh 'Messenger''s' IBinder'.Tôi sẽ xem liệu tôi có thể thêm pid và uid làm phần bổ sung cho gói của thư từ trong 'transact', có thể. – Dylan

+0

Không giống như việc triển khai trình bao bọc đơn giản xung quanh một 'IBinder' là có thể. Có cách nào mà tôi có thể bọc một 'IBinder' trong một phân lớp của' Binder', sau đó? – Dylan

+0

Ok. Tôi nghĩ rằng tôi có thể tạo một lớp bằng cách sử dụng cùng một AIDL hoạt động rất giống với Messenger, nhưng thêm vào pid và uid cho mỗi thư nhận được. Tôi sẽ đăng lại với kết quả. – Dylan

1

Tôi đã đưa ra những gì tôi cảm thấy là một cách khá gọn gàng để sửa lỗi này. Tất cả các tin nhắn đi qua IPC được xây dựng lại từ một bưu kiện bằng cách sử dụng Message.CREATOR.createFromParcel. Vì vậy, tôi đã tạo Lớp Java Dynamic Proxy (mã được kéo thẳng từ docs) phát hiện cuộc gọi đến createFromParcel và thêm id tiến trình và id người dùng làm mục bổ sung trong gói của thư trước khi trả lại kết quả. Thông báo được đảm bảo được tạo trong một giao dịch, xem mã nguồn cho Messenger, vì vậy các ID là chính xác. Sau đó tôi sử dụng sự phản chiếu để thay thế biến cuối cùng tĩnh Message.CREATOR bằng proxy của chính nó. Sau đó, các ID sẽ được rút ra khỏi các tin nhắn bên ngoài các giao dịch khi yêu cầu xác thực.

Cho đến nay, tính năng này hoạt động chính xác như dự định.

Trước đây tôi đã cố gắng tạo phiên bản thay thế Messenger và sử dụng phản chiếu để truy cập IMessenger, nhưng thậm chí Messenger không xử lý Message trước khi giao dịch kết thúc. Proxy là công việc ít hơn rất nhiều và ít bị lỗi liên quan đến việc triển khai các triển khai khác nhau của IMessenger.

+0

Tính năng này không hoạt động trong Android hiện tại. Cũng giống như trong sendMessageAtTime, bạn nhận được UID nhưng không phải là PID. Điều này thực sự không phải là một ý tưởng tốt anyway, vì nó phụ thuộc vào internals hệ thống không có giấy tờ có thể (và dường như đã làm) thay đổi bất cứ lúc nào. –

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