Dịch vụ xuất khẩu không cần sự cho phép: có nghĩa là gì?


143

Tôi đã tạo một dịch vụ bị ràng buộc bởi các ứng dụng khác thông qua AIDL và tôi thêm nó vào bảng kê khai như sau:

<service android:name=".MyService">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

trong đó IService là giao diện AIDL.

Theo cách này, Eclipse cho tôi thấy cảnh báo Dịch vụ đã xuất không yêu cầu sự cho phép . Nếu tôi xóa intent-filter, cảnh báo sẽ biến mất, nhưng rõ ràng các ứng dụng không thể liên kết với dịch vụ.

Cảnh báo này có ý nghĩa gì?


31
Điều đó có nghĩa là các ứng dụng (tùy ý) khác mà người dùng có trên điện thoại của mình có thể liên kết với bạn Servicevà gọi bất kỳ phương thức nào họ muốn được hiển thị thông qua giao diện AIDL của bạn.
Jens

25
tạo một <allow> mới trong AndroidManifest.xml của bạn và sử dụng tên của nó làm android:permissionthuộc tính <service>khai báo của bạn . Hoặc chỉ cần bỏ qua cảnh báo - dịch vụ dự định làm là gì? Nếu bạn ổn với việc giữ cho dịch vụ "bên trong" thì việc cài đặt android:exported="false"trên của bạn sẽ dễ dàng hơn nhiều<service>
Jens

3
Sau đó, bỏ qua cảnh báo hoặc thêm <quyền>, sử dụng "chữ ký" nếu tất cả các ứng dụng của riêng bạn được ký cùng một chứng chỉ hoặc chỉ đi với "bình thường" nếu không.
Jens

3
Bạn đã sử dụng chứng chỉ (phát hành) để ký các ứng dụng của mình - bảo vệ chữ ký kiểm tra xem ứng dụng yêu cầu quyền có cùng chữ ký với ứng dụng xác định quyền hay không.
Jens

2
@Jens Cảm ơn ... nó đã giúp tôi .... btw bạn có thể thêm ý kiến ​​của mình làm câu trả lời. Hãy để enzom83 chấp nhận nó.
Vijay C

Câu trả lời:


128

Tôi gặp vấn đề tương tự khi tôi cập nhật SDK lên phiên bản 20 . Tôi đã gỡ bỏ nó bằng cách thêm android: xuất tài sản android:exported="false"như vậy:

<service android:name=".MyService"
    android:exported="false">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

Xem tài liệu này


56

Nếu bạn muốn hạn chế sử dụng hoạt động của mình vào ứng dụng của riêng bạn, thì bạn nên thêm exported=falsevào tuyên bố về hoạt động của mình.

Nếu bạn muốn cho phép các ứng dụng khác sử dụng nó (rõ ràng thông qua tên lớp hoặc tốt hơn là bằng cách sử dụng ý định với kiểu dữ liệu hoặc hành động) thì bạn có hai lựa chọn:

  • hạn chế các ứng dụng đó bằng cách sử dụng sự cho phép
  • cho phép tất cả các ứng dụng sử dụng nó, sau đó bạn có thể thêm tools:ignore="ExportedActivity"vào tuyên bố bảng kê khai hoạt động của mình.

-

Lý do tương tự áp dụng cho một dịch vụ, với tools:ignore="ExportedService"và nhà cung cấp nội dung với tools:ignore="ExportedContentProvider".


8
Điều này làm việc cho tôi, cảm ơn !! Tuy nhiên, lưu ý rằng điều này đòi hỏi phải thêm một khai báo xmlns ở đầu tệp kê khai:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit

Cảm ơn, nó được thêm tự động bởi Eclipse. Đó là một bổ sung tốt cho người dùng IDE khác.
Snicolas

Tôi sử dụng Eclipse 4.2.1 và nó không thêm nó, gây ra lỗi (ít nhất là với cấu hình mặc định?). Nó chỉ nói: The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not boundvà không có lựa chọn nào được đưa ra để sửa lỗi này.
Luis A. Florit

Nó sẽ thêm nó nếu bạn loại bỏ các công cụ của mình: foo = bar statement, sau đó khi có lỗi / cảnh báo, nhấp chuột phải và sử dụng một sửa chữa nhanh để thêm câu lệnh công cụ.
Snicolas

1
Trường hợp đặc biệt là SyncService, sẽ được xuất nhưng bạn chỉ muốn hệ thống sử dụng nó. Đối với SyncService hoặc AuthenticatorService, hãy thêm android: allow = "chữ ký"
Entreco

4

Như Jens đã nói, "Điều đó có nghĩa là các ứng dụng (tùy ý) khác mà người dùng có trên điện thoại của anh ta có thể liên kết với Dịch vụ của bạn và gọi bất kỳ phương thức nào họ muốn được hiển thị qua giao diện AIDL của bạn."

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.