AIDL, AIDL derleyicisine ek bilgi veren ek açıklamaları destekler ek açıklamalı öğeyle ilgili olarak, oluşturulan saplama kodunu da etkiler.
Söz dizimi Java'nın söz dizimine benzer:
@AnnotationName(argument1=value, argument2=value) AidlEntity
Burada, ek açıklamanın adı AnnotationName
, AidlEntity
ise ek açıklamanın adıdır.
interface Foo
, void method()
veya int arg
gibi bir AIDL varlığı.
ek açıklama, kendisinden sonra gelen varlığa eklenir.
Bazı ek açıklamalarda, yukarıda gösterildiği gibi parantez içinde ayarlanan bağımsız değişkenler olabilir. Bağımsız değişkeni olmayan ek açıklamalarda paranteze gerek yoktur. Örnek:
@AnnotationName AidlEntity
Bu ek açıklamalar Java ile aynı değildir ancak birbirlerine çok benziyorlar. Kullanıcılar özel AIDL tanımlayamaz ek açıklamalar; ek açıklamaların tümü önceden tanımlanmıştır. Bazı ek açıklamalar yalnızca diğer arka uçlarda işlem yapmaz. Birbirinden farklı ek kısıtlamalara sahip olması gerekir.
Önceden tanımlanmış AIDL ek açıklamalarının listesi aşağıda verilmiştir:
Ek Açıklamalar | Android sürümüne eklendi |
---|---|
nullable |
7 |
utf8InCpp |
7 |
VintfStability |
11 |
UnsupportedAppUsage |
10 |
Hide |
11 |
Backing |
11 |
NdkOnlyStableParcelable |
14 |
JavaOnlyStableParcelable |
11 |
JavaDerive |
12 |
JavaPassthrough |
12 |
FixedSize |
12 |
Descriptor |
12 |
boş değer atanabilir
nullable
, açıklama eklenen öğenin değerinin sağlanmayabileceğini belirtir.
Bu ek açıklama yalnızca yöntem dönüş türlerine, yöntem parametrelerine, ve ayrıştırılabilir alanları.
interface IFoo {
// method return types
@nullable Data method();
// method parameters
void method2(in @nullable Data d);
}
parcelable Data {
// parcelable fields
@nullable Data d;
}
Ek açıklamalar temel türlere eklenemez. Aşağıdaki bir hatadır.
void method(in @nullable int a); // int is a primitive type
Bu ek açıklama, Java arka ucu için işlemsizdir. Bunun nedeni Java'da
primitif olmayan türler, referansla iletilir. Bu değer null
olabilir.
PBM arka ucunda @nullable T
, Android'de std::unique_ptr<T>
ile eşlenir.
11 veya önceki bir sürüme, Android'de std::optional<T>
sürümüne kadar
12 veya üzeri olmalıdır.
NDK arka ucunda @nullable T
her zaman std::optional<T>
ile eşlenir.
T[]
veya List<T>
gibi liste benzeri bir L
türü için @nullable L
,
std::optional<std::vector<std::optional<T>>>
(veya
PBM arka ucu durumunda std::unique_ptr<std::vector<std::unique_ptr<T>>>
.
Bu eşlemenin bir istisnası vardır. T
olduğunda
IBinder
veya bir AIDL arayüzü, @nullable
işlemsiz. Başka bir deyişle, hem
@nullable IBinder
ve IBinder
, android::sp<IBinder>
ile eşit olarak eşlenir. Bu,
Güçlü bir işaretçi olduğu için zaten null olabilir (PBM hâlâ
null değeri zorunlu kıl, ancak tür yine de android::sp<IBinder>
.)
@nullable(heap=true)
, Android 13'ten itibaren şunun için kullanılabilir:
ayrıştırılabilir alanları kullanarak özyinelemeli türleri modelleyebilir. @nullable(heap=true)
kullanılamıyor
yöntemini kullanın. Not eklendiğinde, alan
PBM/NDK'da yığınla ayrılmış bir std::unique_ptr<T>
referansına eşlenir.
arka uçlar. @nullable(heap=true)
, Java arka ucunda işlemsizdir.
utf8InCpp
utf8InCpp
, String
öğesinin PBM için UTF8 biçiminde temsil edildiğini bildirir
arka uçta olması gerekir. Adından da anlaşılacağı gibi, ek açıklama diğer arka uçlar için bir işlem değildir.
Özellikle String
, Java arka ucunda her zaman UTF16 ve NDK'da UTF8'dir
arka uçta olması gerekir.
Bu ek açıklama, String
türünün kullanılabildiği her yere eklenebilir.
dahil olmak üzere, dönüş değerleri, parametreler, sabit bildirimler ve ayrıştırılabilir
alanları.
PBM arka ucu için AIDL'deki @utf8InCpp String
, std::string
ile eşleşirken
Ek açıklama içermeyen String
, UTF16'nın kullanıldığı android::String16
ile eşleşir.
utf8InCpp
ek açıklamasının varlığının, çalışma şeklini değiştirmediğini unutmayın.
dizeler kablo üzerinden iletilir. Dizeler her zaman UTF16 olarak aktarılır
işe yarıyor. utf8InCpp
ek açıklamalı bir dizesi,
işleyeceğiz. Alınan dizeler UTF16'dan UTF8'e dönüştürülür.
utf8InCpp
olarak notlandırıldı.
Eski İstikrar
VintfStability
, kullanıcı tanımlı bir türün (arayüz, ayrıştırılabilir,
ve enum) sistem ve tedarikçi alanlarında kullanılabilir. Görüntüleyin
HAL'ler için AIDL:
birlikte çalışabilirliği sağlayabilirsiniz.
Ek açıklama, türün imzasını değiştirmez ancak belirtildiğinde türün örneği, seyahat edebilmesi için sabit olarak işaretlenir hem de tedarikçiyle ve sistemle alakalı bilgiler içerebilir.
Ek açıklama, yalnızca gösterildiği gibi kullanıcı tanımlı tür bildirimlerine eklenebilir buradan inceleyebilirsiniz:
@VintfStability
interface IFoo {
....
}
@VintfStability
parcelable Data {
....
}
@VintfStability
enum Type {
....
}
Bir türe VintfStability
ek açıklaması yapıldığında,
aynı zamanda bu şekilde ek açıklama da eklenmelidir. Sonraki
örneğin, Data
ve IBar
için VintfStability
ek açıklaması verilmelidir.
@VintfStability
interface IFoo {
void doSomething(in IBar b); // references IBar
void doAnother(in Data d); // references Data
}
@VintfStability // required
interface IBar {...}
@VintfStability // required
parcelable Data {...}
Ayrıca, VintfStability
ile açıklama eklenen türleri tanımlayan AIDL dosyaları
yalnızca aidl_interface
Mostg modül türü kullanılarak oluşturulabilir.
stability
özelliği "vintf"
olarak ayarlandı.
aidl_interface {
name: "my_interface",
srcs: [...],
stability: "vintf",
}
DesteklenmeyenUygulama Kullanımı
UnsupportedAppUsage
ek açıklaması, açıklama eklenen AIDL türünün
kullanıma sunulan SDK dışı arayüzün bir parçasıdır.
SDK dışı kısıtlamalara göz atın
arayüzler
bakın.
UnsupportedAppUsage
ek açıklaması,
oluşturulmuş kod. Ek açıklama, oluşturulan Java sınıfına yalnızca
Aynı ada sahip Java ek açıklaması.
// in AIDL
@UnsupportedAppUsage
interface IFoo {...}
// in Java
@android.compat.annotation.UnsupportedAppUsage
public interface IFoo {...}
Bu, Java dışı arka uçlar için işlemsiz bir uygulamadır.
Destekleniyor
Backing
ek açıklaması, bir AIDL enum türünün depolama türünü belirtir.
@Backing(type="int")
enum Color { RED, BLUE, }
Bu, PBM arka ucunda int32_t
türünde bir C++ sıralama sınıfı yayar.
enum class Color : int32_t {
RED = 0,
BLUE = 1,
}
Ek açıklama çıkarılırsa type
öğesinin byte
olduğu varsayılır ve bu,
PBM arka ucu için int8_t
olarak ayarlanır.
type
bağımsız değişkeni yalnızca aşağıdaki integral türlerine ayarlanabilir:
byte
(8 bit genişlik)int
(32 bit genişlik)long
(64 bit genişlik)
NdkOnlyStableParcelable
NdkOnlyStableParcelable
, paketlenebilir beyanı işaret ediyor (tanım değil)
diğer kararlı AIDL türlerinden referans alınabilmesi için kararlı olarak çalışır. Bu
JavaOnlyStableParcelable
gibidir, ancak
NdkOnlyStableParcelable
, paketlenebilir beyanı NDK için sabit olarak işaretler
arka uç sağlar.
Bu ayrıştırılabilir öğeyi kullanmak için:
ndk_header
belirtmelisiniz.- Ayrıştırılabilir öğeyi belirten bir NDK kitaplığınızın olması ve kitaplığın
olacak şekilde derlenebilir. Örneğin, bir sanal makinedeki çekirdek derleme sisteminde
cc_*
modülünü,static_libs
veyashared_libs
kullanın.aidl_interface
için,Android.bp
konumundaadditional_shared_libraries
altındaki kitaplık.
JavaOnlyStableParcelable
JavaOnlyStableParcelable
, paketlenebilir beyanı işaret ediyor (tanım değil)
diğer kararlı AIDL türlerinden referans alınabilmesi için kararlı olarak çalışır.
Kararlı AIDL, kullanıcı tanımlı tüm türlerin kararlı olmasını gerektirir. Örneğin, olması için, bu kriterlere uygun kriterlere ve mevcut AIDL kaynak dosyası.
parcelable Data { // Data is a structured parcelable.
int x;
int y;
}
parcelable AnotherData { // AnotherData is also a structured parcelable
Data d; // OK, because Data is a structured parcelable
}
Parseller yapılandırılmamışsa (veya sadece beyan edilmişse) yapılamaz. referans alın.
parcelable Data; // Data is NOT a structured parcelable
parcelable AnotherData {
Data d; // Error
}
JavaOnlyStableParcelable
, ayrıştırılabilir öğe olduğunda kontrolü geçersiz kılmanıza olanak tanır.
Android SDK'sının bir parçası olarak güvenli bir şekilde kullanılabiliyor.
@JavaOnlyStableParcelable
parcelable Data;
parcelable AnotherData {
Data d; // OK
}
JavaDerive
JavaDerive
,
Java arka ucu.
@JavaDerive(equals = true, toString = true)
parcelable Data {
int number;
String str;
}
Bu ek açıklama, gösterilecek öğeleri kontrol etmek için ek parametrelere üretir. Desteklenen parametreler şunlardır:
equals=true
,equals
vehashCode
yöntemleri oluşturur.toString=true
, türün adını yazdırantoString
yöntemi oluşturur birlikte çalışır. Örnek:Data{number: 42, str: foo}
JavaVarsayılan
Android 13'te eklenen JavaDefault
, şunları kontrol eder:
varsayılan uygulama sürüm oluşturma desteği oluşturulur (
setDefaultImpl
) tıklayın. Bu destek, yıl sonuna kadar
tasarruf edin.
JavaGeçişi
JavaPassthrough
, oluşturulan Java API'ye rastgele bir ek açıklama eklenmesine olanak tanır
Java ek açıklaması.
AIDL'de aşağıdaki ek açıklamalar
@JavaPassthrough(annotation="@android.annotation.Alice")
@JavaPassthrough(annotation="@com.android.Alice(arg=com.android.Alice.Value.A)")
haline gelmek
@android.annotation.Alice
@com.android.Alice(arg=com.android.Alice.Value.A)
kodu yer alır.
annotation
parametresinin değeri doğrudan yayınlanır. AIDL
derleyici, parametrenin değerine bakmaz. Varsa
Java düzeyinde söz dizimi hatası; AIDL derleyicisi tarafından değil,
Java derleyicisi.
Bu ek açıklama, herhangi bir AIDL varlığına eklenebilir. Bu ek açıklama, işlemsiz arka uçları için daha iyi bir çözümdür.
Sabit Boyut
FixedSize
, yapılandırılmış bir ayrıştırılabilir öğeyi sabit boyut olarak işaretler. İşaretlendikten sonra,
ayrıştırılabilir öğe içine yeni alan eklenmesine izin verilmez. Tüm alanları
ayrıştırılabilir öğe ayrıca, ilkel türler dahil olmak üzere sabit boyutlu türler olmalıdır.
enum'lar, sabit boyutlu diziler ve FixedSize
ile işaretlenen diğer ayrıştırıcılar.
Bu, farklı bölümler için herhangi bir garanti vermez ve karma bitlikte iletişimde temel alınır.
Açıklayıcı
Descriptor
, bir arayüzün arayüz tanımlayıcısını zorla belirtir.
package android.foo;
@Descriptor(value="android.bar.IWorld")
interface IHello {...}
Bu arayüzün tanımlayıcısı android.bar.IWorld
şeklindedir. Öğe
Descriptor
ek açıklaması eksik; açıklayıcı
android.foo.IHello
.
Bu, yayınlanmış bir arayüzü yeniden adlandırırken işinize yarayacaktır. Proje yönetiminin arayüzün tanımlayıcısıyla aynı şekilde, yeniden adlandırılan arayüzün tanımlayıcısı İki arayüzün birbiriyle iletişim kurmasına izin vermeden önce.
@yorumlarda gizle
AIDL derleyicisi, yorumlarda @hide
öğesini tanır ve iletir
metalava için Java çıktısını verir. Bu yorum, Android'in
derleme sistemi AIDL API'lerinin SDK API'leri olmadığını bilir.
@yorumlarda kullanımdan kaldırıldı
AIDL derleyicisi, yorumlardaki @deprecated
öğesini bir etiket olarak tanır ve
Artık kullanılmaması gereken AIDL varlığı.
interface IFoo {
/** @deprecated use bar() instead */
void foo();
void bar();
}
Her arka uç, desteği sonlandırılmış varlıkları arka uca özel bir ek açıklamayla veya
özelliğini kullanmanız gerekir. Böylece, istemcinin kodu kullanımdan kaldırılan
varlıklarından oluşur. Örneğin, @Deprecated
ek açıklaması ve @deprecated
etiketi, Java tarafından oluşturulan koda eklenir.