Layanan yang diekspor tidak memerlukan izin: apa artinya?


143

Saya membuat layanan yang terikat oleh aplikasi lain melalui AIDL, dan saya menambahkannya ke manifes sebagai berikut:

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

di mana IService adalah antarmuka AIDL.

Dengan cara ini, Eclipse menunjukkan kepada saya peringatan bahwa layanan yang Diekspor tidak memerlukan izin . Jika saya menghapus intent-filter, peringatan hilang, tetapi jelas aplikasi tidak dapat mengikat ke layanan.

Apa artinya peringatan ini?


31
Ini berarti bahwa aplikasi lain (sewenang-wenang) yang dimiliki pengguna di teleponnya dapat mengikat Anda Servicedan memanggil metode apa pun yang mereka sukai yang diekspos melalui antarmuka AIDL Anda.
Jens

25
buat <permission> baru di AndroidManifest.xml Anda dan gunakan nama itu sebagai android:permissionatribut <service>deklarasi Anda . Atau abaikan saja peringatan - layanan apa yang ingin dilakukan? Jika Anda baik-baik saja dengan menjaga layanan "internal" itu jauh lebih mudah hanya untuk mengatur android:exported="false"pada Anda<service>
Jens

3
Kemudian abaikan peringatan itu atau tambahkan <permission>, gunakan "tanda tangan" jika semuanya adalah aplikasi Anda sendiri yang ditandatangani dengan sertifikat yang sama atau hanya gunakan "normal" jika tidak.
Jens

3
Anda sudah menggunakan sertifikat (rilis) untuk menandatangani aplikasi Anda - perlindungan tanda tangan memeriksa bahwa aplikasi yang meminta izin ditandatangani sama seperti aplikasi yang menetapkan izin.
Jens

2
@Jen Terima kasih ... itu membantu saya .... btw Anda dapat menambahkan komentar Anda sebagai jawaban. Biarkan enzom83 menerimanya.
Vijay C

Jawaban:


128

Saya memiliki masalah yang sama ketika saya memperbarui SDK ke versi 20 . Saya menghapusnya dengan menambahkan android: properti yang dieksporandroid:exported="false" seperti:

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

Lihat dokumen ini


56

Jika Anda ingin membatasi penggunaan aktivitas Anda untuk aplikasi Anda sendiri, maka Anda harus menambahkan exported=falsepernyataan manifes aktivitas Anda.

Jika Anda ingin mengizinkan aplikasi lain untuk menggunakannya (secara eksplisit melalui nama kelasnya atau, lebih baik, dengan menggunakan maksud dengan tipe data atau tindakan) maka Anda memiliki dua pilihan:

  • batasi aplikasi tersebut dengan menggunakan izin
  • izinkan semua aplikasi untuk menggunakannya, maka Anda dapat menambahkan tools:ignore="ExportedActivity"pernyataan manifes aktivitas Anda.

-

Penalaran yang sama berlaku untuk layanan, dengan tools:ignore="ExportedService"dan penyedia konten tools:ignore="ExportedContentProvider".


8
Ini berhasil untuk saya, terima kasih !! Namun, perhatikan bahwa ini perlu menambahkan deklarasi xmlns di bagian atas file manifes:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit

Terima kasih, ini ditambahkan secara otomatis oleh Eclipse. Itu pelengkap yang bagus untuk pengguna IDE lainnya.
Snicolas

Saya menggunakan Eclipse 4.2.1, dan itu tidak menambahkannya, memberikan kesalahan (setidaknya dengan konfigurasi default?). Itu hanya mengatakan:, The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not bounddan tidak ada pilihan yang diberikan untuk memperbaikinya.
Luis A. Florit

Ini akan menambahkannya jika Anda menghapus alat Anda: foo = pernyataan bar, maka ketika ada kesalahan / peringatan, klik kanan dan gunakan perbaikan cepat untuk menambahkan pernyataan alat.
Snicolas

1
Kasing khusus adalah SyncService, yang harus diekspor tetapi Anda hanya ingin sistem menggunakannya. Untuk SyncService atau AuthenticatorService, tambahkan android: permit = "signature"
Entreco

4

Seperti yang dikatakan Jens , "Itu berarti aplikasi lain (sewenang-wenang) yang dimiliki pengguna di teleponnya dapat mengikat ke Layanan Anda dan memanggil metode apa pun yang mereka sukai yang diekspos melalui antarmuka AIDL Anda."

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.