AIDL, AIDL derleyicisine ek açıklamalı öğe hakkında ek bilgi veren ve oluşturulan taslak kodu da etkileyen ek açıklamaları destekler.
Söz dizimi Java'ya benzer:
@AnnotationName(argument1=value, argument2=value) AidlEntity
Burada AnnotationName
ek açıklamanın adı, AidlEntity
ise interface Foo
, void method()
veya int arg
gibi bir AIDL öğesidir. Bunu takip eden öğeye bir ek açıklama eklenir.
Bazı ek açıklamalarda, yukarıda gösterildiği gibi parantez içinde argümanlar bulunabilir. Bağımsız değişkeni olmayan ek açıklamalarda parantez gerekmez. Örnek:
@AnnotationName AidlEntity
Bu ek açıklamalar, Java ek açıklamalarıyla çok benzer görünse de aynı değildir. Kullanıcılar özel AIDL ek açıklamaları tanımlayamaz. Ek açıklamaların tümü önceden tanımlanmıştır. Bazı ek açıklamalar yalnızca belirli bir arka uçta etkilidir ve diğer arka uçlarda işlem yapmaz. Bu öğelerin eklenebileceği yerlerle ilgili farklı kısıtlamalar vardır.
Ö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 paketlenebilir alanlara eklenebilir.
interface IFoo {
// method return types
@nullable Data method();
// method parameters
void method2(in @nullable Data d);
}
parcelable Data {
// parcelable fields
@nullable Data d;
}
Notlar ilkel türlere eklenemez. Aşağıdaki hata oluştu.
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 ilkel olmayan tüm türlerin referansla iletilmesidir. Bu referans null
olabilir.
CPP arka ucunda @nullable T
, Android 11 veya daha eski sürümlerde std::unique_ptr<T>
, Android 12 veya daha yeni sürümlerde ise std::optional<T>
ile eşlenir.
NDK arka ucunda @nullable T
her zaman std::optional<T>
ile eşlenir.
Rust arka ucunda @nullable T
her zaman Option<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>>>
ile eşlenir (veya Android 11 veya önceki sürümler için PBM arka ucu durumunda std::unique_ptr<std::vector<std::unique_ptr<T>>>
ile eşlenir).
Bu eşlemenin bir istisnası vardır. T
IBinder
veya bir AIDL arayüzü olduğunda @nullable
, Rust hariç tüm arka uçlarda işlem yapmaz. Diğer bir deyişle, hem @nullable IBinder
hem de IBinder
, güçlü bir işaretçi olduğu için zaten boş olan android::sp<IBinder>
ile eşittir (PBM okumaları yine de nulllanabilirliği zorunlu kılar, ancak tür yine de android::sp<IBinder>
'dir). Rust'ta, bu türler yalnızca @nullable
ek açıklaması olduğunda nullable
olur. Açıklama eklenmişse Option<T>
ile eşlenir.
Android 13'ten itibaren @nullable(heap=true)
, yinelemeli türleri modellemek amacıyla ayrıştırılabilir alanlar için kullanılabilir. @nullable(heap=true)
, yöntem parametreleri veya döndürülen türlerle kullanılamaz. Bu notla ek açıklama eklendiğinde alan, CPP/NDK arka uçlarında yığına ayrılmış bir referans std::unique_ptr<T>
ile eşlenir. @nullable(heap=true)
, Java arka ucunda işlem yapmaz.
utf8InCpp
utf8InCpp
, String
değerinin CPP arka ucu için UTF8 biçiminde temsil edildiğini belirtir. Adından da anlaşılacağı gibi, ek açıklama diğer arka uçlarda işlem yapmaz.
Daha açık belirtmek gerekirse String
, Java arka ucunda her zaman UTF16, NDK arka ucunda ise UTF8 olur.
Bu ek açıklama, döndürülen değerler, parametreler, sabit bildirimler ve ayrıştırılabilir alanlar dahil olmak üzere String
türünün kullanılabildiği her yere eklenebilir.
CPP arka ucu için AIDL'deki @utf8InCpp String
, std::string
ile eşlenir. Not olmadan String
ise UTF16'nın kullanıldığı android::String16
ile eşlenir.
utf8InCpp
ek açıklamasının varlığının, dizelerin kablo üzerinden iletilme şeklini değiştirmediğini unutmayın. Dizeler her zaman kablo üzerinden UTF16 olarak iletilir. utf8InCpp
ek açıklamalı dize, iletilmeden önce UTF16'ya dönüştürülür. Alınan bir dize, utf8InCpp
olarak ek açıklama eklenmişse UTF16'dan UTF8'e dönüştürülür.
VintfStability
VintfStability
, kullanıcı tanımlı bir türün (arayüz, paketlenebilir ve enum) sistem ve tedarikçi alan adlarında kullanılabileceğini belirtir. Sistem satıcısı birlikte çalışabilirliği hakkında daha fazla bilgi için HAL'ler için AIDL başlıklı makaleyi inceleyin.
Ek açıklama türün imzasını değiştirmez ancak türün ayarlandığı zaman, tedarikçi ve sistem işlemleri arasında gezinebilmesi için türün örneği sabit olarak işaretlenir.
Ek açıklama, yalnızca burada gösterildiği gibi kullanıcı tanımlı tür beyanlarına eklenebilir:
@VintfStability
interface IFoo {
....
}
@VintfStability
parcelable Data {
....
}
@VintfStability
enum Type {
....
}
Bir tür VintfStability
ile ek açıklamayla belirtildiğinde, türde referans verilen diğer türler de aynı şekilde ek açıklamayla belirtilmelidir. Aşağıdaki örnekte, hem Data
hem de IBar
, VintfStability
ile ek açıklamaya tabi tutulmalıdır.
@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 ek açıklama eklenmiş türleri tanımlayan AIDL dosyaları yalnızca stability
özelliği "vintf"
olarak ayarlanmış aidl_interface
Soong modülü türü kullanılarak derlenebilir.
aidl_interface {
name: "my_interface",
srcs: [...],
stability: "vintf",
}
UnsupportedAppUsage
UnsupportedAppUsage
ek açıklaması, ek açıklamalı AIDL türünün, eski uygulamaların erişilebilir olduğu SDK dışı arayüzün bir parçası olduğunu belirtir.
Gizli API'ler hakkında daha fazla bilgi için SDK dışı arayüzlerle ilgili kısıtlamalar bölümüne bakın.
UnsupportedAppUsage
ek açıklaması, oluşturulan kodun davranışını etkilemez. Ek açıklama, oluşturulan Java sınıfına yalnızca aynı ada sahip Java ek açıklamasıyla ek açıklama ekler.
// in AIDL
@UnsupportedAppUsage
interface IFoo {...}
// in Java
@android.compat.annotation.UnsupportedAppUsage
public interface IFoo {...}
Bu, Java olmayan arka uçlarda işlem yapılmaz.
Destek
Backing
ek açıklaması, bir AIDL enum türünün depolama alanını belirtir.
@Backing(type="int")
enum Color { RED, BLUE, }
Bu, CPP arka ucunda int32_t
türüne sahip bir C++ enum sınıfı oluşturur.
enum class Color : int32_t {
RED = 0,
BLUE = 1,
}
Ek açıklama atlanırsa type
değerinin byte
olduğu varsayılır. byte
, CPP arka ucu için int8_t
ile eşlenir.
type
bağımsız değişkeni yalnızca aşağıdaki tam sayı türlerine ayarlanabilir:
byte
(8 bit genişliğinde)int
(32 bit genişliğinde)long
(64 bit genişlik)
NdkOnlyStableParcelable
NdkOnlyStableParcelable
, diğer kararlı AIDL türlerinden referans verilebilmesi için ayrıştırılabilir bir beyanı (tanım değil) stabil olarak işaretler. Bu, JavaOnlyStableParcelable
ile benzerdir ancak NdkOnlyStableParcelable
, paketlenebilir bir beyanı Java yerine NDK arka ucu için kararlı olarak işaretler.
Bu paketi kullanmak için:
ndk_header
değerini belirtmeniz gerekir.- Paketlenebilir öğeyi belirten bir NDK kitaplığınız olmalıdır ve kitaplık kitaplığa derlenmelidir. Örneğin,
cc_*
modülündeki temel derleme sistemindestatic_libs
veyashared_libs
kullanın.aidl_interface
için kitaplığıAndroid.bp
'dekiadditional_shared_libraries
altına ekleyin.
JavaOnlyStableParcelable
JavaOnlyStableParcelable
, paketlenebilir bir tanımı (tanım değil) diğer sabit AIDL türlerinden referans alınabilmesi için sabit olarak işaretler.
Kararlı AIDL, kullanıcı tanımlı tüm türlerin kararlı olmasını gerektirir. Paketlenebilirlerin kararlı olması için alanlarının AIDL kaynak dosyasında açıkça tanımlanması gerekir.
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 yeni belirtilmişse) referans verilemez.
parcelable Data; // Data is NOT a structured parcelable
parcelable AnotherData {
Data d; // Error
}
JavaOnlyStableParcelable
, referans verdiğiniz parcelable Android SDK'sının bir parçası olarak zaten güvenli bir şekilde kullanılabilir durumda olduğunda kontrolü geçersiz kılmanıza olanak tanır.
@JavaOnlyStableParcelable
parcelable Data;
parcelable AnotherData {
Data d; // OK
}
JavaDerive
JavaDerive
, Java arka ucundaki ayrıştırılabilir türler için otomatik olarak yöntemler oluşturur.
@JavaDerive(equals = true, toString = true)
parcelable Data {
int number;
String str;
}
Ek açıklama, nelerin oluşturulacağını kontrol etmek için ek parametreler gerektirir. Desteklenen parametreler şunlardır:
equals=true
,equals
vehashCode
yöntemleri oluşturur.toString=true
, türün ve alanların adını yazdırantoString
yöntemini oluşturur. Örneğin:Data{number: 42, str: foo}
JavaDefault
Android 13'e eklenen JavaDefault
, varsayılan uygulama sürümlendirme desteğinin oluşturulup oluşturulmayacağını kontrol eder (setDefaultImpl
için). Bu destek, artık yer kazanmak amacıyla varsayılan olarak oluşturulmaz.
JavaPassthrough
JavaPassthrough
, oluşturulan Java API'ye rastgele bir Java ek açıklamasıyla ek açıklama eklenmesini sağlar.
AIDL'deki aşağıdaki ek açıklamalar
@JavaPassthrough(annotation="@android.annotation.Alice")
@JavaPassthrough(annotation="@com.android.Alice(arg=com.android.Alice.Value.A)")
become
@android.annotation.Alice
@com.android.Alice(arg=com.android.Alice.Value.A)
oluşturulan Java kodunda.
annotation
parametresinin değeri doğrudan yayınlanır. AIDL derleyicisi, parametrenin değerine bakmaz. Java düzeyinde bir söz dizimi hatası varsa bu hata AIDL derleyicisi tarafından değil, Java derleyicisi tarafından yakalanır.
Bu ek açıklama, herhangi bir AIDL varlığına eklenebilir. Bu ek açıklama, Java olmayan arka uçlarda işlem yapmaz.
Sabit Boyut
FixedSize
, yapılandırılmış bir ayrıştırılabilir öğeyi sabit boyut olarak işaretler. İşaretlenen parçalı alana yeni alan eklenmesine izin verilmez. Paketlenebilir öğenin tüm alanları da temel türler, enum'ler, sabit boyutlu diziler ve FixedSize
ile işaretlenmiş diğer paketlenebilir öğeler dahil olmak üzere sabit boyutlu türler olmalıdır.
Bu, farklı bitliklerde herhangi bir garanti sağlamaz ve karma bitlik iletişimi için güvenilmemelidir.
Tanımlayı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. Descriptor
ek açıklaması yoksa açıklayıcı android.foo.IHello
olur.
Bu işlem, yayınlanmış bir arayüzü yeniden adlandırırken işinize yarayacaktır. Yeniden adlandırılan arayüzün tanımlayıcısını, yeniden adlandırmadan önceki arayüzün tanımlayıcısıyla aynı hale getirmek, iki arayüzün birbiriyle iletişim kurmasına olanak tanır.
@hide in comments
AIDL derleyicisi, yorumlardaki @hide
öğesini tanır ve metalava'nın alabilmesi için Java çıkışına iletir. Bu yorum, Android derleme sisteminin AIDL API'lerinin SDK API'si olmadığını bilmesini sağlar.
Yorumlarda @deprecated
AIDL derleyicisi, artık kullanılmaması gereken bir AIDL varlığını tanımlamak için yorumlarda @deprecated
öğesini etiket olarak tanır.
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çıklama veya özellikle işaretler. Böylece, kullanımdan kaldırılan varlıklara işaret etmesi halinde istemci kodu uyarılır. Örneğin, @Deprecated
ek açıklaması ve @deprecated
etiketi, oluşturulan Java koduna eklenir.