บริการที่ส่งออกไม่ต้องการการอนุญาต: หมายความว่าอย่างไร


143

ฉันสร้างบริการที่ถูกผูกไว้โดยแอปพลิเคชันอื่นผ่าน AIDL และฉันเพิ่มลงในรายการดังต่อไปนี้:

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

โดยที่ IService เป็นอินเตอร์เฟส AIDL

วิธีนี้ทำให้เกิดคราสแสดงให้ฉันเตือนบริการส่งออกไม่จำเป็นต้องได้รับอนุญาต หากฉันลบintent-filterคำเตือนจะหายไป แต่แน่นอนว่าแอปพลิเคชันไม่สามารถผูกกับบริการได้

คำเตือนนี้หมายความว่าอย่างไร


31
หมายความว่าแอปพลิเคชั่นอื่น ๆ (โดยพลการ) ที่ผู้ใช้มีบนโทรศัพท์ของเขาสามารถผูกเข้ากับคุณServiceและเรียกใช้วิธีการใดก็ได้ที่พวกเขาพอใจที่เปิดเผยผ่านอินเทอร์เฟซ AIDL ของคุณ
เจนส์

25
สร้าง<permission> ใหม่ใน AndroidManifest.xml ของคุณและใช้ชื่อนั้นเป็นandroid:permissionคุณสมบัติของ<service>การประกาศของคุณ หรือเพียงเพิกเฉยต่อคำเตือน - บริการนี้ตั้งใจทำอะไร หากคุณพอใจกับการให้บริการ "ภายใน" มันง่ายมากที่จะตั้งค่าandroid:exported="false"บนของคุณ<service>
Jens

3
จากนั้นเพิกเฉยต่อคำเตือนหรือเพิ่ม <permission> ให้ใช้ "ลายเซ็น" หากเป็นแอปพลิเคชันของคุณทั้งหมดที่ลงชื่อด้วยใบรับรองเดียวกันหรือไปกับ "ปกติ"
เจนส์

3
คุณกำลังใช้ใบรับรอง (รุ่น) เพื่อลงชื่อในแอปพลิเคชันของคุณ - การป้องกันลายเซ็นต์จะตรวจสอบว่าแอปพลิเคชันที่ขออนุญาตนั้นมีการลงนามเหมือนกันกับแอปพลิเคชันที่กำหนดสิทธิ์
Jens

2
@Jens ขอบคุณ ... มันช่วยฉันได้ .... btw คุณสามารถเพิ่มความคิดเห็นของคุณเป็นคำตอบได้ ให้ enzom83 ยอมรับมัน
วีเจย์ C

คำตอบ:


128

ฉันมีปัญหาเดียวกันเมื่อฉันSDK เวอร์ชั่นล่าสุดกับรุ่น20 ฉันลบมันโดยเพิ่มandroid:คุณสมบัติที่ ส่งออกandroid:exported="false"เช่นนั้น:

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

ดูเอกสารนี้


56

หากคุณต้องการ จำกัด การใช้กิจกรรมให้กับแอปพลิเคชันของคุณเองคุณควรเพิ่ม exported=falseคำสั่งรายการกิจกรรมของคุณ

หากคุณต้องการอนุญาตให้แอปพลิเคชันอื่นใช้งานได้ (อย่างชัดเจนผ่านชื่อคลาสหรือดีกว่าโดยใช้เจตนากับประเภทข้อมูลหรือการกระทำ) จากนั้นคุณมีสองทางเลือก:

  • จำกัด แอปพลิเคชันเหล่านั้นโดยใช้การอนุญาต
  • อนุญาตให้แอปพลิเคชันทั้งหมดใช้งานจากนั้นคุณสามารถเพิ่มลงtools:ignore="ExportedActivity"ในรายการคำสั่งรายการกิจกรรมของคุณ

-

reasonning เช่นเดียวกับการให้บริการที่มีและผู้ให้บริการเนื้อหาที่มีtools:ignore="ExportedService"tools:ignore="ExportedContentProvider"


8
สิ่งนี้ใช้ได้สำหรับฉันขอบคุณ !! แต่แจ้งให้ทราบว่าเรื่องนี้จะต้องเพิ่มการประกาศ xmlns ที่ด้านบนของไฟล์ Manifest นี้:xmlns:tools="http://schemas.android.com/tools"
หลุยส์เอ Florit

ขอขอบคุณมันเพิ่มโดยอัตโนมัติโดย Eclipse เป็นส่วนเสริมที่ดีสำหรับผู้ใช้ IDE รายอื่น
Snicolas

ฉันใช้ Eclipse 4.2.1 และมันไม่ได้เพิ่มทำให้เกิดข้อผิดพลาด (อย่างน้อยกับการกำหนดค่าเริ่มต้น?) มันเพิ่งพูดว่า: The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not boundและไม่มีตัวเลือกใด ๆ สำหรับการแก้ไขปัญหานี้
Luis A. Florit

มันจะเพิ่มมันถ้าคุณลบเครื่องมือของคุณ: คำสั่ง foo = bar จากนั้นเมื่อมีข้อผิดพลาด / คำเตือนคลิกขวาและใช้การแก้ไขอย่างรวดเร็วเพื่อเพิ่มคำสั่งเครื่องมือ
Snicolas

1
กรณีพิเศษคือ SyncService ซึ่งควรส่งออก แต่คุณต้องการให้ระบบใช้งานเท่านั้น สำหรับ SyncService หรือ AuthenticatorService เพิ่ม android: permission = "signature"
Entreco

4

ดังที่Jensกล่าวว่า "หมายความว่าแอปพลิเคชั่นอื่น ๆ (โดยพลการ) ที่ผู้ใช้มีในโทรศัพท์ของเขาสามารถผูกกับบริการของคุณและเรียกใช้วิธีการใดก็ได้ที่พวกเขาต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.